Запуск MPI-программ с разрешением sudo на кластере - PullRequest
0 голосов
/ 09 июля 2019

Я работаю над небольшим кластером Raspberry PI, моя хост-программа создает фрагменты IP-пакетов и отправляет их в несколько программ ретрансляции.Ретрансляторы получают эти фрагменты пакетов и направляют их к месту назначения с использованием необработанных сокетов.Из-за необработанных сокетов мои реле-программы должны запускаться с разрешением sudo.Моя установка включает RPi 3 B v2 и RPi 2 B v1.SSH уже настроен, узлы могут SSH-in без пароля, хотя я должен запустить ssh-agent и ssh-add мои ключи на каждом узле.Мне удалось запустить программу, отправляющую ранг с одного узла на другой (2 разных RPis).Я запускаю программы MPI в режиме MPMD, так как у меня есть только 2 RPis, я запускаю хост и ретранслятор на узле № 1 и ретрансляцию на узле № 2.Хост-программа использует путь к файлу, который должен быть отправлен в качестве аргумента командной строки.

Если я запускаю:

mpirun --oversubscribe -n 1 --host localhost /home/pi/Desktop/host /some.jpeg : -n 2 --host localhost,rpi2 /home/pi/Desktop/relay

, она запускается, но, очевидно, программа не работает, потому что реле может 't открывать необработанные сокеты без разрешения sudo.

Если я запускаю:

mpirun --oversubscribe -n 1 --host localhost /home/pi/Desktop/host /some.jpeg : -n 2 --host localhost,rpi2 sudo /home/pi/Desktop/relay

, размер отчета о реле равен 1, и хост-программа зависает.

Если я запускаю:

mpirun --oversubscribe -n 1 --host localhost sudo /home/pi/Desktop/host /some.jpeg : -n 2 --host localhost,rpi2 sudo /home/pi/Desktop/relay

все реле и отчеты о хостах мирового размера 1.

Я обнаружил здесь схожую проблему: OpenMPI / mpirun или mpiexec с sudoразрешение

После короткого ответа я запускаю:

mpirun --oversubscribe -n 1 --host localhost /home/pi/Desktop/host /some.jpeg : -n 2 --host localhost,rpi2 sudo -E /home/pi/Desktop/relay

, что приводит:

[raspberrypi:00979] OPAL ERROR: Unreachable in file ext2x_client.c at line 109
[raspberrypi:00980] OPAL ERROR: Unreachable in file ext2x_client.c at line 109
*** An error occurred in MPI_Init
*** An error occurred in MPI_Init
*** on a NULL communicator
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
***    and potentially your MPI job)
[raspberrypi:00979] Local abort before MPI_INIT completed completed successfully, but am not able to aggregate error messages, and not able to guarantee that all other processes were killed!
*** on a NULL communicator
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
***    and potentially your MPI job)
[raspberrypi:00980] Local abort before MPI_INIT completed completed successfully, but am not able to aggregate error messages, and not able to guarantee that all other processes were killed!
--------------------------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------
--------------------------------------------------------------------------
mpirun detected that one or more processes exited with non-zero status, thus causing
the job to be terminated. The first process to do so was:

  Process name: [[32582,1],1]
  Exit code:    1
--------------------------------------------------------------------------

Я запустил sudo visudo имой файл на обоих узлах выглядит так:

# User privilege specification
root    ALL=(ALL:ALL) ALL
pi      ALL = NOPASSWD:SETENV:  /etc/alternatives/mpirun
pi      ALL=NOPASSWD:SETENV:    /usr/bin/orterun
pi      ALL=NOPASSWD:SETENV:    /usr/bin/mpirun

Когда я запускаю все на одном узле, он просто работает:

sudo mpirun --alow-run-as-root --oversubscribe -n 1 --host localhost /home/pi/Desktop/host /some.jpeg : -n 2 --host localhost,localhost /home/pi/Desktop/relay // host

int main(int argc, char *argv[]) {
    MPI_Init(&argc, &argv);

    int world_size = []() {
        int size;
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        return size;
    }();

    int id = []() {
        int id;
        MPI_Comm_rank(MPI_COMM_WORLD, &id);
        return id;
    }();

    if (argc != 2) {
        std::cerr << "Filepath not passed\n";
        MPI_Finalize();
        return 0;
    }

    const std::filesystem::path filepath(argv[1]);
    if (not std::filesystem::exists(filepath)) {
        std::cerr << "File doesn't exist\n";
        MPI_Finalize();
        return 0;
    }

    std::cout << "World size: " << world_size << '\n';

    MPI_Finalize();
    return 0;
}

//relay
int main(int argc, char *argv[]) {
    MPI_Init(&argc, &argv);

    int world_size = []() {
        int size;
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        return size;
    }();

    int id = []() {
        int id;
        MPI_Comm_rank(MPI_COMM_WORLD, &id);
        return id;
    }();

    std::cout << "World size: " << world_size << '\n';

    MPI_Finalize();
    return 0;
}

Как настроить узлы, чтобы они могли запускать программы MPI с помощью sudo?

1 Ответ

0 голосов
/ 13 июля 2019

Самый простой способ решить проблему - настроить возможности файла, он все еще создает проблему безопасности, но это не так серьезно, как установка suid программы в root.Чтобы установить возможности программы, позволяющие открыть raw сокет: setcap program cap_net_raw,cap_net_admin+eip.

...