Nvidia API 不匹配

Nvidia API 不匹配

我原本计划玩一天《传送门 2》来放松一下,但当我启动 Steam 时(几周以来第一次),我在终端上看到了以下消息:

Error: API mismatch: the NVIDIA kernel module has version 270.41.19,
but this NVIDIA driver component has version 270.41.06.  Please make
sure that the kernel module and all NVIDIA driver components
have the same version.

我承认,当它说驱动程序时,我真的不知道它在说什么。 的版本nvidia-current270.41.19。我以为是驱动程序和模块,合二为一。

我使用 X-SWAT PPA,我注意到该nvidia-settings软件包已升级到275.09.07。由于这只是一个设置应用程序,我认为这种不匹配与此无关。它也不是所述问题的同一版本。

我宁愿不清除回标准 Nvidia 驱动程序,因为它在我的 GTX580 上不太稳定。我会接受一个答案,即采用手动设置并在内核重新编译时重新编译它(即一些 DKMS 魔法),但它必须工作。我不想在内核升级后每次重新启动时都回到文本模式。

编辑:Minecraft 运行正常,没有任何关于驱动程序版本的投诉。Penumbra 在进入游戏时因大致相同的错误而死机。

编辑:以下是我处理的 32 位文件。它们似乎都是正确的版本。

ls -l /usr/lib32/nvidia-current/ | awk '{ print $8 " " $9 " " $10 }'

libcuda.so -> libcuda.so.270.41.19
libcuda.so.1 -> libcuda.so.270.41.19
libcuda.so.270.41.19  
libGL.la  
libGL.so -> libGL.so.1
libGL.so.1 -> libGL.so.270.41.19
libGL.so.270.41.19  
libnvcuvid.so -> libnvcuvid.so.1
libnvcuvid.so.1 -> libnvcuvid.so.270.41.19
libnvcuvid.so.270.41.19  
libnvidia-cfg.so -> libnvidia-cfg.so.1
libnvidia-cfg.so.1 -> libnvidia-cfg.so.270.41.19
libnvidia-cfg.so.270.41.19  
libnvidia-compiler.so -> libnvidia-compiler.so.1
libnvidia-compiler.so.1 -> libnvidia-compiler.so.270.41.19
libnvidia-compiler.so.270.41.19  
libnvidia-glcore.so.270.41.19  
libnvidia-ml.so -> libnvidia-ml.so.1
libnvidia-ml.so.1 -> libnvidia-ml.so.270.41.19
libnvidia-ml.so.270.41.19  
libnvidia-tls.so.270.41.19  
libnvidia-wfb.so.1 -> libnvidia-wfb.so.270.41.19
libnvidia-wfb.so.270.41.19  
libOpenCL.so -> libOpenCL.so.1
libOpenCL.so.1 -> libOpenCL.so.1.0
libOpenCL.so.1.0 -> libOpenCL.so.1.0.0
libOpenCL.so.1.0.0  
libXvMCNVIDIA_dynamic.so.1 -> libXvMCNVIDIA.so.270.41.19
libXvMCNVIDIA.so -> libXvMCNVIDIA.so.270.41.19
libXvMCNVIDIA.so.1 -> libXvMCNVIDIA.so.270.41.19
libXvMCNVIDIA.so.270.41.19  

编辑2:我可能发现了一些东西。

潜伏在/usr/lib32/适当的位置(不是nvidia-current子目录)我发现了以下内容:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep 270

libcuda.so.1 -> libcuda.so.270.41.06
libcuda.so.270.41.06  
libGL.so.1 -> libGL.so.270.41.06
libGL.so.270.41.06  
libnvidia-compiler.so.270.41.06  
libnvidia-glcore.so.270.41.06  
libnvidia-tls.so.270.41.06  
libvdpau.so.1 -> libvdpau.so.270.41.06
libvdpau.so.270.41.06  
libvdpau_trace.so -> vdpau/libvdpau_trace.so.270.41.06

出于某种原因,所有内容/usr/lib32/nvidia-current/都是正确的版本,但其中有大量/usr/lib32/可能会破坏派对的杂乱内容。

编辑3:尝试追踪哪个包拥有这些文件失败:

find /usr/lib32 -iname '*270.41.06*' -exec dpkg -S "{}" \;

dpkg-query: no path found matching pattern /usr/lib32/libnvidia-compiler.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libGL.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/vdpau/libvdpau_nvidia.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/vdpau/libvdpau_trace.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libvdpau.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/tls/libnvidia-tls.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libnvidia-tls.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libcuda.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libnvidia-glcore.so.270.41.06.

关于如何处理这些损坏的版本,有什么建议吗?删除它们?删除然后链接到./nvidia-current/版本?

答案1

执行以下操作解决了我在 Ubuntu 12.04 64 位(内核为 3.0.29)上遇到的问题。希望对您有所帮助。

sudo apt-get purge nvidia-current
sudo apt-get install nvidia-current

答案2

在发现 /usr/lib32/ 中堆积了大量旧文件后,我使用以下命令将它们移出:

sudo find /usr/lib32 -iname '*270.41.06*' -exec mv {} {}.old \;

然后重启 X。这破坏了所有 3D。好极了。使用之前的命令,我可以看到有四个断开的链接:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep 270

libcuda.so.1 -> libcuda.so.270.41.06
libGL.so.1 -> libGL.so.270.41.06
libvdpau.so.1 -> libvdpau.so.270.41.06
libvdpau_trace.so -> vdpau/libvdpau_trace.so.270.41.06

我没有手动替换四个文件的链接,而是去找瑞文戴尔之王埃尔隆德,让他组建一支能够陷入莫赫多尔的团队,蹒跚地走到末日山,为我制定一个命令,将我(我的意思是我们所有人)带到黑暗中并将我们束缚起来。

够了。下面是一条命令:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep 270 | cut -d' ' -f1 | xargs -l1 sudo bash -c "rm /usr/lib32/\$0 && ln -s /usr/lib32/nvidia-current/\$0 /usr/lib32/\$0"

她不是很出色吗?而且成功了。我现在有 4 个闪亮的新符号链接:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep '/nvidia-current'

libcuda.so.1 -> /usr/lib32/nvidia-current/libcuda.so.1
libGL.so.1 -> /usr/lib32/nvidia-current/libGL.so.1
libOpenCL.so -> nvidia-current/libOpenCL.so
libvdpau.so.1 -> /usr/lib32/nvidia-current/libvdpau.so.1
libvdpau_trace.so -> /usr/lib32/nvidia-current/libvdpau_trace.so

然后我检查一切是否正常。在重新启动之前,我认为我应该检查链接是否正确:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep '/nvidia-current' | cut -d' ' -f3 | xargs file

/usr/lib32/nvidia-current/libcuda.so.1:      symbolic link to `libcuda.so.270.41.19'
/usr/lib32/nvidia-current/libGL.so.1:        symbolic link to `libGL.so.270.41.19'
/usr/lib32/nvidia-current/libvdpau.so.1:     ERROR: cannot open `/usr/lib32/nvidia-current/libvdpau.so.1' (No such file or directory)
/usr/lib32/nvidia-current/libvdpau_trace.so: ERROR: cannot open `/usr/lib32/nvidia-current/libvdpau_trace.so' (No such file or directory)

太棒了。所以这个超级命令只正确执行了两个链接。进一步查看后,似乎文件libvdpau确实存在于 中/usr/lib32/nvidia-current/vdpau/。这次不用再乱搞了:

sudo rm /usr/lib32/libvdpau{,_trace}.so*
sudo ln -s /usr/lib32/{nvidia-current/vdpau/,}libvdpau.so*
sudo ln -s /usr/lib32/{nvidia-current/vdpau/,}libvdpau_trace.so*

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep '/nvidia-current' | cut -d' ' -f3 | xargs file

/usr/lib32/nvidia-current/libcuda.so.1:                      symbolic link to `libcuda.so.270.41.19'
/usr/lib32/nvidia-current/libGL.so.1:                        symbolic link to `libGL.so.270.41.19'
/usr/lib32/nvidia-current/vdpau/libvdpau.so.270.41.19:       ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
/usr/lib32/nvidia-current/vdpau/libvdpau_trace.so.270.41.19: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped

至少它们正确地(虽然有点笨拙)连接在一起了。是时候测试了。

编辑:这有效,但从我的挣扎中可以学到:保持简单。

答案3

也可以这样做:

$ dpkg --get-selections | grep nvidia

nvidia-common                   install
nvidia-current                  install
nvidia-current-updates              install
nvidia-experimental-x...            install
nvidia-settings                 install
nvidia-settings-updates             install

进而:

$ sudo apt-get purge nvidia-experimental-x...
...
$ sudo reboot

一切都好!

答案4

我遇到了这个问题,它影响了我在 Wine 中的 SWTOR 启动器。阅读完上述内容后,我决定尝试通过 Ubuntu UI 进行操作。以下是对我有用的简单解决方案;

通过 UI 删除并重新安装其他驱动程序:

  1. 转至系统 -> 管理 -> 附加驱动程序
  2. 选择 NVIDIA 加速图形驱动程序并按“删除”按钮。删除后请勿立即重新启动。
  3. 删除后,选择相同的驱动程序并单击“激活”。
  4. 现在重新启动。
  5. 應該被修復。

相关内容