Debian 13+ NVIDIA 驱动避坑笔记

Nvidia Driver for Debain13+ with Wayland

Nvidia 显卡驱动的安装算是“臭名昭著”,通常有三种来源:Debian 官方仓库,.run 文件,CUDA 仓库。考虑到 CUDA Toolkit 以及 Wayland 支持对高版本驱动的需求,推荐使用 CUDA 仓库来源。

综合诸多教程,以及实际踩坑经验,终于找到一个集大成的博客:Debian 13 + NVIDIA Optimus 笔记本:从零配置 Wayland Explicit Sync 完整指南 ,后续内容主体思路基于该博客,增加开启 Secure Boot 下的 MOK 注册小节。

适用环境

  • 系统 :Debian 13+
  • 桌面 :GNOME Wayland
  • 显卡 :NVIDIA Turing 架构及以后(RTX 20/30/40 系列、A 系列等)
    • nvidia-open 开源内核模块要求 Turing 及以后
    • Pascal/Volta 等更老的卡只能用闭源,走 cuda-drivers 而不是 nvidia-open

基础准备

[!WARNING]
推荐:系统为全新,或彻底清除之前驱动

sudo apt purge 'nvidia-*' 'libnvidia-*' 'cuda-*' 'libcuda*'
sudo apt autoremove --purge

编译工具链

sudo sed -i 's/main/main non-free contrib/g' /etc/apt/sources.list
## Modernised path
# sudo sed -i 's/main/main non-free contrib/g' /etc/apt/sources.list.d/debian.sources
sudo apt update

sudo apt -y install linux-headers-amd64 build-essential dkms

# network install tool in case
sudo apt install wget curl
  • firmware 依赖 contrib、non-free,需添加非自由分支(Modernised 路径为 /etc/apt/sources.list.d/debian.sources
  • linux-headers-amd64:内核头文件的元包,内核升级即 linux-image-amd64 更新时,apt 的依赖关系会强制 linux-headers-amd64 一起更新,从而自动下载对应的新版头文件(避免手动下载 linux-headers-$(uname -r) 补救的麻烦)
  • dkms:自动为新版本的内核重新编译 NVIDIA 驱动模块

[!NOTE]

  • 自 Debian 13 起,内核头文件不会随着内核而自动安装,导致模块编译工具 DKMS 会由于缺少头文件而构建失败
  • linux-headers-$(uname -r) 是当前版本的内核头文件,不会随内核升级自动更新

Cuda 源

cd /tmp
wget https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt update

驱动安装

Cuda 仓库本身提供两种驱动,专有驱动 cuda-driver 和开源驱动 nvidia-open官方文档 描述如下:

  • Proprietary - This is the flavor that NVIDIA has historically shipped and is required for older GPUs from the Maxwell, Pascal, or Volta architectures. The open-source GPU kernel modules are not compatible with these platforms.
  • Open-source - These are published kernel modules that are dual licensed MIT/GPLv2. With every driver release, the source code to the open kernel modules will be published at NVIDIA/open-gpu-kernel-modules and a tarball will be provided at https://download.nvidia.com/XFree86/NVIDIA-kernel-module-source/. These are only for Turing and newer architectures, and this is what you should use if you have one of those architectures.

Starting in the 560 driver release series, the open kernel module flavor is the default and suggested installation.

模拟预检

# check available version
apt-cache policy nvidia-open
# check all thetarget packages
sudo apt-get install --simulate nvidia-open

预期:

  • 没有 unmet dependenciesheld broken packages 错误
  • 移除列表里都是 Debian 自带的 nvidia-* 旧包和 GLX alternative helper(全新系统这一项会是空的)

正式安装

sudo apt install nvidia-open
  • 安装 nvidia-open 会经历:下载 → 卸旧包(如有)→ 装新包 → DKMS 编译 + 签名内核模块 → 重建 initramfs,耗时几分钟,耐心等待
  • 预期:
    • DKMS 必须看到 Building module(s).................. done.
    • 不能有 errors were encountered while processing
    • 留意是否出现 libkmod: ERROR: ... /etc/modprobe.d/nvidia.conf 这类错误

安装验证

  • DKMS:nvidia/<version>, <kernel>, x86_64: installed

    sudo dkms status
    
  • 内核模块文件:nvidia.ko.xz / nvidia-modeset.ko.xz / nvidia-drm.ko.xz / nvidia-peermem.ko.xz / nvidia-uvm.ko.xz

    ls /lib/modules/$(uname -r)/updates/dkms/ | grep nvidia
    
  • 禁用开源驱动:modprobe.d 存在 blacklist nouveau,并打包进 initramfs

    ls -la /etc/modprobe.d/ | grep -iE 'nvidia|nouveau'
    grep -rE 'blacklist[[:space:]]+(nouveau|nova-core)' /etc/modprobe.d/ /usr/lib/modprobe.d/
    sudo lsinitramfs /boot/initrd.img-$(uname -r) | grep -E '/(nvidia\.conf|nouveau\.ko)'
    
  • Modeset:无需任何配置,560 起驱动默认启用 DRM KMS,nvidia-kms.conf 是 Debian 官方仓库包的布局(直接检查见验证章节 Modeset 项)

    ## no output is expected
    grep -rE 'nvidia[-_]drm.*modeset' /etc/modprobe.d/ /usr/lib/modprobe.d/ /boot/grub/grub.cfg
    

Advance

Suspend Service

启用挂起/恢复服务:nvidia-powerdnvidia-suspend-then-hibernate 通常已被包自动启用,前三个一般需要手动 enable

sudo systemctl enable nvidia-suspend.service nvidia-resume.service nvidia-hibernate.service

# check
systemctl is-enabled nvidia-suspend.service nvidia-resume.service nvidia-hibernate.service nvidia-powerd.service nvidia-suspend-then-hibernate.service

MOK

Secure Boot 限制主板 BIOS 只允许运行经过信任签名(通常是微软或硬件厂商)的代码,对于其他代码,需要注册 MOK 生成的密钥,这样被该密钥签名过的 NVIDIA 驱动就能在安全启动开启的情况下正常加载。

  • 检查当前 MOK 请求:清除当前可能挂起的请求

    sudo mokutil --list-new
    sudo mokutil --reset
    
  • 请求:在上面驱动安装过程,会输出自动产生的密钥路径,通常为 /var/lib/dkms/mok.pub

    sudo mokutil --import /var/lib/dkms/mok.pub
    
  • 签名:设置好密码(该密码是临时的)后,重启系统,进入蓝色的 MOK 导入界面,Enroll all keys,无回显输入密码,完成后进入系统

  • 验证:驱动正常加载即签名成功

    nvidia-smi
    

验证

重启登录时注意选择 Wayland 会话(高版本 Gnome 默认移除了 x11 支持)。

  • 驱动加载:正常输出 GPU 信息即成功

    nvidia-smi
    
  • nouveau 禁用:未加载即成功

    lsmod | grep -E '^nouveau' && echo "❌ nouveau loaded" || echo "✅ nouveau not loaded"
    
  • nvidia 内核模块:nvidia / nvidia_modeset / nvidia_drm / nvidia_uvm 应在列

    lsmod | grep -E '^(nvidia|nvidia_modeset|nvidia_drm|nvidia_uvm)'
    
  • Modeset 启用:sysfs 参数为 Y,且 NVIDIA 对应的 card/render 节点存在(modeset 未开启时 nvidia-drm 不会创建这些节点)

    sudo cat /sys/module/nvidia_drm/parameters/modeset
    ls /sys/bus/pci/devices/*/drm/ | grep -E 'card|render'
    
  • Wayland Explicit Sync 间接验证(GNOME Shell 启动日志):

    • Added device '/dev/dri/cardN' (nvidia-drm) using atomic mode setting ,atomic KMS 启用(Explicit Sync 的前提)
    • Created gbm renderer for '/dev/dri/cardN' ,现代 GBM 路径(注意是 gbm ,不是老式 EGLStream
    • Obtained a high priority EGL context
    journalctl -b 0 --user-unit 'org.gnome.Shell*' --no-pager | grep -iE 'atomic|gbm|sync|egl'
    

收尾

  • 移除 Debian 旧 GLX alternative 体系的孤儿包

    sudo apt autoremove
    
  • 清掉 rc 状态残留(已卸但配置文件还在):有输出则 purge

    dpkg -l | awk '/^rc/ && /nvidia|cuda/ {print $2}'
    sudo dpkg --purge $(dpkg -l | awk '/^rc/ && /nvidia|cuda/ {print $2}')
    
  • 清掉旧 Debian nvidia-alternative 留下的目录

    sudo rm -rf /etc/nvidia
    

总结

当前方案配置的核心思路是绕过 Debian stable 的版本冻结 ,直接从 NVIDIA 官方 CUDA APT 仓库拿现代驱动,配合 nvidia-open 开源内核模块,让 GNOME Wayland 跑在 Explicit Sync 路径上,与安装 cuda-driver 相比,Wayland 支持更加完善与方便。

后续维护

  • 内核更新 :DKMS 自动为新内核重编 nvidia 模块,重启前可 dkms status 确认看到 installed
  • 驱动版本升级 :CUDA 仓库会持续推送新 nvidia-open 版本, sudo apt update && sudo apt upgrade 即可(不要回头用 Debian backports 的 nvidia-driver ,会被版本降级冲突卡住)
  • CUDA Toolkit :CUDA 仓库已引入,sudo apt install cuda-toolkit 即会安装最新版本(理论上是与仓库 driver 版本适配的)

不需要做的事

下面这些操作在一些早期教程里能看到,但 nvidia-open 路线下不再需要 :

  • :cross_mark:/etc/gdm3/daemon.conf 强开 Wayland —— NVIDIA 现代驱动下 GDM 会自动用 Wayland
  • :cross_mark: 注释 /usr/lib/udev/rules.d/61-gdm.rules —— 同上
  • :cross_mark: 改 GRUB cmdline 加 nvidia-drm.modeset=1 —— 560 起驱动默认启用 DRM KMS,CUDA 仓库 610 实测无需任何配置(modprobe.d 中无该选项)
  • :cross_mark: 手动写 /etc/X11/xorg.conf —— 让 OutputClass 自动管
  • :cross_mark:nvidia-driver (Debian 仓库)—— 会和 CUDA 仓库冲突
  • :cross_mark:.run 安装器 —— Wayland 场景排错痛苦,不推荐

参考资料


  1. 官方无 testing 专用源,对此类跨版本用法是 “a bit of a dirty hack. Proceed at your own risk”,并警告 Testing/Unstable 的内核可能超前于驱动,风险自担,Debian 14 (Forky) 源就绪后应切换。 ↩︎

2 个赞