Я работаю над кодом, который работает с процессором Epiphany (http://www.parallella.org/) и для запуска кодов Epiphany мне нужны привилегии sudo для программы на стороне хоста. От Судо нет спасения!
Теперь мне нужно запустить этот код на нескольких узлах, для этого я использую mpi, но mpi не будет правильно работать с sudo
#sudo mpirun -n 12 --hostfile hosts -x LD_LIBRARY_PATH=${ELIBS} -x EPIPHANY_HDF=${EHDF} ./hello-mpi.elf
Даже простой код, который осуществляет связь между узлами, не работает. Ряды приходят 0, если я использую sudo.
Связь между потоками работает, но не между узлами. Это важно, потому что я хотел правильно распределить рабочую нагрузку по картам.
вот простой код
#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
Это не.
Редактировать:-
Я думаю @Христо Илиев получил правильный ответ, но я не смогу проверить это
Краткий ответ: вместо 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
, ssh
или какой-то другой механизм (например, многие системы управления ресурсами кластера имеют свои собственные механизмы для этого). Когда rsh
/ssh
механизм используется, так как программа запускается от имени пользователя root, mpirun
пытается войти на другой хост (ы) как root. Это обычно терпит неудачу по одной или обеим из двух причин:
Вот почему вы видите ранг 0 (это местный fork()
спавн) и другие ряды отсутствуют. Поскольку включение удаленного входа в систему root рассматривается многими как угроза безопасности, я бы предпочел пойти по пути, описанному в кратком ответе.
Другим вариантом было бы сделать hello-mpi.elf
принадлежит root и установите бит Set UID через chmod u+s hello-mpi.elf
, Тогда вам не понадобится sudo
совсем. Это не будет работать, если файловая система смонтирована с nosuid
опция или если какой-то другой механизм безопасности активен. Также suid-файлы, принадлежащие пользователю root, представляют угрозу безопасности, поскольку они всегда выполняются с правами root, независимо от того, какой пользователь их запускает.
Интересно, зачем вам нужны права суперпользователя для общения с Богоявленским собранием. SDK выполняет какие-то необычные привилегированные операции или просто обращается к файлу устройства в /dev
что доступно для записи только пользователю root? Если это последнее, возможно, узел устройства может быть создан с другими разрешениями.
Некоторое время я боролся с этой же проблемой, и мне пришлось читать всю документацию, чтобы найти решение (я также работаю с кластером Parallela). Это довольно просто: во время установки OpenMPI вы должны добавить опцию -enable-orterun-prefix-по-умолчанию по умолчанию при настройке установки …
$./configure -prefix=/usr/local --enable-orterun-prefix-by-default