天道酬勤,学无止境

Rmpi、OpenCPU 和 Apparmor:拒绝对“/”的请求(Rmpi, OpenCPU, and Apparmor: DENIED request for "/")

问题

我有一个 R 包,它向我通过 Rmpi​​ 包运行的 OpenMPI 集群发送作业。 在从控制台运行的 R 会话中,一切都按预期工作。 但是,当我尝试像这样从我的 OpenCPU 服务器执行相关功能时(细节已更改以保护无辜者):

curl -XPOST http://99.999.999.99/ocpu/library/MyPackage/R/my_cluster_function

我收到此错误:

R call failed: process died.

(包中的其他非集群调用函数通过 OpenCPU 按预期工作)。 我注意到在/var/log/kern.log ,apparmor DENIED了各种请求,并且通过向/etc/apparmor.d/opencpu.d/custom添加条目以允许 OpenMPI访问它需要的文件。 但是,我无法解决与位置"/" “打开”请求相关的这两个问题(同样,IP 地址已更改):

Oct 26 03:49:58 99.999.999.99 kernel: [142952.551234] type=1400 audit(1414295398.849:957): apparmor="DENIED" operation="open" profile="opencpu-main" name="/" pid=22486 comm="orted" requested_mask="r" denied_mask="r" fsuid=33 ouid=0
Oct 26 03:49:58 99.999.999.99 kernel: [142952.556422] type=1400 audit(1414295398.857:958): apparmor="DENIED" operation="open" profile="opencpu-main" name="/" pid=22485 comm="apache2" requested_mask="r" denied_mask="r" fsuid=33 ouid=0

将此添加到我的 apparmor 规则没有帮助:

/* r,

两个问题:

  1. 为什么 opencpu 试图从我的根级目录中读取(或者这是否意味着其他)?
  2. 更紧迫的是,我该如何解决这个 apparmor 问题?

谢谢。

回答1

您可能需要添加两个 apparmor 规则

/ r,
/* r,

第一条规则允许/目录列表,第二条规则允许对/下的任何文件进行读取访问。

我不明白为什么Rmpi想要读取/或者为什么你得到process died错误而不是访问被拒绝。 您确定问题已完全解决?

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Rmpi, OpenCPU, and Apparmor: DENIED request for "/"
    I have an R package that sends out a job to the OpenMPI cluster I have running by means of the Rmpi package. All works as expected within an R session run from the console. However, when I try to execute the relevant function with from my OpenCPU server like this (details changed to protect the innocent): curl -XPOST http://99.999.999.99/ocpu/library/MyPackage/R/my_cluster_function I get this error: R call failed: process died. (Other, non-cluster calling functions within the package work as expected via OpenCPU). I noticed in /var/log/kern.log a variety of requests being DENIED by apparmor
  • 使用R构建RESTful API(Building RESTful API using R)
    问题 我正在考虑使用编程语言R构建RESTful API,主要是为了以API格式向用户展示我的机器学习模型。 我知道有一些选项,例如导出到PMML,PFA并使用其他语言来处理API部分。 但是,我想坚持使用相同的编程语言,并且想知道R中是否有类似Flask / Django / Springbook的框架? 我看了一下servr / shiny,但是我真的不认为RESTful是他们设计的。 R中是否有更易于使用的更好的解决方案? 回答1 我有两种选择供您选择: 水管工 plumber允许您通过使用特殊注释修饰现有R源代码来创建REST API。 一个小的示例文件: # myfile.R #* @get /mean normalMean <- function(samples=10){ data <- rnorm(samples) mean(data) } #* @post /sum addTwo <- function(a, b){ as.numeric(a) + as.numeric(b) } 在R命令行中: > library(plumber) > r <- plumb("myfile.R") # Where 'myfile.R' is the location of the file shown above > r$run(port=8000) 这样,您将获得如下结果: $
  • 是否有一种机制可以将请求中的数据持久化/记录到 OpenCPU 服务器?(Is there a mechanism to persist/record data from requests to an OpenCPU server?)
    问题 首先,我明白有很多很好的理由不这样做,但出于兴趣,我的问题是:是否有推荐(或容忍)的方法将信息从 http 请求持久化到运行服务器的 R 会话? 例如,外部系统中的触发器在更新时触发 http 请求,其中包含基本信息(更新时间)。 在 R 中使(现在更新的)时间变量可用的最佳方法是什么? 作为下面的示例,我尝试使用..\identity API 编写一个简单的 .csv 文件。 我得到的结果似乎不是失败,但文件没有创建(我同意这是一件好事,默认情况下),但我想了解是否可以更新另一个状态服务器的一侧(即除了 \tmp 对象存储之外的任何地方),即使(例如)必须使用和安装自定义包? 抱歉,如果它记录在某处,但是当我单击管理指南 https://raw.github.com/jeroenooms/opencpu/opencpu-0.7/manual/document.pdf 的链接时,我得到了 404 谢谢。 require(opencpu) #Loading required package: opencpu #Initiating OpenCPU server... #OpenCPU started. #[httpuv] http://localhost:8810/ocpu #OpenCPU single-user server ready. require(RCurl) #
  • 如何在 CentOS6 上启动/停止/刷新 OpenCPU?(How to start/stop/flush OpenCPU on CentOS6?)
    问题 我已经在 CentOS6 上成功构建并安装了 OpenCPU 和 RStudio 服务器。 一切都按预期工作,我确实获得了本地 R 包的成功 GET/POST 响应。 然而,有几件事似乎不起作用: 我想不出一种干净的方法来启动/停止/刷新 OpenCPU。 我目前正在使用apachectl restart但我什至不确定是否会按预期重新加载 R 包。 我在/usr/lib/opencpu/scripts尝试了 Jeroen 的 bash 脚本,但它们似乎需要相当多的调整才能在 CentOS 上工作。 (可能与上述有关)我在/etc/opencpu/Renviron文件中使用load()和readRDS() (也在/etc/opencpu/Rprofile尝试过)将持久性数据集加载到全局环境中——但这并没有似乎工作。 我没有收到任何错误日志,但这些对象在后续请求中不可用。 在 Ubuntu OpenCPU 上似乎配置为在opencpu用户下运行。 在 CentOS6 上,它似乎在安装后在root下运行。 我想修改它,但不知道如何修改。 只是想知道是否有人在 CentOS6 上成功配置了 OpenCPU。 非常感谢,--梅尔。 回答1 一些答案 运行sudo apachectl restart将重新启动。 目前,rpm 中没有包含用于 opencpu 的特殊 init 或
  • 在 Ubuntu 16.04 VirtualBox 上安装 Rmpi(Installing Rmpi on Ubuntu 16.04 VirtualBox)
    问题 我在 VM VirtualBox 上创建了一个新的 ubuntu-16.04.2-desktop-amd64 机器,我希望能够在 Rmpi​​ 中使用 R 环境。 以下两种方法都给出了类似的错误。 更新了简化的预构建二进制方法: 安装 Ubuntu 后,我打开一个终端并执行以下命令: ~$ sudo apt-get update ~$ sudo apt-get install openmpi-bin ~$ sudo apt-get install r-base ~$ sudo apt-get install r-cran-rmpi ~$ R 这打开了 R 终端,我调用了导致错误的跟随函数: > library(Rmpi) libmpi.so: cannot open shared object file: No such file or directory Error : .onLoad failed in loadNamespace() for 'Rmpi', details: call: fun(libname, pkgname) error: Cannot start MPI_Init(). Exit Error: package or namespace load failed for ‘Rmpi’ 我尝试过的替代方法包括使用本地 OpenMPI 安装和使用 R
  • 如何在opencpu中链接两个函数调用(How to chain two function calls in opencpu)
    问题 据说 OpenCPU 支持链接函数调用以计算例如 f(g(x), h(y)) 关于参数格式的文档:https://public.opencpu.org/api.html#api-arguments 包含一个示例,通过计算来说明这一点 summary(read.csv("mydata.csv")) 在这个例子中,f 是通用函数摘要,它将一个对象作为参数。 我需要计算类似的东西: mycalc(read.csv("mydata.csv")) 或者 myplot(read.csv("my data.csv")) 其中 f 将数据帧作为参数。 当将 read.csv 函数返回的 sessionid 或哈希键作为对象参数提供时,这似乎不起作用。 如何解决这种两个非泛型函数的链接? 这是一个完整的例子: 准备包在 R 中测试 f(g(x)) 这里的 plotcars(dfcars()) dfcars<-function(){ data(cars); cars } plotcars<-function(df){ matplot(1:nrow(df),df) } plotcars(dfcars()) # test the two chained functions are working package.skeleton(list = c("dfcars", "plotcars")
  • 数据对象在openCPU的R会话中是否持久化?(Are data objects persistent in openCPU's R session?)
    问题 我想提供一个需要访问大型数据集的Web工具。 优选地,该R数据对象应一次加载到内存中,然后可用于用户定义的查询。 openCPU框架是否以任何方式支持持久性数据对象,还是每个查询都以空白开头? 回答1 OpenCPU API是无状态的,无法在请求之间保持进程活动。 但是,您可以通过将数据集放入软件包中并将其安装在服务器上来轻松解决问题。 您可以使用服务器手册中介绍的preload选项,也可以使用/etc/opencpu/Rprofile脚本在服务器启动时使用内存中的数据集加载程序包。 这样,当请求进入时,数据将准备就绪可以使用。
  • Rmpi:不能使用 MPI_Comm_spawn API(Rmpi: cannot use MPI_Comm_spawn API)
    问题 我在我的 linux 机器上安装了 Rmpi​​,它成功地加载到 R 中。我的机器上有两个版本的 MPICH,我(相信)已经安装了最新版本的 Rmpi​​。 我还必须更新我的LD_LIBRARY_PATH 。 我主要遵循此处的安装说明。 在 R 中加载 Rmpi​​ 后,我运行mpi.spawn.Rslaves(nslaves=4)并收到以下错误消息: Error in mpi.spawn.Rslaves(nslaves = 2) : You cannot use MPI_Comm_spawn API 有谁知道我怎样才能让 Rmpi​​ 工作? 谢谢! 回答1 您需要使用 MPICH2 来支持 spawn。 如果你安装了 MPICH2,你在安装 Rmpi​​ 时可能仍然需要指定--with-Rmpi-type=MPICH2 。 如果您改用--with-Rmpi-type=MPICH ,它将禁用诸如mpi.spawn.Rslaves功能。 另请注意,MPICH2 显然不支持 spawning 工人,除非使用诸如 mpiexec 之类的命令启动程序。 这基本上意味着您不能使用 MPICH2 从交互式 R 会话中执行mpi.spawn.Rslaves ,尽管使用 Open MPI 可以做到这一点。 需要明确的是,这不是您报告的问题,但您可能会在使用 MPICH2 正确安装 Rmpi
  • 中移M5311-NBIOT-OPENCPU开发-HTTP串口收发器
    中移M5311-NBIOT-OPENCPU开发-HTTP串口收发器实现功能:单片机串口发送HTTP-GET请求给M5311,M5311发送HTTP请求,接受返回数据,M5311串口发送回单片机opencpu_uart_demo.c#include "m5311_opencpu.h" #define OPENCPU_MAIN_UART HAL_UART_1 unsigned char uart_cmd = 0; char buffer[300]; char *pbuf; //uart中断回调函数 static void user_uart_callback(hal_uart_callback_event_t status, void *user_data){ pbuf = buffer; int temp1; if(status == HAL_UART_EVENT_READY_TO_READ) { memset(buffer,0,300); temp1 = opencpu_uart_receive(OPENCPU_MAIN_UART, pbuf, 300); uart_cmd = 'f'; } } /* 打印函数 */ void opencpu_printf (const char *str, ...){ static unsigned char s[600]; //This
  • 使用 Rmpi​​ 初始化 MPI 集群(Initialize MPI cluster using Rmpi)
    问题 最近我尝试利用部门集群在R进行并行计算。 集群系统由SGE 。 OpenMPI已安装并通过安装测试。 我通过qsub命令向集群提交查询。 在脚本中,我通过以下命令指定要使用的节点数。 #PBS -l nodes=2:ppn=24 (two nodes with 24 threads each) 然后, mpirun -np 1 R --slave -f test.R 之后我检查了$PBS_NODEFILE 。 如我所愿,分配了两个节点。 我可以找到两个节点的名称node1, node2 ,它们每个都出现了 24 次。 ``test.R` 的内容如下。 library(Rmpi) library(snow) cl <- makeCluster(41,type="MPI") clusterCall(cl, function() Sys.info()[c("nodename","machine")]) stopCluster(cl) mpi.quit() clusterCall()的输出非常令人失望。 只有一个节点的名称node1出现了 41 次。 这绝对是错误的,因为node1上只有 24 个线程。 我的R脚本似乎只能从中找到一个节点甚至一个线程。 我只是想知道构建MPI集群的正确方法是什么? 回答1 首先,即使安装了SGE,您的集群也绝对不是由SGE管理的。 SGE
  • 在 opencpu 会话中访问对象(Accessing objects in opencpu sessions)
    问题 如何在后续函数调用中访问 opencpu“会话”中的特定对象? 给定一个请求,说 /ocpu/library/base/R/eval 带参数 expr = "x <- 10; y <- 20" 这使 /ocpu/tmp/x08dfddafe3/R/.val /ocpu/tmp/x08dfddafe3/R/x /ocpu/tmp/x08dfddafe3/R/y /ocpu/tmp/x08dfddafe3/stdout /ocpu/tmp/x08dfddafe3/source /ocpu/tmp/x08dfddafe3/console /ocpu/tmp/x08dfddafe3/info 现在.val的值为 20。 假设我想将x传递给 ocpu/library/stats/R/rnorm 有没有一种快速的方法,比如 n = x08dfddafe3/R/x 在“伪”... 回答1 很好的问题。 从1.4.4版开始,有两种方法可以做到这一点: 您可以使用x08dfddafe3::x来引用会话x08dfddafe3的命名空间中的对象x 。 您可以传递完整的 URL http://your.server.com/ocpu/tmp/x08dfddafe3/R/x/rds。 如果网络允许,这将自动抓取对象并将其反序列化。
  • 中移4G模块-ML302-OpenCpu开发-(MQTT连接阿里云-接收和发送数据)
    中移4G模块-ML302-OpenCpu开发-(MQTT连接阿里云-接收和发送数据)根据上一条的学习,如果没看过可以去看一下上面的2.1中移4G模块-ML302-OpenCpu开发-(MQTT连接阿里云-订阅主题)数据是可以接收了,那怎么发送呢。int example_publish(void *handle) { int res = 0; const char *fmt = "/%s/%s/user/get"; char *topic = NULL; int topic_len = 0; char *payload = "{\"message\":\"hello!\"}"; //*** 对topic的拼接*** topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1; topic = HAL_Malloc(topic_len); if (topic == NULL) { cm_printf("[ALIYUN]: memory not enough\n"); return -1; } memset(topic, 0, topic_len); HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE
  • OpenCPU 管理员 opencpu.demo(OpenCPU admin opencpu.demo)
    问题 我在运行时收到错误 我的 OpenCPU 服务器上的管理应用程序错误消息:未找到 The requested URL /Radmin/call/opencpu.demo/install.opencpu/json was not found on this server. 我有opencpu repo的R文件夹和安装的包但我不知道install.opencpu函数文件在哪里 回答1 我不确定您在哪里找到/Radmin/ url,但该功能从未进入 opencpu。 尽量坚持使用手册页中的内容:www.opencpu.org。
  • Installing Rmpi on Ubuntu 16.04 VirtualBox
    I created a new ubuntu-16.04.2-desktop-amd64 machine on VM VirtualBox and I want to be able to use the R environment with Rmpi. Both of the below approaches gives a similar error. Updated simplified pre-build binary approach: When Ubuntu had installed I opened a terminal and executed the following commands: ~$ sudo apt-get update ~$ sudo apt-get install openmpi-bin ~$ sudo apt-get install r-base ~$ sudo apt-get install r-cran-rmpi ~$ R This opened the R terminal and I invoking the follow function which resulted in an error: > library(Rmpi) libmpi.so: cannot open shared object file: No such
  • 使用降雪R初始化MPI集群(Initializing MPI cluster with snowfall R)
    问题 我一直在尝试在大学的群集上运行Rmpi和snowfall ,但是由于某种原因,无论我分配了多少个计算节点, snowfall初始化都只在一个节点上运行。 这是我如何初始化它: sfInit(parallel=TRUE, cpus=10, type="MPI") 有任何想法吗? 我将根据需要提供澄清。 回答1 要在群集上运行基于Rmpi的程序,您需要使用批处理排队系统请求多个节点,然后通过实用程序(如mpirun / mpiexec)从作业脚本中执行R脚本。 理想情况下,已构建了mpirun实用程序来自动检测批处理排队系统已分配了哪些节点,否则,您将需要使用mpirun参数(例如--hostfile来告诉它要使用哪些节点。 在您的情况下,听起来好像您请求了多个节点,所以问题可能出在R脚本的执行方式上。 有些人没有意识到他们需要使用mpirun / mpiexec,结果是您的脚本在单个节点上运行。 如果您使用的是mpirun,则可能是Open MPI的安装不是在支持批处理排队系统的情况下构建的。 在这种情况下,您必须根据批处理排队系统提供的信息创建适当的主机文件,该文件通常是通过环境变量和/或文件提供的。 这是我用来从作业脚本执行并行R脚本的典型mpirun命令: mpirun -np 1 R --slave -f par.R 由于我们构建了支持Torque的Open MPI
  • 在集群上运行 Rmpi​​,指定库路径(run Rmpi on cluster, specify library path)
    问题 我正在尝试在我们的计算集群上并行运行分析。 不幸的是,我不得不自己设置 Rmpi​​ 并且可能没有正确设置。 因为我必须将所有必需的软件包安装到我的主文件夹中,所以我总是不得不调用 .libPaths('/home/myfolder/Rlib'); 在我可以加载包之前。 但是,在我设置库路径之前, doMPI似乎尝试加载自身。 .libPaths('/home/myfolder/Rlib'); cat("Step 1") library(doMPI) cl <- startMPIcluster() registerDoMPI(cl) cat("Step 2") Children_mcmc1 = foreach(i=1:2) %dopar% { cat("Step 3") .libPaths('/home/myfolder/Rlib'); library(MCMCglmm) cat("Step 4") load("krmh_married.rdata") nitt = 1000; thin = 50; burnin = 100 MCMCglmm( children ~ paternalage.factor , random=~idParents, family="poisson", data=krmh_married, pr = F, saveX = T, saveZ = T
  • 中移4G模块-ML302-OpenCpu开发-2-MQTT连接阿里云
    中移4G模块-ML302-OpenCpu开发-(MQTT连接阿里云)阿里云的项目创建和设备注册(已经创建好的请看下一条)打开https://iot.console.aliyun.com/product/createProduct创建产品填入相关信息,请注意下面三个红框的区域。完成之后点击创建打开https://iot.console.aliyun.com/devices点击添加设备创建好产品之后需要记住以下几个东西,会在下面使用到 ML302连接阿里云MQTT下面的百度云链接是ML302_OpenCPU_V2.1.0 OPENCPU开发固件,把他下载下来https://pan.baidu.com/s/1pA9rmXlWuV1s25e1GVzF4g 提取码:yvjl 首先打开ML302_OpenCPU\src\demo\aliyun\src\wrappers\wrapper.c文件,可以看到这四个变量,对应着上面刚才获取到的产品和设备密钥。 然后打开ML302_OpenCPU\src\cm_main.c文件在cm_main_task函数里面调用下面的方法因为函数里面默认带了几个参数,我们需要把他去掉,然后下面几个注释掉的可以根据需要改动 改完之后编译->烧录->重启->打开串口,看到类似如下的内容说明连接成功,连接失败的话会打印失败内容。 然后打开网页->进入设备详情
  • 从 R 调用并行 fortran MPI 子例程(Call parallel fortran MPI subroutine from R)
    问题 我想在可由 R 调用的子例程中编写一些并行 Fortran 代码(我想从 R 中读取数据并将其发送到并行 Fortran MPI)。 但是,我注意到,当我将以下程序作为子例程运行时(即,将“子例程”替换为“程序”),代码不再编译(当它是程序时,它会编译)。 我正在使用 Linux 中 MPICH 的mpif90编译代码。 是否可以在 Fortran 的子程序中初始化和完成 MPI? 如果没有,是否仍然可以从 R 以某种方式调用并行 Fortran MPI? 如果不是在 Fortran 中,可以在 C 中完成吗? 这是代码: module global integer numnodes,myid,mpi_err integer, parameter :: my_root=0 end module global module fmpi include 'mpif.h' end module fmpi subroutine init use fmpi use global implicit none call MPI_INIT( mpi_err ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numnodes, mpi_err ) call MPI_Comm_rank(MPI_COMM_WORLD, myid, mpi_err) end
  • Rmpi: cannot use MPI_Comm_spawn API
    I installed Rmpi on my linux machine and it successfully loads in R. There are two versions of MPICH on my machine, and I (believe) have installed Rmpi with the latest version. I also had to update my LD_LIBRARY_PATH. I primarily followed the installation instructions here. After loading Rmpi in R, I run mpi.spawn.Rslaves(nslaves=4) and get the following error message: Error in mpi.spawn.Rslaves(nslaves = 2) : You cannot use MPI_Comm_spawn API Does anyone know how I can get Rmpi working? Thanks!
  • 中移4G模块-ML302-OpenCpu开发-(固件编译和烧录)
    中移4G模块-ML302-OpenCpu开发-(固件编译和烧录)1.固件编译下面的百度云链接是ML302_OpenCPU_V2.1.0 OPENCPU开发固件,把他下载下来https://pan.baidu.com/s/1pA9rmXlWuV1s25e1GVzF4g 提取码:yvjl 1.使用VS code打开ML302_OpenCPU_V2.1.0目录,执行.\build.bat DNLM Release2.开发板按住boot按键和重启按键,3S后松开重启按键,然后松开boot按键,开发板灯不亮表示进入BOOT2.固件烧录1.打开烧录软件,选择pac文件2. 配置波特率 3.点击开始烧录4.烧录完成5.拔掉电源重启,使用U0串口查看结果 完成来源:https://blog.51cto.com/u_13526952/2720196