新购机械革命旷世 X Pro 游戏笔记本电脑一台,搭载 NVIDIA GeForce RTX 5070 Ti Laptop 显卡,到手后便安装了 Arch Linux。此乃我初次安装 Arch Linux,亦是初次使用带有独立显卡的电脑(😭️)。
为达到效率与性能的最佳平衡,意欲采用混合模式,NVIDIA 独立显卡按需启动。折腾过程中遇到不少问题,通过查阅 Arch Wiki 和其他资料,最终配置成功。现将过程记录为本文,以供自己和后人参考。
环境
- CPU: Intel Core i9-13900HX(不要缩缸!🙏)
- GPU: NVIDIA GeForce RTX 5070 Ti Laptop
- 操作系统: Arch Linux
- 桌面环境: GNOME on Wayland
安装 NVIDIA 驱动
这部分很快,pacman
一把梭会帮你把要配置的都配置好,而且网上教程很多,也可参考 Arch Wiki,该部分不赘述。需要注意的是,似乎 50 系 GPU 需要安装 nvidia-open
驱动,而非 nvidia
驱动。如果不确定,可先安装一个,然后用 sudo dmesg
查看。
安装之后,建议再安装 nvidia-utils
和 lib32-nvidia-utils
multilib。
配置和测试 PRIME
本段的内容在 Arch Wiki 中均有涉及。
PRIME(nvidia-prime
)是在 Linux 上使用 NVIDIA Optimus 技术的绝佳工具。本例中,我们将配置 PRIME GPU 分载,使得在通过 Intel 核芯显卡输出画面的同时能够使用 NVIDIA 独立显卡进行图形处理。
首先,安装 PRIME:
1 | sudo pacman -S nvidia-prime |
接下来,配置 udev 和模块参数。
你可以选择安装 nvidia-prime-rtd3pm
AUR 包,它会自动创建所需的 udev 规则和模块参数文件。
1 | yay -S nvidia-prime-rtd3pm |
如果你不想从 AUR 装包,那么请根据 Arch Wiki 创建以下两个文件:
/etc/udev/rules.d/80-nvidia-pm.rules
/etc/modprobe.d/nvidia-pm.conf
有必要解释一下我们设置的模块参数:
options nvidia "NVreg_DynamicPowerManagement=0x02"
。根据 NVIDIA 官方文档,该选项为
0x00
时表示禁用动态电源管理,0x01
时表示启用动态电源管理,0x02
时表示启用动态电源管理并允许系统在空闲时将 GPU 关机。
装完包或者创建好所需的文件之后,请重启电脑。
重启后,你可以使用以下命令来检查 NVIDIA GPU 是否已关闭。首先获取 NVIDIA GPU 的 PCI 设备 ID:
1 | lspci | grep -i nvidia |
笔者的输出如下:
1 | 02:00.0 VGA compatible controller: NVIDIA Corporation GB205M [GeForce RTX 5070 Ti Mobile] (rev a1) |
这证明笔者的 NVIDIA GPU 的 PCI 设备 ID 是 02:00.0
。下面请你把命令中的 <pci_device_id>
替换为你的 NVIDIA GPU 的 PCI 设备 ID。执行:
1 | cat /sys/bus/pci/devices/0000:<pci_device_id>/power/runtime_status |
输出有如下可能:
suspended
:表示 NVIDIA GPU 已被挂起。resuming
:表示 NVIDIA GPU 正在恢复运行。active
:表示 NVIDIA GPU 正在运行。suspending
:表示 NVIDIA GPU 正在挂起。
如果输出是 suspended
,那么恭喜你,你的 NVIDIA GPU 已经成功启用了动态电源管理,并且在不使用时会自动挂起断电。如果输出非预期,请继续参考 Arch Wiki。
还需要启用 nvidia-persistenced.service
服务,以避免内核在 NVIDIA 设备资源不再使用时清空设备状态:
1 | sudo systemctl enable nvidia-persistenced.service |
测试无误后,可以安装 switcheroo-control
包并启用 switcheroo-control.service
以使用 GNOME 集成,这样就可以右击应用程序文件夹里的图标,快速地选择「使用独立显卡启动」选项,用独显运行应用程序。
1 | sudo pacman -S switcheroo-control |
然后重启电脑。
问题排除:独显莫名其妙就被唤醒了?
通过使用 watch
命令,你可以实时监视独显的状态:
1 | watch -n 1 cat /sys/bus/pci/devices/0000:<pci_device_id>/power/runtime_status |
当你打开 GTK4 应用,或者打开基于 Electron 的应用时,可能会听到强劲的风扇声,并注意到独显的状态变为 active
。
Electron 应用只会唤醒独显几秒钟,不影响使用,用掩耳盗铃的方法解决。(如果你知道怎么解决,请告知。)
下面着重解决 GTK4 应用唤醒独显的问题。
参考 Arch Wiki - GTK#GTK4 applications using the dGPU on NVIDIA Optimus setups,我们知道 GTK 在枚举设备时会选择第一个可用的 GPU,而 NVIDIA 通常将独显显示为第一个,因此现在将默认使用 Vulkan 渲染器,即调用 NVIDIA 独显。
解决方案就是让 Vulkan 优先调用 Intel 核芯显卡(参考下面的 Arch Linux BBS 帖子),或者采取我选择的方式,把 GTK4 的渲染后端换回 ngl
:
1 | mkdir -p ~/.config/environment.d && echo GSK_RENDERER=ngl > ~/.config/environment.d/gsk.conf |
然后重启电脑。
对于 Flatpak 应用,请参考 Arch Linux BBS - NVIDIA Discrete GPU/DGPU powers on on every program that opens. 中的解决方案。
延伸:实时监视独显状态
watch
命令只能在终端使用,不太方便。通过使用一个简单的 GNOME 扩展,你可以把独显的状态集成到 GNOME 顶部栏中。
安装扩展 Executor 后,可以监视命令的输出。我写了一个简单的命令,你可以将其添加到 Executor 中:
1 | s=$(cat /sys/bus/pci/devices/0000:<pci_device_id>/power/runtime_status); echo "独显$(if [ "$s" = "active" ]; then echo "活动"; elif [ "$s" = "suspended" ]; then echo "挂起"; elif [ "$s" = "resuming" ]; then echo "恢复中"; elif [ "$s" = "suspending" ]; then echo "挂起中"; else echo " $s"; fi)" |
注意把命令中的 <pci_device_id>
替换为你的 NVIDIA GPU 的 PCI 设备 ID。
结语
通过以上步骤,你应该能够在 Arch Linux 笔记本上成功配置并使用 NVIDIA 独立显卡。希望这篇文章能对你有所帮助,祝你在 Linux 的世界里畅游无阻!
如有任何问题或建议,请不吝赐教!