DesseraLab

Technology exploration and development

0%

Arch Linux - 初探 NVIDIA 显卡驱动

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
2
3
4
5
6
7
8
Section "OutputClass"
Identifier "nvidia"
MatchDriver "nvidia-drm"
Driver "nvidia"
Option "AllowEmptyInitialConfiguration"
ModulePath "/usr/lib/nvidia/xorg"
ModulePath "/usr/lib/xorg/modules"
EndSection

这个文件会告诉 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 驱动页面,它包含了大量的内容,包括错误排查、多显卡设置、性能优化等等。