gpt4 book ai didi

c++ - 具有 sudo 权限的 OpenMPI/mpirun 或 mpiexec

转载 作者:行者123 更新时间:2023-11-30 01:16:59 24 4
gpt4 key购买 nike

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

最佳答案

简短回答:而不是 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_... ) 传递给可执行文件(环境中没有这些变量,可执行文件无法相互连接,而是作为单例运行)。

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

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

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

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

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

关于c++ - 具有 sudo 权限的 OpenMPI/mpirun 或 mpiexec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25510275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com