KDE Wayland 虚拟屏:krfb-Virtualmonitor + Sunshine 串流
我的环境
- CachyOS(Arch 系)
- KDE Plasma 6 + Wayland
- NVIDIA RTX 2070 Mobile,专有驱动 570
- Sunshine v2025.x
实施步骤
1. 安装依赖
sudo pacman -S krfb kscreenkrfb 提供 krfb-virtualmonitor 命令,kscreen 提供 kscreen-doctor 用来调分辨率/刷新率。
2. 创建虚拟屏
krfb-virtualmonitor --resolution 2560x1440 --name sunshine-vm --password pass --port 5905 &参数说明:
--resolution:虚拟屏的初始分辨率。给大一点(比如 2560x1440 或 3840x2160),之后可以用kscreen-doctor切到你实际需要的分辨率--name:随便取,后面kscreen-doctor会用到--password/--port:VNC 密码和端口。你用 Moonlight 不需要 VNC 访问,但这两个参数是必填的,随便填就行
运行后打开「系统设置 → 显示和监控」,你应该能看到新出现的虚拟显示器。
验证一下:
kscreen-doctor -o | grep -A5 Virtual3. 配置 Sunshine
关键一步:Sunshine 的默认捕获模式是 kms,它看不到 krfb-virtualmonitor 创建的输出(因为那是 Wayland 层的,不是 DRM/KMS 层的)。需要切成 kwin 模式。
Sunshine Web UI → Configuration → Advanced → Force Capture Method → 选 kwin。
然后重启 Sunshine:
systemctl --user restart sunshine4. 设置刷新率
krfb-virtualmonitor 没有 --refresh 参数,默认 60Hz。要改刷新率:
# 单位是 mHz,120Hz = 120000
kscreen-doctor output.Virtual-sunshine-vm.addCustomMode.1920.1080.120000.full
# 应用
kscreen-doctor output.Virtual-sunshine-vm.mode.1920x1080@120注意:addCustomMode 里写的是点数(1920.1080.120000),mode 里写的是 1920x1080@120。两个格式不要搞混。
验证:
kscreen-doctor -o | grep -A10 Virtual输出里应该能看到 * 标记的当前模式和刷新率。
5. 可选:用 systemd user service 管理虚拟屏
如果你不想每次手动启动虚拟屏,可以写成 user service 开机自启。
# ~/.config/systemd/user/krfb-virtualmonitor.service
[Unit]
Description=Virtual display for Sunshine streaming
After=graphical-session.target
PartOf=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/bin/krfb-virtualmonitor --resolution 2560x1440 --name sunshine-vm --password pass --port 5905
ExecStartPost=/bin/sh -c 'sleep 3 && /usr/bin/kscreen-doctor output.Virtual-sunshine-vm.addCustomMode.1920.1080.120000.full && /usr/bin/kscreen-doctor output.Virtual-sunshine-vm.mode.1920x1080@120'
Restart=on-failure
RestartSec=5
[Install]
WantedBy=graphical-session.targetsystemctl --user daemon-reload
systemctl --user enable --now krfb-virtualmonitor.service必须是 user service。system service 拿不到 $WAYLAND_DISPLAY 和 $XDG_RUNTIME_DIR,krfb-virtualmonitor 没法连接到 KWin。
ExecStartPost 里的命令做了三件事:等 3 秒让 KDE 注册虚拟屏 → 注册自定义模式(addCustomMode)→ 切换到该模式(.mode.)。addCustomMode 只是注册,不会自动切,必须再跟一行 .mode.。
如果要同时设置缩放:
ExecStartPost=/bin/sh -c 'sleep 3 && /usr/bin/kscreen-doctor output.Virtual-sunshine-vm.addCustomMode.2560.1440.120000.full && /usr/bin/kscreen-doctor output.Virtual-sunshine-vm.mode.2560x1440@120 && /usr/bin/kscreen-doctor output.Virtual-sunshine-vm.scale.1.5'--resolution、addCustomMode、.mode. 三处的分辨率保持一致即可。缩放值按需改(1.5 = 150%)。
Fractional scaling:如果你用
1.5这类非整数缩放,需要先在系统设置的「显示和监控」里打开「允许分数缩放」(Allow fractional scaling),否则kscreen-doctor会拒绝。或者在~/.config/kwinrc设XwaylandScaleOverride=150后重启 kwin。
如果你不想让虚拟屏一直占着资源,也可以联动 Sunshine 的 service 做到按需启停:
# ~/.config/systemd/user/sunshine.service.d/override.conf
[Unit]
Wants=krfb-virtualmonitor.service
After=krfb-virtualmonitor.service这样 Sunshine 启动时自动拉起虚拟屏,Sunshine 退出时虚拟屏跟着停。
屏幕切换
Moonlight 客户端自带快捷键 Shift + Ctrl + Alt + F1 ~ F12 切换虚拟桌面/屏幕。
连上 Moonlight 后按下这个组合键,就能在物理屏和虚拟屏之间切换。
如果你有两个以上屏幕(比如笔记本内屏 + 外接显示器 + 虚拟屏),F1/F2/F3 分别对应不同的输出。