Rmpi не может загрузить общие библиотеки как пользователь без полномочий root
У меня проблема с Rmpi, когда я пытаюсь загрузить его и получаю следующее сообщение об ошибке:
> library('Rmpi')
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared library '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
In addition: Warning message:
.Last.lib failed in detach() for 'Rmpi', details:
call: dyn.unload(file.path(libpath, "libs", paste("Rmpi", .Platform$dynlib.ext,
error: dynamic/shared library '/usr/lib64/R/library/Rmpi/libs/Rmpi.so' was not loaded
Error in library("Rmpi") : .First.lib failed for 'Rmpi'
Однако эта ошибка не возникает, когда я вошел в систему как пользователь root.
Это не похоже на проблему с разрешениями. Я проверил разрешения для libmpi.so.0:
[meehan@cnl10 /]$ ll /usr/lib64/lam/lib/
total 7.4M
-rw-r--r-- 1 root root 207 May 25 2008 lam.module
-rw-r--r-- 1 root root 885K May 25 2008 liblam.a
-rw-r--r-- 1 root root 361K May 25 2008 liblamf77mpi.a
lrwxrwxrwx 1 root root 21 Apr 12 2010 liblamf77mpi.so -> liblamf77mpi.so.0.0.0
lrwxrwxrwx 1 root root 21 Apr 12 2010 liblamf77mpi.so.0 -> liblamf77mpi.so.0.0.0
-rwxr-xr-x 1 root root 73K May 25 2008 liblamf77mpi.so.0.0.0
-rw-r--r-- 1 root root 2.2M May 25 2008 liblammpi++.a
-rw-r--r-- 1 root root 509K May 25 2008 liblammpio.a
lrwxrwxrwx 1 root root 20 Apr 12 2010 liblammpi++.so -> liblammpi++.so.0.0.0
lrwxrwxrwx 1 root root 20 Apr 12 2010 liblammpi++.so.0 -> liblammpi++.so.0.0.0
-rwxr-xr-x 1 root root 167K May 25 2008 liblammpi++.so.0.0.0
lrwxrwxrwx 1 root root 15 Apr 12 2010 liblam.so -> liblam.so.0.0.0
lrwxrwxrwx 1 root root 15 Apr 12 2010 liblam.so.0 -> liblam.so.0.0.0
-rwxr-xr-x 1 root root 332K May 25 2008 liblam.so.0.0.0
-rw-r--r-- 1 root root 2.2M May 25 2008 libmpi.a
lrwxrwxrwx 1 root root 15 Apr 12 2010 libmpi.so -> libmpi.so.0.0.0
lrwxrwxrwx 1 root root 15 Apr 12 2010 libmpi.so.0 -> libmpi.so.0.0.0
-rwxr-xr-x 1 root root 655K May 25 2008 libmpi.so.0.0.0
И Rmpi.so:
[meehan@cnl10 /]$ ll /usr/lib64/R/library/Rmpi/libs/
total 108K
-rwxr-xr-x 1 root root 104K Jan 20 2011 Rmpi.so
В любом случае я использую R как sudo.
Соответствующая системная информация: -Linux дистрибутив: CentOS 5.5 -R версия: 2.11.1 (2010-05-31) -Rmpi версия: 0.5-8 -MPI реализация openmpi
[meehan@cnl10 /]$ echo $LD_LIBRARY_PATH
/opt/lib:/opt/open-mpi/tcp-`gnu41/lib:/opt/intel/mkl/10.2/lib/em64t:/opt/intel/fce/11.1/lib:/opt/intel/cce/11.1/lib:`
Любая помощь будет наиболее ценится!
1 ответ
Проблема здесь в том, что OpenMPI по умолчанию не регистрирует каталог своей библиотеки с системным компоновщиком. Вот почему некоторые руководства по установке рекомендуют поместить их каталоги в LD_LIBRARY_PATH
переменная, так что библиотеки могут быть найдены во время выполнения. Однако "добавление каталогов в LD_LIBRARY_PATH" должно выполняться каждый раз при загрузке новой оболочки, поэтому в этих руководствах предлагается поместить ее в ~/.bashrc
или тому подобное, так что настройка восстанавливается при каждом входе в систему.
Тем не менее ~/.bashrc
файл (или ~/.profile
или любой другой) - это пользовательская настройка. Предполагая, что вы вошли в систему как root при установке openmpi, Rmpi и т. П., Что, вероятно, означает, что добавление к этим пользовательским файлам будет устанавливать пути к библиотекам только при запуске от имени пользователя root, а не от обычного пользователя среды выполнения.,
Как правило, исправление заключается в том, чтобы сообщить компоновщику, где можно найти эти файлы. В моей собственной системе, на которой работает CentOS 7, OpenMPI 1.10.0 (с использованием RPM для Scientific Linux), R 3.2.3 и Rmpi 0.6-5, вот что происходит, когда мне не удается установить путь к библиотеке:
[dchurch@workstation ~]$ R -q -e "library('Rmpi')"
> library('Rmpi')
Error : .onLoad failed in loadNamespace() for 'Rmpi', details:
call: dyn.load(file, DLLpath = DLLpath, ...)
error: unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.12: cannot open shared object file: No such file or directory
Error: package or namespace load failed for ‘Rmpi’
Execution halted
Если я временно установлю путь компоновщика с временной переменной, он будет работать для этого вызова:
[dchurch@workstation ~]$ LD_LIBRARY_PATH=/usr/lib64/openmpi/lib R -q -e "library('Rmpi')"
> library('Rmpi')
>
>
Однако, чтобы сделать это изменение постоянным, лучший способ сделать это - зарегистрировать каталог библиотек openmpi с самим системным компоновщиком, создав новый файл в /etc/ld.so.conf.d
и работает ldconfig
, а так:
[dchurch@workstation ~]$ sudo sh -c 'echo /usr/lib64/openmpi/lib > /etc/ld.so.conf.d/openmpi.conf; ldconfig'
[dchurch@workstation ~]$ R -q -e "library('Rmpi')"
> library('Rmpi')
>
>
Как только вы это сделаете, Rmpi сможет загружаться для любого пользователя, независимо от переменных среды.