在你的 Arch Linux 笔记本上畅快使用 NVIDIA 显卡

  • ~3.68K 字
  1. 1. 环境
  2. 2. 安装 NVIDIA 驱动
  3. 3. 配置和测试 PRIME
  4. 4. 问题排除:独显莫名其妙就被唤醒了?
  5. 5. 延伸:实时监视独显状态
  6. 6. 结语

新购机械革命旷世 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-utilslib32-nvidia-utils multilib

配置和测试 PRIME

本段的内容在 Arch Wiki 中均有涉及。

PRIMEnvidia-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
2
02:00.0 VGA compatible controller: NVIDIA Corporation GB205M [GeForce RTX 5070 Ti Mobile] (rev a1)
02:00.1 Audio device: NVIDIA Corporation Device 2f80 (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
2
sudo systemctl enable nvidia-persistenced.service
sudo systemctl start nvidia-persistenced.service

测试无误后,可以安装 switcheroo-control 包并启用 switcheroo-control.service 以使用 GNOME 集成,这样就可以右击应用程序文件夹里的图标,快速地选择「使用独立显卡启动」选项,用独显运行应用程序。

1
2
sudo pacman -S switcheroo-control
sudo systemctl enable switcheroo-control.service

然后重启电脑。

问题排除:独显莫名其妙就被唤醒了?

通过使用 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 的世界里畅游无阻!

如有任何问题或建议,请不吝赐教!

分享这一刻
让朋友们也来瞅瞅!