KDE上创建虚拟屏幕用于Sunshine串流

在Wayland环境下,KDE无法实现headless output。Hyprland或sway上,我们可以很容易创建虚拟屏幕。而在KDE上,只能通过krfb-virtualmonitor创建虚拟显示器,即使这样也不能被Sunshine检测。因此若希望完全通过软件方法实现上述效果,我们可以通过内核参数强制设置显示模式和EDID,以便不使用显卡欺骗器而让虚拟显示器正常工作。

EDID是一种元数据格式,用于描述显示设备的特性。我们可以从实际的显示器获取EDID信息,或者使用一些公开的配置文件

若你希望直接使用现有显示器的edid文件:

ls /sys/class/drm/

可以看到类似card1-eDP-1,card1-HDMI-A-1的设备,每一个代表一个输出口,查找对应输出口的edid文件:

cat /sys/class/drm/card1-eDP-1/edid > edid.bin

也可以通过网络获取更多样的EDID文件

sudo mkdir -p /usr/lib/firmware/edid
sudo cp edid.bin /usr/lib/firmware/edid/
ls /sys/class/drm/card*
/sys/class/drm/card1:
.            card1-HDMI-A-1  engine  gt_act_freq_mhz    gt_max_freq_mhz  gt_RP1_freq_mhz  power
..           dev             error   gt_boost_freq_mhz  gt_min_freq_mhz  gt_RPn_freq_mhz  subsystem
card1-eDP-1  device          gt      gt_cur_freq_mhz    gt_RP0_freq_mhz  metrics          uevent

/sys/class/drm/card1-eDP-1:
.             ddc     drm_dp_aux0  firmware_node    modes              status     waiting_for_supplier
..            device  edid         i2c-9            physical_location  subsystem
connector_id  dpms    enabled      intel_backlight  power              uevent

/sys/class/drm/card1-HDMI-A-1:
.   connector_id  device  edid     firmware_node  power   subsystem  waiting_for_supplier
..  ddc           dpms    enabled  modes          status  uevent

选择card1-HDMI-A-1作为输出设备。

根据上面选择的输出设备编辑内核参数

修改/etc/default/grub文件,添加以下内容到GRUB_CMDLINE_LINUX

GRUB_CMDLINE_LINUX=“drm.edid_firmware=HDMI-A-1:edid/edid.bin video=HDMI-A-1:1920x1080@120e”

可以自行指定分辨率和帧数,其中video=HDMI-A-1:1920x1080@120e中的最后一个e告诉作系统即使没有连接显示器,也要把相应的 GPU 端口当作连接了显示器一样处理

随后重新生成grub配置:

sudo grub-mkconfig -o /boot/grub/grub.cfg

重启,并在KDE设置中检查显示器,应该能看到HDMI-A-1的虚拟显示器。

在终端启动Sunshine,应当可以在日志中看到如下内容

[2025-07-11 18:31:17.267]: Info: Found display [wayland-0]
[2025-07-11 18:31:17.267]: Info: Found interface: zxdg_output_manager_v1(32) version 3
[2025-07-11 18:31:17.267]: Info: Found interface: zwp_linux_dmabuf_v1(57) version 5
[2025-07-11 18:31:17.267]: Info: Found interface: wl_output(65) version 4
[2025-07-11 18:31:17.267]: Info: Found interface: wl_output(66) version 4
[2025-07-11 18:31:17.267]: Info: Resolution: 1920x1080
[2025-07-11 18:31:17.267]: Info: Resolution: 1920x1080
[2025-07-11 18:31:17.267]: Info: Offset: 1920x0
[2025-07-11 18:31:17.267]: Info: Logical size: 1920x1080
[2025-07-11 18:31:17.267]: Info: Name: eDP-1
[2025-07-11 18:31:17.267]: Info: Found monitor: BOE eDP-1-0x0936
[2025-07-11 18:31:17.267]: Info: Offset: 0x0
[2025-07-11 18:31:17.267]: Info: Logical size: 1920x1080
[2025-07-11 18:31:17.267]: Info: Name: HDMI-A-1
[2025-07-11 18:31:17.267]: Info: Found monitor: AOC HDMI-A-1-28E850
[2025-07-11 18:31:17.267]: Info: -------- Start of KMS monitor list --------
[2025-07-11 18:31:17.267]: Info: Monitor 0 is eDP-1: BOE eDP-1-0x0936
[2025-07-11 18:31:17.267]: Info: Monitor 1 is HDMI-A-1: AOC HDMI-A-1-28E850
[2025-07-11 18:31:17.267]: Info: --------- End of KMS monitor list ---------

[2025-07-11 18:31:17.267]: Info: Monitor 1 is HDMI-A-1: AOC HDMI-A-1-28E850告诉我们Sunshine已经检测到了虚拟显示器HDMI-A-1,编号为1。随后打开Sunshine的webui界面,找到Configuration->Audio/Video->Display number,将其设置为1,保存配置并等待Sunshine自动重启,即可正常进行串流。