具有sudo权限的OpenMPI / mpirun或mpiexec

时间:2014-08-26 16:02:07

标签: c++ nodes sudo openmpi epiphany

我正在研究一个与Epiphany处理器(http://www.parallella.org/)配合使用的代码,并运行Epiphany代码,我需要在主机端程序上使用sudo权限。 sudo没有逃脱!

现在我需要在几个节点上运行此代码,为了做到这一点,我使用mpi,但mpi不能正常使用sudo

#sudo mpirun -n 12 --hostfile hosts -x LD_LIBRARY_PATH=${ELIBS} -x EPIPHANY_HDF=${EHDF} ./hello-mpi.elf

即使是执行节点通信的简单代码也不起作用。如果我使用sudo,排名为0。 线程之间的通信有效但不跨节点。这很重要,因为我想在卡片上正确分配工作量。

这是简单的代码

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[]) {
   int numprocs, rank, namelen;
   char processor_name[MPI_MAX_PROCESSOR_NAME];

   MPI_Init(&argc, &argv);
   MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
   MPI_Get_processor_name(processor_name, &namelen);

   printf("Hello World from MPI Process %d on machine %s\n", rank, processor_name);

   MPI_Finalize();
}

此代码应在节点间以不同方式吐出排名,但它不适用于sudo

对此的任何帮助都很棒

以下是运行上述代码而没有sudo的输出。

mpirun -n 3 --hostfile $MPI_HOSTS ./mpitest

输出:

Hello world from processor work1, rank 1 out of 3 processors
Hello world from processor command, rank 0 out of 3 processors
Hello world from processor work2, rank 2 out of 3 processors

这是预期的。

以下是使用sudo运行上述代码的输出。

sudo mpirun -n 3 --hostfile $MPI_HOSTS ./mpitest

输出:

Hello world from processor command, rank 0 out of 1 processors
Hello world from processor work1, rank 0 out of 1 processors
Hello world from processor work2, rank 0 out of 1 processors

这不是。

编辑: -

我认为@ Hristo Iliev 得到了正确答案,但我无法对此进行测试

2 个答案:

答案 0 :(得分:4)

简短回答:而不是sudo mpirun -n 12 ... ./hello-mpi.elf,命令应为:

mpirun -n 12 ... sudo -E ./hello-mpi.elf

为了使其正常工作,您必须在所有主机上修改sudo配置(通过visudo)并为您的用户启用无密码操作:

username ALL = NOPASSWD:SETENV: /path/to/mpirun

此条目允许您的用户在没有首先验证自己的情况下运行sudo mpirun,这很重要,因为只有0级的标准输入被重定向。它还允许您使用sudo选项执行-E,以允许它将特殊的Open MPI变量(OMPI_...)传递给可执行文件(没有环境中的那些变量,可执行文件无法相互连接,而是作为单例运行。)

答案很长:使用mpirun运行sudo会导致前者以有效用户root执行。 mpirun创建MPI作业的方式是首先启动所请求数量的可执行文件,然后等待他们在MPI_Init调用期间相互了解。根据主机列表文件的内容,mpirun生成子进程(对于与主机mpirun匹配的主机条目执行)或使用rsh远程启动进程,{ {1}}或其他一些机制(例如,许多集群资源管理系统都有自己的机制)。使用ssh / rsh机制时,由于程序以root身份运行,ssh会尝试以root用户身份登录其他主机。这通常由于以下一个或两个原因而失败:

  • root用户无法在不提供密码的情况下登录指定的主机,例如尚未设置使用公钥认证;
  • 多年以来,不允许root用户远程登录,这是许多Unix系统中的默认SSH配置。

这就是为什么你看到等级0出现(它是一个基于本地mpirun的产卵)而其他等级缺失的原因。由于许多人认为启用远程root登录被认为是一种安全风险,我宁愿采用简短回答中描述的方式。

另一种选择是让root拥有fork()并通过hello-mpi.elf设置Set UID位。然后你根本不需要chmod u+s hello-mpi.elf。如果使用sudo选项挂载文件系统或者某些其他安全机制处于活动状态,则此操作无效。 root拥有的suid二进制文件也会带来安全风险,因为它们总是以root权限执行,无论用户运行它们。

我想知道,为什么你需要root权限才能与Epiphany董事会交谈。 SDK是否正在执行一些特殊的特权操作,或者只是访问nosuid中只能由root写入的设备文件?如果是后者,也许可以使用不同的权限创建设备节点。

答案 1 :(得分:1)

我在同一个问题上挣扎了一段时间,并且必须阅读整个文档才能找到解决方案(我也在使用parallella集群)。它非常简单:在安装OpenMPI期间,您必须在配置安装时添加选项-enable-orterun-prefix-default ...

$./configure -prefix=/usr/local --enable-orterun-prefix-by-default