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

在KDE上通过创建虚拟屏幕,使平板能通过Sunshine串流作为副屏

在Wayland环境下,KDE暂时没有实现headless output,Hyprland或sway上,我们可以很容易创建虚拟屏幕,而在KDE上,只能通过krfb-virtualmonitor创建虚拟显示器,即使这样也不能被Sunshine检测。因此,若不希望购买显卡欺骗器,通过软件方法实现创建虚拟显示器给平板等设备串流,我们可以通过内核参数和EDID强制设置显示模式。

更新

在 Sunshine 于 2026 年 5 月 16 日发布的 2026.516.143833已加入 kwin 捕获,可以直接通过 krfb-virtualmonitor实现下面的效果。请参考Krfb 创建虚拟屏幕

获取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 -d1 /sys/class/drm/card*-*
/sys/class/drm/card1-HDMI-A-1
/sys/class/drm/card1-eDP-1

本文选择 card1-HDMI-A-1 对应的 HDMI 输出。下面的内核参数使用连接器名 HDMI-A-1,省略 card1- 前缀;请按实际输出端口替换。

编辑内核参数

根据上面选择的输出设备编辑内核参数,下面列出grub和systemd-boot的修改方式,其他boot loader请参考各自文档

grub

修改/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的虚拟显示器。

systemd-boot

对于启用了UKI的情况,向/etc/cmdline.d/root.conf文件尾部追加

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

并使用 mkinitcpio 重新生成 UKI sudo mkinitcpio -P

普通启动条目则修改启动分区的loader/entries/*.conf的options行即可

注意事项

如果你使用的 GPU 驱动需要 early kms,即显卡驱动在 initramfs 阶段加载,需要确保将自定义 edid 二进制文件放到 initramfs 镜像中。具体方法请参考的你的发行版说明,以使用 mkinitcpio 的 arch linux为例,在/etc/mkinitcpio.conf中向FILES数组追加一个元素/usr/lib/firmware/edid/edid.bin,再重新生成initramfs即可

Krfb 创建虚拟屏幕

安装 krfb:

sudo pacman -S krfb

创建一个大小为 WIDTH x HEIGHT 的虚拟屏幕:

krfb-virtualmonitor --resolution WIDTHxHEIGHT

这应该会创建一个连接器名称为 Virtual-Monitor 的屏幕(可以通过在终端启动 sunshine 查看)

然后在sunshine配置中将捕获后端 ( Settings -> Advanced -> Force a Specific Capture Method ) 改成 KWin Screencast,并把 Display Id ( Settings -> Audio/Video -> Display ID ) 改成 Virtual-Monitor。

串流

在终端启动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重启,即可正常进行串流。