2379 字
12 分钟
为debian12安装N卡驱动避坑笔记

2024-12-27:此帖作废,傻逼NVIDIA

改用linux系统后,最大的问题莫过于闭源的N卡驱动不兼容所带来的一系列问题. 然后我的桌面环境还是wayland, 更添加了一笔不稳定性. 为了别累着集显, 这个问题还是要解决一下的.

我的系统配置#


Operating System: Debian GNU/Linux 12
KDE Plasma Version: 5.27.5
KDE Frameworks Version: 5.103.0
Qt Version: 5.15.8
Kernel Version: 6.1.0-23-amd64 (64-bit)
Graphics Platform: Wayland
Processors: 12 × 11th Gen Intel® Core™ i5-11400H @ 2.70GHz
Memory: 15.4 GiB of RAM
Graphics Processor: Mesa Intel® UHD Graphics
Manufacturer: Acer
Product Name: Nitro AN515-57
System Version: V1.17

在系统初装时要解决的问题#

添加sudoers#

进入/etc/sudoers中, 仿照root的权限来添加自己的账户.

# User privilege specification
root ALL=(ALL:ALL) ALL
<用户名> ALL=(ALL:ALL) ALL

添加非free源#

deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware添加到/etc/apt/sources.list中.

  • main: 完全自由的软件包,符合 Debian 自由软件指导原则.
  • contrib: 自由软件包,但依赖非自由软件.
  • non-free: 非自由软件包,不符合 Debian 自由软件指导原则.
  • non-free-firmware: 非自由的硬件固件包.

安装内核头文件(坑)#

将内核头文件补全, 防止驱动安装失败或不完整.

sudo apt install linux-headers-$(uname -r)

检查本地显卡属性(安装前准备)#

查看显卡型号#

使用lspci -nn | egrep -i "3d|display|vga"来查看本机的显卡型号. 这句话的含义是列出所有挂在pci总线上的设备, 然后筛选出来含有3d之类字样的设备(也就是显卡).

在这里我的输出如下, 可以看到集显, 独显和一个不知道为什么会在这里的sata控制器, 不用管它. 在这里证明了机身上确实是连接着显卡的.

0000:00:02.0 VGA compatible controller [0300]: Intel Corporation TigerLake-H GT1 [UHD Graphics] [8086:9a68] (rev 01)
0000:01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106M [GeForce RTX 3060 Mobile / Max-Q] [10de:2520] (rev a1)
10000:e0:17.0 SATA controller [0106]: Intel Corporation Tiger Lake SATA AHCI Controller [8086:43d3] (rev 11)

使用nvidia-detect检查所需安装的版本#

使用sudo apt update && sudo apt-get install nvidia-detect && nvidia-detect来直接查看输出.

可以看到我的输出如下所示.

Detected NVIDIA GPUs:
0000:01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106M [GeForce RTX 3060 Mobile / Max-Q] [10de:2520] (rev a1)

Checking card: 00.0 VGA compatible controller
Your card is supported by all driver versions.
Your card is also supported by the Tesla 470 drivers series.
It is recommended to install the
    nvidia-driver
package.

我们只需要看它推荐安装的驱动包名就好了, 这里推荐的是nvidia-driver. 于是接下来选择安装它.

安装驱动#

1. 检查BIOS/UEFI设置是否为安全启动(坑)#

概括: 关闭安全启动.

在部分主板中(比如宏碁暗影骑士擎的阉割bios), 安全启动是默认勾选的. 这会阻碍启动内核时n卡驱动的正常加载. 详情可参考 wiki 对这一点的讲解SecureBoot.

简单来说, 就是某些 bios 会要求系统启动时验证系统的完整性. 而n卡驱动由于其闭源的特性, 没有集成在内核中(废话, 要不然也不用自己手动装了), 只能通过 DKMS(动态内核模块系统) 来和内核通讯. 这时候如果驱动模块没有被签名, bios 就会拒绝将其加载, 进而导致两种可能的情况: 一, 模块加载但系统进入之后就被卸载; 二, 模块无法加载, 只能进入 tty2 卸载驱动. 两种情况都无法使显卡生效. 而手动为其签名相对复杂, 且可能导致第二种情况, 相比简单关闭安全启动来说有些得不偿失. 因此在这里我选择了关闭安全启动.(其实是没搞清楚 mokutil 到底怎么用..)如果实在有需要, 在这里可以参考这些资料:

2. 安装驱动#

假设nvidia-detect提示建议安装nvidia-driver, 那么直接安装以下包(否则替换):

# apt update
# apt install nvidia-driver firmware-misc-nonfree nvidia-smi

在此之后, DKMS将通过 nvidia-kernel-dkms 软件包自动构建 nvidia 模块(如果前面没有补全头文件这里就会炸). 同时这也就是关闭安全启动的原因.

检查驱动安装情况以及打开#

为了确保N卡驱动能在 Plasma wayland 上正常使用, 还需要一些额外的配置. 这里参考 Plasma 社区所给的教程: https://community.kde.org/Plasma/Wayland/Nvidia

1. 首先满足以下前提条件#

  1. Plasma 版本:确保使用 Plasma 5.20.2 及以上.
  2. NVIDIA 驱动程序:确保 NVIDIA 驱动程序不低于 495.44 版本, KWin 不再与早期版本兼容.
  3. Qt 版本:确保使用最新版本的 Qt,至少需要 Qt5.15.0 或包含补丁的版本.
  4. Nvidia EGL 库:确保已安装 Nvidia EGL 库,例如在 Ubuntu 和 Neon 系统中,相关的包名为 libnvidia-egl-wayland1.

而要在 Wayland 会话中启用 XWayland 应用的硬件加速,还需满足以下条件:

  1. Xorg 版本:需要 Xorg 1.20.12 或更高版本.
  2. XWayland 版本:需要 XWayland 21.1.2 或更高版本.
  3. libxcb 版本:需要 libxcb 1.1.7 或更高版本.

2. 检查驱动安装情况#

  • 正常情况下, 使用 nvidia-smi 指令可以获取到一张显示显卡情况的表格. 例如这样:
Mon Aug 26 18:49:41 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   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 3060 ...    On  | 00000000:01:00.0 Off |                  N/A |
| N/A   54C    P8              12W /  80W |      8MiB /  6144MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      1343      G   /usr/lib/xorg/Xorg                            4MiB |
+---------------------------------------------------------------------------------------+
  • 但如果提示如下信息, 那么就需要考虑是否是签名问题或其他原因(比如安装了错误的版本). 如果不幸的进入了这种情况, 那么在这里可以参考https://forums.debian.net/viewtopic.php?t=155273, 以及使用sudo dmesg | grep nvidiasudo journalctl -xe | grep nvidialsmod | grep nvidia来找出原因.
    NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running

3. 检查显卡工作情况#

sudo apt install nvtop && glmark2先安装一个直观的集显&独显的观察工具 nvtop 来观察两个显卡的状态.(防止只调集显的情况发生). 而在这里测试工具我选择了 glmark2. 不过也可以选择类似于 FurMark 之类的来, 效果都一样, 只不过甜甜圈提供的选项要更多(可以分别测试 OpenGL 和 Vulkan). (PS: 悲伤的, 在这个过程中我发现了我目前OpenGL测试会调不动独显, 不知道为什么. 而Vulkan是正常的)

如下图所示, 在本机上测试为独显和集显都有运行, 这样是正常的. 如果只有集显工作, 那么尝试下面的步骤.

正常情况

其他配置#

启用DRM Modeset#

  1. 执行 cat /sys/module/nvidia_drm/parameters/modeset来检查 (DRM) modesettings 模式是否开启, 我们可以通过开启DRM模式来提升显卡的兼容程度. 如果输出为 "Y",表示已启用该设置.

    DRM Modeset具体可以参考 - https://en.wikipedia.org/wiki/Direct_Rendering_Manager#Overview - https://download.nvidia.com/XFree86/Linux-x86_64/460.32.03/README/kms.html

  2. 如果显示为N, 那么下面有两种方式来开启它.

    • 修改内核命令行 添加 nvidia_drm.modeset=1 参数, 在/etc/default/grub/中添加GRUB_CMDLINE_LINUX_DEFAULT=字段值为GRUB_CMDLINE_LINUX_DEFAULT="nvidia-drm.modeset=1". 这其实就是在内核启动时为他添加一个参数. 这个参数的用处很大, 例如启动时输出内核信息的日志等级(loglevel=x), 开机自定义闪屏(splash)等功能也可以从这里传参.

    • 也通过模块配置传递此参数:

      可以将 nvidia_drm.modeset=1 参数通过模块配置文件传递.创建 /etc/modprobe.d/nvidia_drm.conf 文件. 这个配置文件会在加载 nvidia_drm 模块时自动启用.

      echo options nvidia_drm modeset=1 | sudo tee /etc/modprobe.d/nvidia_drm.conf
  3. 在此之后还需要更新一下grub和内核.

    • sudo update-grub2更新grub.
    • sudo update-initramfs -u 更新内核.

编写脚本手动设置 NVIDIA GPU 为默认#

  1. 编辑环境变量文件:

    • 编辑 ~/.bashrc 文件, 添加以下内容.
    export __NV_PRIME_RENDER_OFFLOAD=1
    export __GLX_VENDOR_LIBRARY_NAME=nvidia
    export __VK_LAYER_NV_optimus=NVIDIA_only
  2. source ~/.bashrc应用更改.

小结#

  1. 看到一些做法还会禁用原本的 nouveau 驱动(包括NVIDIA文档), 不过我并没有发现异常, 因此就没禁用 nouveau. 但还是在这里mark一下, 便于以后岁月史书.
sudo echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf
sudo update-initramfs -u
  1. 关于多显卡的情况, 对于 ubuntu 可以通过 prime-select 来切换显卡(甚至有一个图形界面). 而对于 debian 来说, 并没有这个功能. 但可以通过这个项目来进行切换.

废弃的#

在上面配置完环境变量其实就完完毕了, 其实还有几步后来发现没有用处的操作. 在这里保留一下做备用.

  1. 编辑 SDDM 配置文件

    • sudo vim /etc/sddm.conf使用终端打开配置文件.

    • 如果文件不存在,编辑或者干脆直接创建一个 /etc/sddm.conf.d/default.conf:

      sudo vim /etc/sddm.conf.d/default.conf
  2. 添加以下内容:

    [General]
    DisplayCommand=/etc/sddm/prime-offload.sh
  3. 创建 prime-offload.sh 脚本:

    1. xrandr --listproviders查看当前显卡标识, 例如我的就叫 NVIDIA-G0. 这里的名称事实上是驱动名称, 而驱动反映了背后所操控的硬件. 例如 modesetting 驱动一般对应着集显, NVIDIA-G0 驱动显然对应着N卡.

      Providers: number : 2
      Provider 0: id: 0x45 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 4 outputs: 3 associated providers: 1 name:modesetting
      Provider 1: id: 0x270 cap: 0x2, Sink Output crtcs: 4 outputs: 1 associated providers: 1 name:NVIDIA-G0
    2. sudo vim /etc/sddm/prime-offload.sh, 创建并编辑脚本文件, 添加以下内容:

      #!/bin/bash
      xrandr --setprovideroutputsource modesetting <需要强制使用的显卡名>
      xrandr --auto
  4. 设置脚本权限:

    sudo chmod +x /etc/sddm/prime-offload.sh
为debian12安装N卡驱动避坑笔记
https://noob.daze.su/posts/hexo归档/为debian12安装n卡驱动避坑笔记/
作者
孟红兵
发布于
2024-08-26