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. 首先满足以下前提条件
- Plasma 版本:确保使用 Plasma 5.20.2 及以上.
- NVIDIA 驱动程序:确保 NVIDIA 驱动程序不低于 495.44 版本, KWin 不再与早期版本兼容.
- Qt 版本:确保使用最新版本的 Qt,至少需要 Qt5.15.0 或包含补丁的版本.
- Nvidia EGL 库:确保已安装 Nvidia EGL 库,例如在 Ubuntu 和 Neon 系统中,相关的包名为
libnvidia-egl-wayland1.
而要在 Wayland 会话中启用 XWayland 应用的硬件加速,还需满足以下条件:
- Xorg 版本:需要 Xorg 1.20.12 或更高版本.
- XWayland 版本:需要 XWayland 21.1.2 或更高版本.
- 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 nvidia或sudo journalctl -xe | grep nvidia或lsmod | 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 running3. 检查显卡工作情况
sudo apt install nvtop && glmark2先安装一个直观的集显&独显的观察工具 nvtop 来观察两个显卡的状态.(防止只调集显的情况发生). 而在这里测试工具我选择了 glmark2. 不过也可以选择类似于 FurMark 之类的来, 效果都一样, 只不过甜甜圈提供的选项要更多(可以分别测试 OpenGL 和 Vulkan). (PS: 悲伤的, 在这个过程中我发现了我目前OpenGL测试会调不动独显, 不知道为什么. 而Vulkan是正常的)
如下图所示, 在本机上测试为独显和集显都有运行, 这样是正常的. 如果只有集显工作, 那么尝试下面的步骤.

其他配置
启用DRM Modeset
执行
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
如果显示为
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
在此之后还需要更新一下grub和内核.
sudo update-grub2更新grub.sudo update-initramfs -u更新内核.
编写脚本手动设置 NVIDIA GPU 为默认
编辑环境变量文件:
- 编辑
~/.bashrc文件, 添加以下内容.
export __NV_PRIME_RENDER_OFFLOAD=1 export __GLX_VENDOR_LIBRARY_NAME=nvidia export __VK_LAYER_NV_optimus=NVIDIA_only- 编辑
source ~/.bashrc应用更改.
小结
- 看到一些做法还会禁用原本的 nouveau 驱动(包括NVIDIA文档), 不过我并没有发现异常, 因此就没禁用 nouveau. 但还是在这里mark一下, 便于以后岁月史书.
sudo echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf
sudo update-initramfs -u- 关于多显卡的情况, 对于 ubuntu 可以通过 prime-select 来切换显卡(甚至有一个图形界面). 而对于 debian 来说, 并没有这个功能. 但可以通过这个项目来进行切换.
废弃的
在上面配置完环境变量其实就完完毕了, 其实还有几步后来发现没有用处的操作. 在这里保留一下做备用.
编辑 SDDM 配置文件
sudo vim /etc/sddm.conf使用终端打开配置文件.如果文件不存在,编辑或者干脆直接创建一个
/etc/sddm.conf.d/default.conf:sudo vim /etc/sddm.conf.d/default.conf
添加以下内容:
[General] DisplayCommand=/etc/sddm/prime-offload.sh创建
prime-offload.sh脚本: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-G0sudo vim /etc/sddm/prime-offload.sh, 创建并编辑脚本文件, 添加以下内容:#!/bin/bash xrandr --setprovideroutputsource modesetting <需要强制使用的显卡名称> xrandr --auto
设置脚本权限:
sudo chmod +x /etc/sddm/prime-offload.sh