Arch Linux 启用独显直连(Nvidia)

Caiyi Shyu Lv3

网上的大多数博客仅仅是在hybrid模式下仅使用独显允许所有进程,并非真正的独显直连。这种配置下独立显卡绘制完成后,会将framebuffer交由集成显卡然后输出至显示器,不仅延迟更高,性能也会受到总线带宽的限制。

环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                  -`                    caiyi@archlinux 
.o+` ---------------
`ooo/ OS: Arch Linux x86_64
`+oooo: Host: 83AQ XiaoXinPro 16 IRH8
`+oooooo: Kernel: 6.7.8-zen1-1-zen
-+oooooo+: Uptime: 37 mins
`/:-:++oooo+: Packages: 942 (pacman)
`/++++/+++++++: Shell: fish 3.7.0
`/++++++++++++++: Resolution: 2560x1600
`/+++ooooooooooooo/` DE: GNOME 45.4
./ooosssso++osssssso+` WM: Mutter
.oossssso-````/ossssss+` WM Theme: Adwaita
-osssssso. :ssssssso. Theme: Adwaita [GTK2/3]
:osssssss/ osssso+++. Icons: Adwaita [GTK2/3]
/ossssssss/ +ssssooo/- Terminal: kgx
`/ossssso+/:- -:/+osssso+- CPU: 13th Gen Intel i5-13500H (16) @ 4.700GHz
`+sso+:-` `.-/+oso: GPU: NVIDIA GeForce RTX 3050 6GB Laptop GPU
`++:. `-/+/ GPU: Intel Raptor Lake-P [Iris Xe Graphics]
.` `/ Memory: 1457MiB / 15721MiB

检查是否支持独显直连

终端中执行lspci | grep VGA,如果支持,则应该有包含nvidia显卡的项。

安装 Nvidia 专有驱动

1
sudo pacman -S nvidia-dkms nvidia-utils nvidia-settings nvidia-prime

启用 Nvidia drm

向内核参数中添加nvidia_drm.modeset=1

如果使用systemd-boot

修改/boot/loader/entries/下启动项对应的.conf文件,在options开头行末尾添加nvidia_drm.modeset=1

样例:

1
2
3
4
5
title   Arch Linux (linux)
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options root=PARTUUID=ddaffeea-5631-484e-b452-984a5b6ef1a8 zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs nvidia_drm.modeset=1

如果使用grub

修改/etc/default/grub文件,找到GRUB_CMDLINE_LINUX_DEFAULT行,末尾添加nvidia_drm.modeset=1

验证是否已经启用,重启后执行cat /sys/module/nvidia_drm/parameters/modeset,如果有输出Y则表示启用成功。

添加Nvidia内核模块

打开/etc/mkinitcpio.conf

  • MODULES内添加nvidia nvidia_modeset nvidia_uvm nvidia_drm
  • HOOKS内添加kms,以实现early loading.

配置 Nvidia 显卡

启用相关服务

为了避免gnome拒绝在xorg上运行,我们需要开启以下三个服务

1
2
3
sudo systemctl enable nvidia-hibernate
sudo systemctl enable nvidia-resume
sudo systemctl enable nvidia-suspend

开启显存保留

Nvidia显卡在睡眠时会回收部分显存,在重新唤醒后屏幕会出现花屏的现象。开启显存保留即可解决。在/etc/modprobe.d/nvidia.conf中加入以下行:

1
options nvidia "NVreg_PreserveVideoMemoryAllocations=1"

切换到独显直连

安装切换工具

syetem76 pop-os 是为数不多的自带独显驱动和管理器的发行版,并且system76编写了一个优秀的电源管理器system76-power用于控制电源配置和显卡模式。根据我的使用经验,我更倾向于使用system76-power而不是optimus-manager或其他管理器。并且optimus-manager只能在混合模式下使用独显,而不是真正的独显直连。

对于Arch Linux用户,system76-power已经包含在aur中,软件包名为system76-power。该工具由Rust编写,并依赖多个crates,对于中国大陆的用户来说,需要对cargo进行换源或者使用加速工具。但这些不再本文的讨论范围内。

使用yay安装:

1
yay -S system76-power

手动安装:

1
2
3
git clone https://aur.archlinux.org/system76-power.git
cd system76-power
makepkg -si

启用system76-power守护服务

1
2
3
4
#可能不存在,忽略就行
sudo rm /etc/systemd/system/multi-user.target.wants/system76-power.service
sudo systemctl enable com.system76.PowerDaemon.service
sudo systemctl start com.system76.PowerDaemon.service

切换到独显渲染

1
2
sudo system76-power profile performance
sudo system76-power graphics nvidia

此时仍然不是独显直连状态,仅仅是只使用nvidia显卡渲染。

将 Nvidia 显卡作为默认输出

目前独显直连通过XRandR--setprovideroutputsource实现,这意味着Wayland目前无法使用独显直连。^0

允许Nvidia-drm作为默认渲染源

检查/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf/usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf,其中有一个文件已经存在了类似一下的内容,这意味着它是你要修改的配置文件.

1
2
3
4
5
6
7
8
Section "OutputClass"
Identifier "nvidia"
MatchDriver "nvidia-drm"
Driver "nvidia"
Option "AllowEmptyInitialConfiguration"
ModulePath "/usr/lib/nvidia/xorg"
ModulePath "/usr/lib/xorg/modules"
EndSection

Option "AllowEmptyInitialConfiguration"后添加一行Option "PrimaryGPU" "yes"

配置显示源自动切换

如果此时重启,在进入DE时应该会导致黑屏。这是由于Xorg将集成显卡作为了输出源而不是独立显卡。我们需要在DE实际启动前将显示源切换成Nvidia显卡。

根据不同的DM,需要进行不同的配置。

SDDM

/usr/share/sddm/scripts/Xsetup中添加以下内容:

1
2
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Gnome

/usr/share/gdm/greeter/autostart/optimus.desktop/etc/xdg/autostart/optimus.desktop中添加以下相同的内容:

1
2
3
4
5
6
[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

不使用DM

~/.xinitrc中添加以下内容:

1
2
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

LightDM

参考Arch Wiki

重启

重新启动后,应该能够进入DM和桌面。在终端中执行nvidia-smi,应该能够发现所有的GUI进程都由Nvidia显卡渲染,并且Xorg占用数百兆内存。

用Hwinfo检查实际输出源

使用sudo pacman -S hwinfo安装hwinfo,然后在终端中执行sudo hwinfo --gfxcard。你会得到以下类似的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
15: PCI 100.0: 0300 VGA compatible controller (VGA)             
[Created at pci.386]
Unique ID: VCu0.4sa3PTUi1D7
Parent ID: vSkL.auQjpvHj1k9
SysFS ID: /devices/pci0000:00/0000:00:01.0/0000:01:00.0
SysFS BusID: 0000:01:00.0
Hardware Class: graphics card
Model: "nVidia VGA compatible controller"
Vendor: pci 0x10de "nVidia Corporation"
Device: pci 0x25ec
SubVendor: pci 0x17aa "Lenovo"
SubDevice: pci 0x3ca0
Revision: 0xa1
Driver: "nvidia"
Driver Modules: "nvidia"
Memory Range: 0x5f000000-0x5fffffff (rw,non-prefetchable)
Memory Range: 0x6000000000-0x61ffffffff (ro,non-prefetchable)
Memory Range: 0x6200000000-0x6201ffffff (ro,non-prefetchable)
I/O Ports: 0x3000-0x3fff (rw)
IRQ: 127 (234965 events)
Module Alias: "pci:v000010DEd000025ECsv000017AAsd00003CA0bc03sc00i00"
Driver Info #0:
Driver Status: nouveau is not active
Driver Activation Cmd: "modprobe nouveau"
Driver Info #1:
Driver Status: nvidia_drm is active
Driver Activation Cmd: "modprobe nvidia_drm"
Driver Info #2:
Driver Status: nvidia is active
Driver Activation Cmd: "modprobe nvidia"
Config Status: cfg=new, avail=yes, need=no, active=unknown
Attached to: #11 (PCI bridge)

30: PCI 02.0: 0300 VGA compatible controller (VGA)
[Created at pci.386]
Unique ID: _Znp.bhaQ69qvGZE
SysFS ID: /devices/pci0000:00/0000:00:02.0
SysFS BusID: 0000:00:02.0
Hardware Class: graphics card
Model: "Intel VGA compatible controller"
Vendor: pci 0x8086 "Intel Corporation"
Device: pci 0xa7a0
SubVendor: pci 0x17aa "Lenovo"
SubDevice: pci 0x3ca0
Revision: 0x04
Driver: "i915"
Driver Modules: "i915"
Memory Range: 0x6202000000-0x6202ffffff (rw,non-prefetchable)
Memory Range: 0x4000000000-0x400fffffff (ro,non-prefetchable)
I/O Ports: 0x4000-0x403f (rw)
Memory Range: 0x000c0000-0x000dffff (rw,non-prefetchable,disabled)
IRQ: 164 (54456 events)
Module Alias: "pci:v00008086d0000A7A0sv000017AAsd00003CA0bc03sc00i00"
Driver Info #0:
Driver Status: i915 is active
Driver Activation Cmd: "modprobe i915"
Config Status: cfg=new, avail=yes, need=no, active=unknown

Primary display adapter: #15

最后的Primary display adapter: #15说明了我的显示器目前由15: PCI 100.0: 0300 VGA compatible controller (VGA)驱动,也就是第一个部分的Nvidia显卡。

效果

运行 osu!lazer 帧率如下:

集成显卡prime-run独显直连
350fps700fps>1000fps

ps: osu!lazer限制最大帧率为1000hz

  • 标题: Arch Linux 启用独显直连(Nvidia)
  • 作者: Caiyi Shyu
  • 创建于 : 2024-03-06 11:09:28
  • 更新于 : 2024-07-10 01:10:11
  • 链接: https://blog.caiyi1.me/2024/03/06/Linux-nvidia/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。