1

我正在研究与 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得到了正确的答案,但我无法对此进行测试

4

2 回答 2

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运行。创建 MPI 作业的方法是首先启动请求数量的可执行文件,然后等待它们在调用期间相互了解。根据主机列表文件的内容,要么产生一个子进程(对于与主机匹配的主机条目),要么使用远程启动一个进程,或者其他一些机制(例如,许多集群资源管理系统有自己的机制那)。当使用/机制时,由于程序以 root 身份运行,因此会尝试以 root 身份登录其他主机。这通常由于以下两个原因中的一个或两个而失败:sudorootmpirunMPI_Initmpirunmpirunrshsshrshsshmpirun

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

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

另一种选择是让hello-mpi.elfroot 拥有并通过设置 UID 位chmod u+s hello-mpi.elf。那你就完全不需要sudo了。nosuid如果使用该选项挂载文件系统或其他一些安全机制处于活动状态,这将不起作用。此外,root 拥有的 suid 二进制文件也会带来安全风险,因为它们总是以 root 权限执行,无论是什么用户运行它们。

我想知道,为什么你需要 root 权限才能与 Epiphany 板交谈。SDK 是在做一些花哨的特权操作,还是只是访问/dev只能由 root 写入的设备文件?如果是后者,也许可以创建具有不同权限的设备节点。

于 2014-08-27T06:50:45.187 回答
1

我在同样的问题上挣扎了一段时间,不得不阅读整个文档以找到解决方案(我也在使用 parallella 集群)。这很简单:在安装 OpenMPI 期间,您必须在配置安装时添加选项 -enable-orterun-prefix-by-default...

$./configure -prefix=/usr/local --enable-orterun-prefix-by-default
于 2016-03-11T01:03:54.183 回答