Debian 安装 Nvidia 显卡驱动
本文尚未完成,因为有群友现在需要装显卡,暂时发布了预览版本。后续会补充完善,并发到其它平台。有任何问题或建议可以留言。
2024.6.2 16:40 第0次更新
2024.6.2 23:20 第1次更新:文章细微调整,添加了桌面启动项配置显卡启动
0 背景信息
联想笔记本买了快一年了,最近给电脑换了 Windows/Linux 双系统,在此之前我就已经充分熟悉 Debian 了。关于从零配置双系统并逐渐过渡到单系统的整个过程,我后续有空会专门开文章再写写。目前先解决被广泛认为配置 Linux 系统的一大拦路虎——安装 NVIDIA 显卡驱动。驱动这种东西一天一个样,现在在网上搜到的许多教程很可能已经过时了,这篇算是比较新的了。
当然我只解决我遇到的问题,安装驱动这玩意儿属于玄学,每个人可能都会遇上各不相同的奇奇怪怪的问题,因此本文仅供参考。其更大的价值在于参考文献,如果你遇上了其它问题,不妨先看看本文提供的链接,大部分都是官方文档。我把仔细读过的所有资料都写出来了,没资料的部分都是靠自己摸索出来的。本文第一参考文献 NvidiaGraphicsDrivers - Debian Wiki
在开始之前,请检查你的情况是否和我类似。不一样的话也能继续阅读,但对你有价值的部分需要酌情筛选。另外本文所有的图片只是为了展示效果,而非必要的,如果你加载不出来图片也没关系,不影响阅读。
另外说一下,如果你的显卡型号非常新(比如即将出的 50 系列显卡),本文很可能不再适用,因为 Debian 官方软件仓库的显卡驱动更新很缓慢。你需要从 Nvidia 的官网下载驱动,这超出了本文范围,请自行搜索解决办法。
电脑信息关键词:笔记本, 双显卡, RTX 3050
Linux 系统信息关键词:Debian Testing, KDE Plasma, Wayland
更详细的信息……啥也别说了,Fastfetch 启动!
➜ ~ fastfetch
_,met$$$$$gg. fungus@debian
,g$$$$$$$$$$$$$$$P. -------------
,g$$P" """Y$$.". OS: Debian GNU/Linux trixie trixie/sid x86_64
,$$P' `$$$. Host: 21HX (ThinkBook 16 G5+ IRH)
',$$P ,ggs. `$$b: Kernel: Linux 6.7.12-amd64
`d$$' ,$P"' . $$$ Uptime: 10 mins
$$P d$' , $$$P Packages: 2985 (dpkg), 11 (flatpak)
$$: $. - ,d$$' Shell: zsh 5.9
$$; Y$b._ _,d$P' Display (BOE0AC1): 2560x1600 @ 120Hz (as 1280x800) [Built-in]
Y$$. `.`"Y$$$$P"' DE: KDE Plasma 5.27.11
`$$b "-.__ WM: KWin (Wayland)
`Y$$ WM Theme: Breeze
`Y$$. Theme: Breeze (Dark) [QT], Breeze [GTK2/3/4]
`$$b. Icons: breeze-dark [QT], breeze-dark [GTK2/3/4]
`Y$$b. Font: Noto Sans (11pt) [QT], Noto Sans (11pt) [GTK2/3/4]
`"Y$b._ Cursor: breeze (24px)
`""" Terminal: kitty 0.34.1
Terminal Font: Courier10PitchBT-Roman (20pt)
CPU: 13th Gen Intel(R) Core(TM) i7-13700H (20) @ 5.00 GHz
GPU 1: NVIDIA GeForce RTX 3050 4GB Laptop GPU [Discrete]
GPU 2: Intel Iris Xe Graphics @ 1.50 GHz [Integrated]
Memory: 2.46 GiB / 31.08 GiB (8%)
Swap: 0 B / 14.90 GiB (0%)
Disk (/): 3.46 GiB / 12.82 GiB (27%) - ext4
Disk (/data): 16.14 GiB / 174.65 GiB (9%) - ext4
Disk (/home): 5.90 GiB / 36.37 GiB (16%) - ext4
Disk (/opt): 9.04 GiB / 28.67 GiB (32%) - ext4
Disk (/usr): 12.36 GiB / 55.69 GiB (22%) - ext4
Local IP (wlp0s20f3): 10.4.34.142/17 *
Battery: 100% [AC Connected]
Locale: zh_CN.UTF-8
1 预处理
首先禁用电脑的安全启动(Secure Boot)模式,它会检查显卡的数字签名,对安装显卡驱动造成阻碍。不关也行,除非你有足够的水平处理。
根据 SecureBoot - Debian Wiki,检查安全启动是否开启
$ sudo mokutil --sb-state
Secure Boot enabled
禁用安全启动
sudo mokutil --disable-validation
输入并确认密码,记录好这个密码。
说起来这是官方文档给的步骤,不过我后来发现似乎没啥用,主要还是靠下面的步骤。
接下来重启电脑,准备进入引导界面设置了。看到 Debian 那个经典的绿色引导界面后,选择 UEFI Firmware Settings 然后进入。进入后每个人的电脑可能会有不同的界面,以我的 ThinkBook 为例:进入安全设置,将安全启动切换为关闭,按 F10保存退出。重启后再次输入上述的安全启动检查命令看看是否 disable

然后确保自己的软件仓库内包含了所有非自由版本,输入
sudo apt edit-sources
后查看是否包含诸如
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main non-free-firmware non-free contrib
deb https://security.debian.org/debian-security/ trixie-security main non-free-firmware non-free contrib
这一类的仓库,镜像站点可以是别的,总之包含 main, non-free-firmware, non-free, contrib 这几个仓库就行了。
另外说一嘴其实我是比较极端的开源信徒,电脑里几乎全是开源的自由软件。个别几个闭源的则使用 Flatpak 管理它们,并放在了专门的硬盘分区里。但是固件驱动确实没办法,如果不是因为它们我并不想加入 main 以外的仓库。
2 安装驱动
检查显卡型号
$ sudo apt install nvidia-detect
$ nvidia-detect
Detected NVIDIA GPUs:
01:00.0 3D controller [0302]: NVIDIA Corporation GA107M [GeForce RTX 3050 4GB Laptop GPU] [10de:25ab] (rev a1)
Checking card: NVIDIA Corporation GA107M [GeForce RTX 3050 4GB Laptop GPU] (rev a1)
Your card is supported by the default drivers.
It is recommended to install the
nvidia-driver
package.
安装内核头文件和相关闭源驱动
sudo apt install linux-headers-amd64 nvidia-driver firmware-misc-nonfree
系统会提示与现有的开源驱动 nouveau 冲突,这是当年因为 NVIDIA 官方不提供 Linux 驱动而催使社区反编译出来的。也因为是反编译的,性能和兼容性不太好,因此我们需要禁用它而采用如今官方提供的闭源驱动。

重启后 Debian 会自动帮你禁用(这也是 Debian 12 安装 Nvidia 驱动时,相较于其它 Linux 发行版比较方便之处——无需手动禁用)。执行以下命令检查是否确实被禁用了,成功的话应该不会显示任何东西。
lsmod | grep nouveau
若显示了一些信息说明失败了,此时就需要手动禁用了。根据 Disable Nouveau - NVIDIA Docs 的步骤操作(由于我不需要,所以手动禁用我并没有亲自验证过)。
复制以下命令禁用它
cat <<EOF | sudo tee /etc/modprobe.d/blacklist-nouveau.conf blacklist nouveau options nouveau modeset=0 EOF重载内存文件系统并重启操作系统
sudo update-initramfs -u sudo reboot
如果你使用 Wayland,根据 Plasma/Wayland/Nvidia - KDE Community Wiki 的教程,还需要启用 DRM 内核级显示模式设置:
sudo apt install libnvidia-egl-wayland1
cat /sys/module/nvidia_drm/parameters/modeset
看看是否显示 Y,否则输入
echo options nvidia_drm modeset=1 | sudo tee /etc/modprobe.d/nvidia_drm.conf
sudo update-initramfs -u
可能会发出一些警告,参见本文第五节。
3 显卡监测与配置
一切就绪后看看驱动是否安装成功:输入以下 nvidia-smi 命令,会显示当前显卡的信息,以及哪些进程正在使用GPU和它们占用的显存。
Sun Jun 2 12:58:57 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.08 Driver Version: 535.161.08 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 3050 ... On | 00000000:01:00.0 Off | N/A |
| N/A 41C P8 6W / 35W | 32MiB / 4096MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1486 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 9917 G /usr/bin/kitty 23MiB |
+---------------------------------------------------------------------------------------+
如果你想持续监测上面的信息,可以输入以下命令(Ctrl+C 退出)
watch -d -n 0.5 nvidia-smi
按下 Meta 键(在我的键盘上对应 start 键,你的可能是 win 或 command 键),在应用程序启动器的“系统”类别内应该能发现“NVIDIA X 服务器设置”,打开后会看到一些显卡信息。

这也能设置一些程序启动时采用的显卡策略,当然你也可以用 nvidia-settings 命令来配置。参见 NVIDIA Accelerated Linux Graphics Driver README and Installation Guide 来找到对应驱动版本的 README 来了解更多细节及选项。
还有很多第三方 GPU 监测的 TUI 工具,比如 nvtop, nvitop, gpustat, conky, glances 等。这些在 Debian 的官方源里都有,可以选一个你喜欢的,详见讨论 GPU usage monitoring (CUDA) - Unix & Linux Stack Exchange 和 software recommendation - How to measure GPU usage? - Ask Ubuntu。我个人安装了 nvtop 和 nvitop。前者简单清楚展示了 GPU 使用率等信息,而且会在应用程序启动器里留一个图标,比较方便。

而 nvitop 则更加强大,它可以单独显示每一个进程的具体情况。
4 双显卡方案 (NVIDIA Optimus)
如果你使用 X11 桌面协议,理论上应该不用看这一章了,因为它会给你自动配好。如果你和我一样是 Wayland 用户,或者有手动配置的需求,继续看下去。
4.1 介绍
即使驱动安装完毕,默认情况下软件仍然采用核显进行渲染,而我们想要在合适的场合让独显工作,就得采用双显卡方案 (NVIDIA Optimus - Debian Wiki)。首先确认自己的显卡是否为双显卡,比如我的就是 Intel 核显与 RTX 3050 Laptop 独显。
$ lspci -nn | egrep -i "3d|display|vga"
00:02.0 VGA compatible controller [0300]: Intel Corporation Raptor Lake-P [Iris Xe Graphics] [8086:a7a0] (rev 04)
00:06.2 PCI bridge [0604]: Intel Corporation Device [8086:a73d]
01:00.0 3D controller [0302]: NVIDIA Corporation GA107M [GeForce RTX 3050 4GB Laptop GPU] [10de:25ab] (rev a1)
双显卡方案有很多具体的实现(NVIDIA Optimus - ArchWiki),我们推荐采用 PRIME 渲染分载技术 (NVIDIA PRIME Render Offload),官方驱动在 435.17版本 后支持的这个方案。这是一种混合显卡渲染技术,它让你默认情况下使用核显,同时可以让独显在需要的时候运行特定的程序。如此一来能节约笔记本的电量,且满足特殊场景的需求(比如游戏、3D建模)。
4.2 显卡与电源
现在的显卡驱动支持在不用独显的时候关闭电源以减少耗电,对于架构为 Ampere 或更高的显卡,其自动省电功能被默认设定了。输入以下命令查看自己显卡的架构
$ nvidia-smi -q | grep Architecture
Product Architecture : Ampere
非安培架构的显卡(比如 Kepler 或 Maxwell 等)需要手动配置,在此不赘述,因为我没试过,出门左转 PRIME # NVIDIA - ArchWiki
简单说一下如何查看显卡的电源状态,不感兴趣的可以跳到下一节了。
cat /sys/class/drm/card*/device/power_state
查看显卡的电源状态,理论上第一行对应核显,第二行对应独显。根据 PCI Power Management — The Linux Kernel documentation 的说法,D0 表示活跃,数字越大越冷淡,D3 基本上就是休眠了。
还有个办法更准确:
$ cd /sys/bus/pci/devices/0000:01:00.0/power
$ cat runtime_status
active
$ cat runtime_suspended_time; sleep 3; cat runtime_suspended_time
1172
1172
解释一下,如果 runtime_status 显示 suspended 则独显断电,running 则独显开启;如果是 active 则根据后面的两个数字判断,相同则开启。
4.3 启动参数
用显卡启动 Wayland 程序可以在启动命令前加 __NV_PRIME_RENDER_OFFLOAD=1 参数,其中数字1来源于前文用 nvtop 工具查看的对应的显卡序号,一般你我应该都是这个数字。
如果是 XWayland 或者说 X11 桌面下的应用那就再加一个 __GLX_VENDOR_LIBRARY_NAME=nvidia 参数。
其中 GLX 是目前应用最广泛的开源图形渲染接口 OpenGL 在 X11 协议上的一种实现,而 Wayland 协议的实现是 EGL(其实我这个说法也不是很准确,凑活看吧)。
当然如果你不是很确定,或者就是使用的 X11 桌面,可以总是使用这两个参数。比如我要用让 kitty(一个支持 GPU 渲染的终端)启用独显(在 Wayland 桌面里实际上不需要第二个参数):
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia kitty
如果你很好奇哪些是 Wayland 程序哪些是 X11 程序,并且和我一样使用 KDE 桌面,由于其中包含了 KWin,可以输入以下命令查看。
qdbus org.kde.KWin /KWin org.kde.KWin.showDebugConsole
或者在别的桌面可以用这个命令列出 XWayland 程序。(来源:Wayland # XWayland - ArchWiki)
xlsclients -l
每次启动都要在命令行手动添加环境变量是非常麻烦的,我们把变量嵌入到桌面项内,这样每次点击应用程序的图标后就可以自动启用显卡了。
如果你对桌面项的概念还不是特别清楚,点击前面的链接进去简单看下,我不在这里重复说明了。简单说下操作步骤
- 一般按下
Meta键打开应用程序启动器,会找到常见应用的启动项; - 右击你要编辑的应用图标,点击编辑应用程序;
- 点击上面菜单中的应用程序(A);
- 点击高级选项(V),会弹出一个窗口;
- 选中使用独立显卡运行。

这其实等效于在启动项的 .desktop 文件中设置参数值 X-KDE-RunOnDiscreteGpu=true
5 可能的后遗症
在系统软件更新时,或者当我们检查初始化内存文件系统 (initramfs) 输入
sudo update-initramfs -u
后可能会警告诸如:
W: Possible missing firmware /lib/firmware/i915/mtl_gsc_1.bin for module i915
W: Possible missing firmware /lib/firmware/i915/mtl_huc_gsc.bin for module i915
W: Possible missing firmware /lib/firmware/i915/mtl_guc_70.bin for module i915
这是显卡缺 i915 的某些驱动所致。其实并无什么影响,这些并不是必需的,如果你不是强迫症可以无视它们。[SOLVED] Possible missing firmware - why? - Debian User Forums
为了详细说明这一点,我们可以查找上述固件是否存在,无结果则不存在:
sudo apt install apt-file
sudo apt-file update
apt-file search mtl_gsc # 这是上面警告里出现的
为解决上述问题,理论上安装 firmware-linux 即可。(来源:debian - Possible missing firmware /lib/firmware/i915/* for module i915 - Unix & Linux Stack Exchange)
但事情总不如我们所愿,装了以后发现没啥卵用,可能需要手动添加了。到 Linux 内核存档 (i915) 里下载缺失的二进制文件,并把它们放在 /lib/firmware/i915/,然后更新看看。为了大家方便,我写了个脚本(记得挂梯子):
echo $(sudo update-initramfs -u \
2>&1 >/dev/null) | \
sed 's/firmware\//firmware\/\n/g' | \
grep -o '^.*bin' | \
xargs -I {} \
sudo -E wget -O /lib/firmware/{} \
https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/{}
直接复制到终端,之后可以再次输入 sudo update-initramfs -u 查看结果。不过即使添加过后 apt-file 仍无法找到它们,但至少解决掉了烦人的警告qwq
如果说上面的还能理解,那安装驱动后,我电脑发生的以下事情就很诡异了,我无法解释为什么。
- 每次开机后鼠标和键盘等蓝牙都无法再次连上,必须把它们删除重连,非常麻烦。这个问题目前尚未解决,不知是否与安全启动有关。我这么猜测是因为连 Windows 系统都连不上蓝牙,甚至情况可能更糟。
- 休眠按钮冒出来了,而之前只有睡眠,虽说这是个好事。
- XWayland 程序比如 Firefox 不能直接使用 Fcitx5 了,不过可以手动加个参数
XMODIFIERS=@im=fcitx或者把参数写到/etc/environment里。

浙公网安备 33010602011771号