我正在研究一个与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 得到了正确答案,但我无法对此进行测试
答案 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用户身份登录其他主机。这通常由于以下一个或两个原因而失败:
这就是为什么你看到等级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