Nvidia 驱动程序,一个令 Linux 爱好者闻风丧胆的词语,它不同于开源的Nouveau驱动开箱即用,也不如AMD的显卡驱动那样安装简单。很多人——包括半年前的我,都禁不住疑惑,这个驱动为什么这么容易崩溃?
在我更换工作站到 Arch Linux 后,我终于有了机会去探索这个问题。实际上,如果你的大部分程序处于稳定版,并正确配置了所有关于显卡的设置,Nvidia 驱动程序完全可以正常工作。当然,我并不是说 Nvidia 驱动的崩溃全部都是使用者的问题,毕竟该驱动的不稳定性以及兼容性有目共睹。我只是想证明,Nvidia 驱动并不像传说中那么难以使用。
安装
不管在别的系统上如何折磨人,在 Arch Linux 的世界里,这一切都是如此简单,只要你使用的是一般的linux
内核,安装驱动只需要一个命令:
1 | sudo pacman -S nvidia nvidia-utils |
如果你用的是其他内核、多内核甚至是自己编译的内核,你觉得会很复杂吗?不,只需要把上述命令中的nvidia
换成nvidia-dkms
即可。
当你重启之后,可能会有两个结果:一是你的系统正常启动,你看到了 SDDM 、GDM 或者 LightDM 的登录界面;二是你的系统卡在了启动界面,没有任何反应。
对于前者来说,恭喜你,你的驱动安装成功了。对于后者,也恭喜你,你的驱动安装成功了,只是你的系统没有正确加载驱动。这时候,你需要进入 tty,并查看一些配置是否正确。
这篇文章并不是一个错误排查指南,我只会告诉你一些浅显的东西,Nvidia 驱动如何加载、如何参与你桌面的启动、如何查看驱动是否加载等等。
Nvidia 驱动的加载流程
这里假定你使用的是 GRUB2 引导加载程序。
当你按下启动键,您首先看到的是您厂商的 BIOS/UEFI 启动界面,然后是 GRUB 启动界面。
什么是 GRUB?GRUB 是一个引导加载程序,它会让你选择你想要启动的系统(或者内核)。在这个阶段,Nvidia 驱动并没有加载。但你仍然可以添加一些参数来控制 Nvidia 驱动的行为,这些参数被称为内核引导参数。
最经典的莫过于nvidia_drm.modeset
参数,它能够启用 DRM 内核级显示模式(这是一个显示管理系统,不在今天的讨论范围内)。你可以打开/etc/default/grub
文件,找到GRUB_CMDLINE_LINUX_DEFAULT
这一行,添加该条目:
1 | GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 nowatchdog nvidia_drm.modeset=1" |
然后运行sudo grub-mkconfig -o /boot/grub/grub.cfg
来更新 GRUB 配置文件。
还有一种添加模块参数的方法,你可以在/etc/modprobe.d
目录下创建一个文件,比如nvidia.conf
,添加如下内容:
1 | options nvidia-drm modeset=1 |
接下来是内核启动阶段,其存在一个早启动阶段,你可以指定这个阶段启动的模块,这些模块会最早加载到内核中。你可以打开/etc/mkinitcpio.conf
文件,找到MODULES
这一行,添加nvidia nvidia_modeset nvidia_uvm nvidia_drm
这几个模块:
1 | MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm) |
然后运行sudo mkinitcpio -P
来更新内核镜像。
如果这些内容没有被指定,一般情况下,显卡驱动可能会晚于显示管理器启动,这样会导致你的系统卡在启动界面。
与显示管理器的交互
这里必须要声明一点,显示管理器不是你的桌面!大部分情况下,它指代你的登录界面。
一般情况下,显示管理器根据其所使用的显示协议,有不同的方式来加载 Nvidia 驱动。
对于经典的Xorg服务器,它会先检测显卡驱动,并在大部分情况下选择 Nouveau 驱动。但且慢!我们没有提及一个重要的问题,nvidia
软件包做了很多幕后工作,其中之一就是对 Xorg 服务器的配置。
值得一提的是,
nvidia
软件包会自动禁用 Nouveau 驱动,如果你手动移除了其针对 Xorg 的配置文件,Xorg毫无疑问地会加载失败。
你可以在/usr/share/X11/xorg.conf.d
目录下找到一个名为10-nvidia-drm-outputclass.conf
的文件,这个文件会告诉 Xorg 服务器使用 Nvidia 驱动。如果你没有这个文件,你可以手动创建一个:
1 | Section "OutputClass" |
这个文件会告诉 Xorg 服务器使用 Nvidia 驱动,而不是 Nouveau 驱动。
可笑的是,有相当一部分人会通过移除这个文件来”解决“Nvidia驱动的问题,这是一个错误的做法。
在这种情况下,通过 Xorg 启动桌面后,你会发现nvidia-smi
命令的输出中永远都包含Xorg
进程,这是完全正常的现象。
为什么?因为一切的页面都会通过 Xorg 服务器来显示,我们不可避免地会让软件运行在 Nvidia 显卡上(特别是对于游戏程序)。
而对于 Wayland 来说,一般来说设置内核引导参数就足够了,如果在这种情况下仍然无法进入桌面,请查看你的混成器文档。
多显卡
很多笔记本都是经典的双显卡设计,一个是 Intel 集成显卡,一个是 Nvidia 独立显卡。这种情况下,在上述配置完备的情况下,只要安装nvidia-prime
软件包,你就可以指定程序使用哪个显卡。
1 | sudo pacman -S nvidia-prime |
要使用 Nvidia 显卡,你可以在程序启动时添加prime-run
前缀:
1 | prime-run glxgears |
这样,你就可以在 Nvidia 显卡上运行程序了。
某些DM或者WM可能会默认使用Nvidia显卡作为渲染设备,为了功耗考虑,你可能需要手动设置以选择Intel显卡作为渲染设备。
对于 Hyprland 来说,它需要一个环境变量来指定使用哪个显卡:
1 | export WLR_DRM_DEVICES=/dev/dri/card0 |
对于不同的DM或者WM,可能需要不同的设置,具体请查看相关文档。
总结
这篇文章并不是错误排查指南,也不是Nvidia驱动指南,正如我开篇提到的,本篇文章只是讲述一些浅显的内容,提供给你修复Nvidia显卡驱动问题的一些思路。
而对于更多的内容,你可以查看 Arch Wiki 上的 Nvidia 驱动页面,它包含了大量的内容,包括错误排查、多显卡设置、性能优化等等。