我已经在 PC 上安装了 Ubuntu 22.04.2 LTS。有一种情况是,当我的 GPU 上没有连接显示器时,我需要使用 Moonlight 和 Sunshine 访问这台 PC。Sunshine 是主机流媒体服务,Moonlight 是客户端服务。Sunshine 使用 Xorg 和 PulseAudio。当我的 GPU 上连接显示器时,我已经在 PC 上成功启动了 Sunshine。只有这样,我才能通过 Moonlight 连接到我的 PC。
如果没有连接显示器,Xorg 无法启动,Sunshine 也无法启动。我做了一些研究,我知道可以使用一些 Xorg 配置和 edid.bin 文件伪造一个虚拟屏幕。
我事先断开了显示器的连接,并通过 SSH 会话访问了我的 PC。我遵循的步骤如下:
- 我已经下载了这是我的屏幕的 edid.bin 文件
- 我运行了以下命令:
sudo nvidia-xconfig -a --allow-empty-initial-configuration --use-display-device="DP-0" --connected-monitor="DP-0" --custom-edid="DP-0:/home/$USER/edid-2.bin"
- 我查看了
/etc/X11/
目录,发现创建了一个名为的文件xorg.conf
- 该文件的内容如下:
# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig: version 525.105.17
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection
Section "Files"
EndSection
Section "InputDevice"
# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "Unknown"
Option "DPMS"
EndSection
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "NVIDIA GeForce RTX 3060 Ti"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
Option "UseDisplayDevice" "DP-0"
Option "CustomEDID" "DP-0:/home/lucas/edid-2.bin"
Option "ConnectedMonitor" "DP-0"
SubSection "Display"
Depth 24
EndSubSection
EndSection
- 我通过运行以下命令检查了 Xorg 是否正在运行
ps aux | grep xorg
::
root 1241 0.1 0.1 25349916 53660 tty1 Sl+ 15:48 0:00 /usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/127/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -novtswitch -verbose 3
lucas 2392 0.0 0.0 9216 2432 pts/0 S+ 15:50 0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox xorg
- 我检查了
/var/log/Xorg.0.log
文件,没有发现任何错误。我还验证了屏幕连接正确。
但运行命令后,xrandr
它返回Can't open display
错误。我尝试显示 0 到 10 的数字,但只xrandr --display :0
返回:Authorization required, but no authorization protocol specified. Can't open display :0
我也尝试.Xauthority
通过运行以下命令来编辑文件:xauth add :0 . $(xxd -l 16 -p /dev/urandom)
。但该xrandr
命令返回Invalid MIT-MAGIC-COOKIE-1 key error
之后我删除了该/etc/X11/xorg.conf
文件和.Xauthority file
。然后再次连接显示器,使用显示器一切又恢复正常。而且我删除的那些文件也没有重新生成。没有这些文件怎么可能运行 Xorg?
那么,有人知道如何在没有连接显示器的情况下正确伪造这个 Xorg 屏幕,以便我可以启动 Sunshine 并通过 Moonlight 连接到我的电脑吗?如果您需要更多信息,请询问!
编辑:
我通过运行命令禁用了 gdm sudo systemctl stop gdm
,并使用以下命令手动启动了 Xorg 进程Xorg :0 -config xorg.conf -noreset
。
所以我现在可以使用 xrandr 命令:
➜ ~ xrandr --display :0
Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767
HDMI-0 disconnected primary (normal left inverted right x axis y axis)
DP-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 500mm x 281mm
1920x1080 60.00*+
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
我仍然无法正确配置 gdm,因此它将启动 Xorg 进程,使用正确的 Xorg 配置将屏幕显示为数字 0
答案1
好吧,我找到了一个解决方案。
- 禁用 GDM(GNOME 显示管理器)-->
sudo systemctl disable gdm && sudo systemctl stop gdm
。(请注意,如果您连接到物理显示器,则需要 GDM) - 搬去
/etc/X11/xorg.conf
/etc/X11/sunshine/xorg.conf
- 创建
systemd service
-->/etc/systemd/system/xorg.service
。文件内容xorg.service
:
[Unit]
Description=Xorg Server
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/Xorg :0 -config /etc/X11/sunshine/xorg.conf -nolisten tcp
[Install]
WantedBy=multi-user.target
- 启用
xorg.service
-->sudo systemctl enable xorg && sudo systemctl start xorg
sudo reboot
- 重启电脑后,我可以成功使用该
xrandr --display :0
命令。通过设置环境变量 DISPLAY,您不再需要该--display
标志