archlinux 配置 xorg 使用 nvidia T4
最近的一个想法,基于 dd 到中国区域的 archlinux, 可以尝试直接改改 xorg, 用用 nvidia 的显卡。
大概折腾了一天, 记录一下步骤和过程。
之前使用的是 Xorg + DWM 的简单架构, 软件非常少。
那么在这个软件的基础上启用显卡和配置xorgserver 使用显卡, 基本上就是这两部分。
安装显卡驱动
- 查看显卡信息
> lspci 00:1e.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
- 安装驱动直接参考archwiki , 一条命令搞定, 走dkms。安装的这个版本的闭源驱动。
> pacman -Ss nvidia-dkms extra/nvidia-dkms 545.29.06-1 [installed] NVIDIA drivers - module sources > pacman -S nvidia-utils # 启动驱动程序的守护进程。 # 这个如果不开启的话, xrdp 调用 xorg server 的时候 启动会失败, 显示无法找到 nvidia module, 其实不是找不到, 只是由于没有图形化, 所以没有装载。 sudo systemctl enable nvidia-persistenced.service # 调整显示的分辨率,目前还是手动调整的, 还在改配置文件。 > xrandr --output DVI-D-0 --mode 1920x1080 --rate 60
- 等pacman自己处理完dkms的模块编译之后, 重启os就可以看到nvidia模块被装载。
> lsmod | grep nvidia nvidia_uvm 3481600 0 nvidia_drm 118784 7 nvidia_modeset 1585152 6 nvidia_drm nvidia 62402560 141 nvidia_uvm,nvidia_modeset video 77824 1 nvidia_modeset > modinfo nvidia filename: /lib/modules/6.6.7-zen1-1-zen/updates/dkms/nvidia.ko.zst alias: char-major-195-* version: 545.29.06 supported: external license: NVIDIA firmware: nvidia/545.29.06/gsp_tu10x.bin firmware: nvidia/545.29.06/gsp_ga10x.bin srcversion: 8302209549E8FEAC029EDC0 alias: pci:v000010DEd*sv*sd*bc06sc80i00* alias: pci:v000010DEd*sv*sd*bc03sc02i00* alias: pci:v000010DEd*sv*sd*bc03sc00i00* depends: retpoline: Y name: nvidia vermagic: 6.6.7-zen1-1-zen SMP preempt mod_unload
配置xrdp
- 这里已经可以正常的驱动显卡, 但是xorg不会去调用显卡启动图形,查看了archwiki之后,发现如果使用 xrdp , 那么还需要重新安装 xrdp 的后端。 需要使用来自aur的后端来匹配nvidia显卡的支持, 而不是 archlinux 的主仓库里面的默认软件包, 使用 paru 进行的下面步骤。
aur 里面的 xorgxrdp,会自动拉取编译 xrdp-git, 因此这里的版本显示和 aur 仓库的不完全一致。> paru -Ss xrdp aur/xorgxrdp-nvidia 0.2.18.r55.g3a4d465-1 [+4 ~0.00] [Installed] Xorg drivers for xrdp, with NVIDIA GPU support. aur/xrdp-git 0.9.18.r565.geb1c3cd4-1 [+30 ~0.01] [Installed: 0.9.18.r599.g9fbe0ad1-1] An open source remote desktop protocol (RDP) server. Git version, devel branch.
- 安装完成之后, 需要重启一下系统。
- 编译安装aur的过程中,最后的步骤里面有一个红色的提示文字, 需要在配置中变更一下xrdp读取的xorg配置文件的位置。
> cat -n /etc/xrdp/sesman.ini 130 [Xorg] 143 param=Xorg 144 ; Leave the rest parameters as-is unless you understand what will happen. 145 param=-config ; 下面的这两个, 启用nvida的配置文件,注释默认的。 ; 这里配置的是启动xorg server 的时候读取的配置文件位置 以及 xorg server 的参数。 146 ; param=xrdp/xorg.conf 147 param=xrdp/xorg_nvidia.conf 148 param=-noreset 149 param=-nolisten
- 之后, 使用 nvidia 提供的 util , 生成一份nvidia显卡的的配置文件, merge 配置文件里面的这份。
> nvidia-xconfig -c /etc/X11/xrdp/xorg_nvidia.conf # 这里面可以不手动备份, 该命令会自动备份之前的配文件, 如果有不同的配置会自动merge。
- 最后,我在这样做完之后, 重启 xrdp , xorg 确实开始使用显卡了, 但是所有启动的程序不会使用显卡, 默认还是CPU在计算, 这是因为 xorg 的配置文件里面少了 FILE Section, 这个文件的位置可能会不同,我这边确实在这个位置, 文件存在的情况下直接拿来用了。
参考了这个网页中的配置:Section "Files" ModulePath "/usr/lib64/nvidia/xorg" ModulePath "/usr/lib64/xorg/modules" EndSection
https://forums.developer.nvidia.com/t/glxinfo-command-returning-badwindow-invalid-window-parameter-error/36172
最终的配置文件内容如下:
/etc/X11/xrdp/xorg_nvidia.conf
> cat -n /etc/X11/xrdp/xorg_nvidia.conf
1 Section "ServerLayout"
2 Identifier "XRDP GPU Server"
3 Screen 0 "dGPU"
4 InputDevice "xrdpMouse" "CorePointer"
5 InputDevice "xrdpKeyboard" "CoreKeyboard"
6 EndSection
7
8 Section "ServerFlags"
9 # This line prevents "ServerLayout" sections in xorg.conf.d files
10 # overriding the "XRDP GPU Server" layout (xrdp #1784)
11 Option "DefaultServerLayout" "XRDP GPU Server"
12 Option "DontVTSwitch" "on"
13 Option "AutoAddDevices" "off"
14 EndSection
15
16 Section "Files"
17 ModulePath "/usr/lib64/nvidia/xorg"
18 ModulePath "/usr/lib64/xorg/modules"
19 EndSection
20
21 Section "Module"
22 Load "xorgxrdp"
23 EndSection
24
25 Section "InputDevice"
26 Identifier "xrdpKeyboard"
27 Driver "xrdpkeyb"
28 EndSection
29
30 Section "InputDevice"
31 Identifier "xrdpMouse"
32 Driver "xrdpmouse"
33 EndSection
34
35 Section "Screen"
36 Identifier "dGPU"
37 Device "dGPU"
38 Option "DPI" "96 x 96"
39 # T4 needs an entry here, this is not the desktop size
40 SubSection "Display"
41 Virtual 1920 1080
42 EndSubSection
43 EndSection
44
45 Section "Device"
46 Identifier "dGPU"
47 Driver "nvidia"
48 # T4 may need to comment out next line
49 # Option "UseDisplayDevice" "none"
50 Option "ConnectToAcpid" "false"
51 BusID "PCI:0:30:0"
52 EndSection
- 排查思路 和 日志的位置。
- 首先查看 xrdp 的 status, 是不是正常。
- 排查日志
/var/log/xrdp.log
, 这里面记录的是 xrdp 的启动的过程。 - 如果没有错误, 那么查看
/var/log/xrdp-sesman.log
, 这里面会记录xorg启动的命令和 xorg 的状态。 可以把日志里面记录的命令复制出来手动执行,直接看命令的输出; 或者查看 xorg 的日志, 看看历史记录了什么错误。[2023-12-21T16:50:17.711+0800] [INFO ] Socket 13: connection accepted from AF_UNIX [2023-12-21T16:50:17.714+0800] [INFO ] Received system login request from xrdp for user: ec2-user IP: ::ffff:10.0.0.0 [2023-12-21T16:50:17.717+0800] [INFO ] starting xrdp-sesexec with pid 37443 [2023-12-21T16:50:17.763+0800] [INFO ] TerminalServerUsers group tsusers doesn't exist. Access granted for ec2-user [2023-12-21T16:50:17.765+0800] [INFO ] Access permitted for user: ec2-user [2023-12-21T16:50:17.766+0800] [INFO ] Received sys login status for ec2-user : logged in [2023-12-21T16:50:17.768+0800] [INFO ] Received request from xrdp to create a session for user ec2-user [2023-12-21T16:50:17.789+0800] [INFO ] Starting X server on display 10: Xorg :10 -auth .Xauthority -config xrdp/xorg_nvidia.conf -noreset -nolisten tcp -logfile .xorgxrdp.%s.log [2023-12-21T16:50:19.922+0800] [INFO ] X server :10 is working [2023-12-21T16:50:19.923+0800] [INFO ] Starting window manager for display :10 [2023-12-21T16:50:19.924+0800] [INFO ] Starting the xrdp channel server for display :10 [2023-12-21T16:50:19.925+0800] [INFO ] Using the default window manager on display 10: /etc/xrdp/startwm.sh [2023-12-21T16:50:19.926+0800] [INFO ] Session in progress on display :10. Waiting until the window manager (pid 37458) exits to end the session
- 最后, xorg 的日志在命令的输出中
-logfile .xorgxrdp.%s.log
, 是这样的一个文件。
NOTE:我的图形化启动的用户是:
ec2-user
,那么默认的日志就在/home/ec2-user/.xrogxrdp.10.log
这个文件里面, 如果启动xrdp报错就查看这个日志,我这边看到目前可以用, 还有其他的兼容性问题, 有报错。
Update
调整了一部分配置, 解决了:
- 启动的时候xrdp不能正常的初始化 xorg server, 会报错, 启动 nvidia daemon 进程, 如上。
- 启动之后, 显示设备分辨率会被设置成 1024x768 , 需要使用xrandr命令调整, 这部分最终的配置文件如下:
调整这个配置文件的内容, 可以使用 nvidia-xsetting 和 nvidia-xconfig 两个工具, 然后整合自动配置的结果, 对比之后删除冲突或者自动合并无效的部分(也可以直接选择保存配置文件并且不自动merge字段, 我没敢)> cat ./xorg_nvidia.conf # nvidia-xconfig: X configuration file generated by nvidia-xconfig # nvidia-xconfig: version 545.29.06 Section "ServerLayout" Identifier "XRDP GPU Server" Screen 0 "dGPU" 0 0 InputDevice "xrdpMouse" "CorePointer" InputDevice "xrdpKeyboard" "CoreKeyboard" EndSection Section "Files" ModulePath "/usr/lib64/nvidia/xorg" ModulePath "/usr/lib64/xorg/modules" EndSection Section "Module" Load "xorgxrdp" Load "glx" Load "extmod" Load "dbe" Load "type1" Load "freetype" EndSection Section "ServerFlags" # This line prevents "ServerLayout" sections in xorg.conf.d files # overriding the "XRDP GPU Server" layout (xrdp #1784) Option "DefaultServerLayout" "XRDP GPU Server" Option "DontVTSwitch" "on" Option "AutoAddDevices" "on" EndSection Section "InputDevice" Identifier "xrdpKeyboard" Driver "xrdpkeyb" EndSection Section "InputDevice" Identifier "xrdpMouse" Driver "xrdpmouse" EndSection Section "Monitor" Identifier "Monitor0" VendorName "Unknown" ModelName "NVIDIA VGX" Option "DPMS" "false" EndSection Section "Device" # T4 may need to comment out next line # Option "UseDisplayDevice" "none" Identifier "dGPU" Driver "nvidia" BusID "PCI:0:30:0" BoardName "Tesla T4" EndSection Section "Screen" Identifier "dGPU" Device "dGPU" Monitor "Monitor0" DefaultDepth 24 Option "DPI" "96 x 96" # T4 needs an entry here, this is not the desktop size Option "ConnectToAcpid" "false" Option "Stereo" "0" Option "nvidiaXineramaInfoOrder" "DFP-0" Option "metamodes" "1920x1080 +0+0" Option "SLI" "Off" Option "MultiGPU" "Off" Option "BaseMosaic" "off" SubSection "Display" Virtual 1920 1080 Depth 24 EndSubSection EndSection
主要还是这个字段生效 Option "metamodes" "1920x1080 +0+0"
, 2023 年年末的正确设置分辨率的写法。 我对于网络串流的效果本身表示担心, 所以并没有开到 4k , 1080p 体验游戏基本上够了。
目前最后的一点点坑
重启之后, sunshine 需要先通过 xrdp 进入到 ec2 里面,连接一次启动图形化, 我最后还是没有把整体配置成 headless 模式, 如果 sunshine 可以在启动的时候叫一下 xserver 可能会使比较好的方案, 不过平时应该没有需要这个的时候, 问题不大。 我对这个事情还是认为在整活的范围里面。
Final
正常配置的情况下, 启动的程序应该都可以直接使用显卡, 可以在 nvtop
或者 nvidia-smi
找到对应的进程。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Liarlee's Notebook!