我的所有 apt-get 操作都失败了,因为某处似乎有一个文件调用ld.so包含不再存在的文件。这意味着我无法再使用 apt-get 来安装或更新我的依赖项!
我正在运行 Lubuntu 16.04。
我相信这是因为 Nvidia CUDA 发生了自动更新而发生的。从上周开始,在运行与 CUDA 无关的命令后,我开始看到此行出现在我的终端中。
ERROR: ld.so: object '/usr/lib/nvidia-375/libnvidia-ml.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
我去查看了一下,发现该文件/usr/lib/nvidia-375/libnvidia-ml.so在我的系统中不存在,而是有一个libnvidia-ml.so文件夹中的文件似乎用于更新同一个包,/usr/lib/nvidia-382。
我以为重新启动并进行一些更新后这个问题就会消失,但今天我意识到我再也无法做到大多数事情了apt-get命令。例如,当我运行安装命令时,我得到了一个巨大的日志输出,其中包括数百次上述行,并且安装最终失败。
我已将其中一个输出复制粘贴到要点中(它太大了,无法放在这篇文章中)。这是尝试运行的输出结果sudo apt-get install vlc
(但任何安装都会以类似的方式失败)。https://gist.github.com/travellingprog/00a08cff1019f7a12d36b975dff62c92
我最近甚至都不使用 CUDA,所以这特别烦人。我尝试过的方法之一是卸载 nvidia-382。卸载本身似乎有效,并且似乎还删除了 CUDA 9,但问题仍然存在。
问题是我不知道哪个包或文件一直在要求 /usr/lib/nvidia-375 中这个不存在的文件。
有人可以帮忙吗?
更新 2017-11-01
我似乎收到这个错误每当我运行sudo
命令时。
我尝试运行ldd /usr/bin/sudo
,但ldd /usr/bin/apt-get
它们都没有列出这个 Nvidia 文件。我查看了文件夹/etc/ld.so.conf.d并找到一个名为CUDA-9-0.conf 文件,尽管应该删除 CUDA。所以我将其重命名为cuda-9-0.备份然后就跑了sudo ldconfig
。
sudo
这并没有解决问题,我仍然在每个命令上都收到错误消息。
我还决定检查缓存,但我不确定这是否指向该问题:
# sudo ldconfig -p | grep nvidia
ERROR: ld.so: object '/usr/lib/nvidia-375/libnvidia-ml.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
libnvidia-gtk3.so.384.81 (libc6,x86-64) => /usr/lib/libnvidia-gtk3.so.384.81
libnvidia-gtk2.so.384.81 (libc6,x86-64) => /usr/lib/libnvidia-gtk2.so.384.81
答案1
您似乎已LD_PRELOAD
在某处设置了环境变量:
$ /bin/true
$ export LD_PRELOAD=/usr/lib/nvidia-375/libnvidia-ml.so
$ /bin/true
ERROR: ld.so: object '/usr/lib/nvidia-375/libnvidia-ml.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
我建议您检查 shell 初始化文件 ( ~/.{bashrc,profile}
, /etc/{bash.bashrc,profile,profile.d/*}
)。或者运行以下命令:
PS4=' ${BASH_SOURCE}:${LINENO} ' bash -lixc exit |& grep LD_PRELOAD
答案2
感谢@muru回答和@pbhj的评论对于该答案,我发现问题在于LD_PRELOAD
文件中的环境变量被设置为“/usr/lib/nvidia-375/libnvidia-ml.so” /etc/environment
。
很可能很久以前,当我第一次设置 CUDA 时,我自己就将这一行添加到了该文件中。我猜这是针对我当时遇到的一个问题的一种破解方法,需要在级别上设置 LD_PRELOAD sudo
。
正如 @muru 所演示的那样,通过将 LD_PRELOAD 环境变量设置为不存在的文件,可以很容易地重现错误消息。但是,我的 shell 初始化文件没有设置它,因此env | grep LD_PRELOAD
没有返回任何内容。
但是(感谢@pbhj的评论),我发现运行时sudo apt-get update
会在输出中多次显示错误,sudo env -u LD_PRELOAD apt-get update
但只在输出的最顶部显示一次。然后我发现它sudo env | grep LD_PRELOAD
确实被设置为不存在的文件,用于sudo
命令。
除此之外/etc/environment
,遇到此问题的任何人都应该查看文件/etc/sudoers
(您应该使用进行编辑sudo visudo
)和文件夹中的所有文件/etc/sudoers.d/
。
答案3
您是否尝试过:
dpkg-reconfigure nvidia-***
如果需要,这可能会解决您的重新配置和重新安装的问题!