由于 ld.so 查找无效,apt-get 操作失败

由于 ld.so 查找无效,apt-get 操作失败

我的所有 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-***

如果需要,这可能会解决您的重新配置和重新安装的问题!

相关内容