在 Ubuntu 20.04 中为 GTX 560 Ti 安装 Nvidia 驱动程序时,如何修复客户端版本和内核模块版本之间的“NVRM:API 不匹配”?

Leó*_*ert 10 ubuntu nvidia

我在添加GTX 560 Ti后安装了nvidia-driver-390我在运行 Kubuntu 20.04 LTS 的 Intel Core i5 12600K PC 上

\n

重新启动后,我收到以下错误:

\n
$ dmesg|grep -i nvrm -A3\n[  113.647054] NVRM: API mismatch: the client has the version 460.91.03, but\n               NVRM: this kernel module has the version 390.144.  Please\n               NVRM: make sure that this kernel module and all NVIDIA driver\n               NVRM: components have the same version.\n
Run Code Online (Sandbox Code Playgroud)\n

如何将客户端版本设置为 390.144?

\n

较新的驱动程序,例如nvidia-driver-460似乎不支持此显卡。我还收到警告:

\n
$ ubuntu-drivers devices\nWARNING:root:_pkg_get_support nvidia-driver-390: package has invalid Support Legacyheader, cannot determine support level\n== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==\nmodalias : pci:v000010DEd00001200sv00001043sd000083ACbc03sc00i00\nvendor   : NVIDIA Corporation\nmodel    : GF114 [GeForce GTX 560 Ti]\ndriver   : nvidia-340 - distro non-free\ndriver   : nvidia-driver-390 - distro non-free recommended\ndriver   : xserver-xorg-video-nouveau - distro free builtin\n
Run Code Online (Sandbox Code Playgroud)\n

我运行一个较新的内核,以便与 Intel 2.5G 以太网 IGC 驱动程序联网。我可以启动到内核 5.4.0.91-generic,但随后我将没有网络。

\n
$ uname -a\nLinux Kairos 5.13.0-22-generic #22~20.04.1-Ubuntu SMP Tue Nov 9 15:07:24 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux\n
Run Code Online (Sandbox Code Playgroud)\n

此外,dkm给出:

\n
$ dkms status\nnvidia, 390.144, 5.13.0-22-generic, x86_64: installed\nnvidia, 390.144, 5.4.0-91-generic, x86_64: built\n
Run Code Online (Sandbox Code Playgroud)\n

/var/lib/dkms/显示:

\n
$ tree /var/lib/dkms/\n/var/lib/dkms/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dkms_dbversion\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nvidia\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 390.144\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 5.13.0-22-generic\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 x86_64\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 log\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 make.log\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nvidia-drm.ko\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nvidia.ko\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nvidia-modeset.ko\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 5.4.0-91-generic\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 x86_64\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 log\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 make.log\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nvidia-drm.ko\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nvidia.ko\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nvidia-modeset.ko\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nvidia-uvm.ko\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 source -> /usr/src/nvidia-390.144\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kernel-5.13.0-22-generic-x86_64 -> 390.144/5.13.0-22-generic/x86_64\n\n12 directories, 10 files\n
Run Code Online (Sandbox Code Playgroud)\n

modinfo nvidia返回:

\n
filename:       /lib/modules/5.13.0-22-generic/updates/dkms/nvidia.ko\nalias:          char-major-195-*\nversion:        390.144\nsupported:      external\nlicense:        NVIDIA\nsrcversion:     D635B75826DE88984609590\nalias:          pci:v000010DEd00000E00sv*sd*bc04sc80i00*\nalias:          pci:v000010DEd*sv*sd*bc03sc02i00*\nalias:          pci:v000010DEd*sv*sd*bc03sc00i00*\ndepends:        ipmi_msghandler\nretpoline:      Y\nname:           nvidia\nvermagic:       5.13.0-22-generic SMP mod_unload modversions \nparm:           NVreg_Mobile:int\nparm:           NVreg_ResmanDebugLevel:int\nparm:           NVreg_RmLogonRC:int\nparm:           NVreg_ModifyDeviceFiles:int\nparm:           NVreg_DeviceFileUID:int\nparm:           NVreg_DeviceFileGID:int\nparm:           NVreg_DeviceFileMode:int\nparm:           NVreg_UpdateMemoryTypes:int\nparm:           NVreg_InitializeSystemMemoryAllocations:int\nparm:           NVreg_UsePageAttributeTable:int\nparm:           NVreg_MapRegistersEarly:int\nparm:           NVreg_RegisterForACPIEvents:int\nparm:           NVreg_CheckPCIConfigSpace:int\nparm:           NVreg_EnablePCIeGen3:int\nparm:           NVreg_EnableMSI:int\nparm:           NVreg_TCEBypassMode:int\nparm:           NVreg_UseThreadedInterrupts:int\nparm:           NVreg_EnableStreamMemOPs:int\nparm:           NVreg_EnableBacklightHandler:int\nparm:           NVreg_RestrictProfilingToAdminUsers:int\nparm:           NVreg_EnableUserNUMAManagement:int\nparm:           NVreg_EnableIBMNPURelaxedOrderingMode:int\nparm:           NVreg_MemoryPoolSize:int\nparm:           NVreg_KMallocHeapMaxSize:int\nparm:           NVreg_VMallocHeapMaxSize:int\nparm:           NVreg_IgnoreMMIOCheck:int\nparm:           NVreg_RegistryDwords:charp\nparm:           NVreg_RegistryDwordsPerDevice:charp\nparm:           NVreg_RmMsg:charp\nparm:           NVreg_AssignGpus:charp\n
Run Code Online (Sandbox Code Playgroud)\n

我发现很多关于如何将驱动程序升级到最新版本(目前为495)的帖子,但是它并不能解决我的问题,而且该版本不支持我的显卡。只有版本 390 可以工作,但随后我收到 API 不匹配错误。

\n

lad*_*dar 22

我遇到了这个问题,但它与 CUDA 无关(某些系统上没有安装 CUDA)。在我的系统上,内核模块被嵌入到压缩的内核映像中,然后在引导过程的早期加载。这些嵌入式但过时的模块将阻止加载正确的、新安装/编译的独立模块文件。您可以轻松确认这个问题。检查以下内容:

cat /proc/driver/nvidia/version
cat /sys/module/nvidia/version
Run Code Online (Sandbox Code Playgroud)

如果加载的模块与驱动程序版本不匹配,您也可能会遇到此问题。假设正确的内核模块可用,您可以通过运行来确认(假设您的发行版使用 DKMS):

dkms status
Run Code Online (Sandbox Code Playgroud)

对我来说,修复只涉及重新生成我的内核映像。在 Red Hat 发行版及其衍生版本(Fedora、CentOS、Alma、Rocky、Oracle 等)上,您可以运行:

(rpm -q --qf="%{VERSION}-%{RELEASE}.%{ARCH}\n" --whatprovides kernel ; uname -r) | \
sort | uniq | while read KERNEL ; do 
  dracut -f "/boot/initramfs-${KERNEL}.img" "${KERNEL}" || exit 1
done
Run Code Online (Sandbox Code Playgroud)

这将为每个已安装的内核重新生成映像。对于 Debian 发行版及其衍生版本(包括 Ubuntu)上的等效逻辑,您可以运行:

for kernel in /boot/config-*; do 
  [ -f "$kernel" ] || continue
  KERNEL=${kernel#*-}
  mkinitramfs -o "/boot/initrd.img-${KERNEL}.img" "${KERNEL}" || exit 1
done
Run Code Online (Sandbox Code Playgroud)

然后重新启动。您还可以暂时解决该问题,方法是使用 rmmod 或 modprobe 手动删除(卸载)NVIDIA 模块,然后重新加载它们。当您这样做时,modprobe 将使用独立的内核模块,该模块应与您安装的驱动程序版本相匹配。

PS:当我从 470.x 驱动程序升级到 510.x 驱动程序(最近成为推荐的稳定安装版本)时,我遇到了这个问题。我在使用 460.x 和 470.x 驱动程序版本时从未遇到过此问题。

PPS 编辑 - 回顾命令:

# Red Hat Distros
dracut --regenerate-all --force

# Debian Distros
update-initramfs -u -k all
Run Code Online (Sandbox Code Playgroud)

需要的打字量比我最初发布的要少,并且应该适用于大多数人。


Leó*_*ert 5

我找到了解决方案,现在 Kubuntu 按预期正常启动。

在开始之前,我想确认加载的内核模块和新安装的独立模块文件之间的版本不匹配。用户ladar在他的回答中表明以下将证实这个问题

$ cat /proc/driver/nvidia/version
$ cat /sys/module/nvidia/version
Run Code Online (Sandbox Code Playgroud)

首先,我清除了所有驱动程序和库

$ sudo apt purge nvidia-* && sudo apt purge libnvidia-*
Run Code Online (Sandbox Code Playgroud)

然后我检查是否没有安装任何 nvidia 驱动程序。以下内容没有返回任何内容,因为它应该

$ dpkg -l nvidia-*|grep ^ii
Run Code Online (Sandbox Code Playgroud)

然后,我从 https://www.nvidia.com/Download/driverResults.aspx/177153/en-us下载了适用于我的Geforce GTX 560 Ti的正确版本的驱动程序。您应该从https://www.nvidia.com/Download/index.aspx?lang=en-us选择驱动程序。

之后我重新启动进入终端

$ sudo init 3
Run Code Online (Sandbox Code Playgroud)

我在命令行上登录并转到刚刚下载驱动程序的目录,然后更改权限并运行安装文件(它可能会询问一些配置问题),然后重新启动

$ cd $HOME/Downloads/Nvidia/
$ chmod a+x NVIDIA-Linux-x86_64-390.144.run
$ sudo ./NVIDIA-Linux-x86_64-390.144.run 
$ sudo reboot
Run Code Online (Sandbox Code Playgroud)

我现在有了正常的 SSDM 登录屏幕,登录后我的双屏幕都具有正确的分辨率。