【问题标题】:Rmpi unable to load shared libraries as non root userRmpi 无法以非 root 用户身份加载共享库
【发布时间】:2013-10-07 21:25:36
【问题描述】:

我遇到了 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:`

任何帮助将不胜感激!

【问题讨论】:

  • ldd 在这里可能会有所帮助,尝试ldd /usr/lib64/R/library/Rmpi/libs/Rmpi.so 看看它引用了哪些库,其中一些可能不可用。更大的锤子是使用strace 并寻找失败的open()s
  • 您的LD_LIBRARY_PATH 看起来很别扭。即使在此处发布时出现了这些反引号,/usr/lib64/lam/lib 也不是库路径的一部分。此外,您确定这是 Rmpi 链接的 MPI 版本吗?混合不同的 MPI 实现在 99.9% 的情况下都不起作用。
  • 我知道这是一个旧线程,但我遇到了完全相同的问题。有人找到解决方案了吗?

标签: r shared-libraries mpi


【解决方案1】:

这里的问题是,默认情况下,OpenMPI 不会向系统链接器注册其库目录。这就是为什么一些安装指南建议您将其目录放在 LD_LIBRARY_PATH 变量中,以便可以在运行时找到库。但是,每次加载新 shell 时都必须执行“将目录添加到 LD_LIBRARY_PATH”,这就是为什么这些指南建议将其放在 ~/.bashrc 或类似名称中,以便在每次登录时恢复设置。

但是,~/.bashrc 文件(或 ~/.profile 或任何此类文件)是用户特定设置。假设在安装 openmpi 和 Rmpi​​ 等时以 root 身份登录,这似乎很可能,这意味着添加到这些用户特定的文件只会在以 root 身份运行时设置库路径,而不是作为您通常的运行时用户.

一般来说,解决方法是告诉链接器在哪里可以找到这些文件。在我自己运行 CentOS 7、OpenMPI 1.10.0(使用 Scientific Linux RPM)、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 都应该能够为任何用户加载。

【讨论】:

    猜你喜欢
    • 2016-05-04
    • 2015-06-18
    • 1970-01-01
    • 2017-07-08
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多