• MarMDJtin

    想在 Linux 上用 Sunshine → Moonlight 做远程桌面,又不想买 HDMI/DP 欺骗器( dummy plug ),也不想一直开着物理显示器。折腾一段时间后,把流程整理成了一个开源项目:

    https://github.com/mdj2812/sunshine-vdisplay

    原理简述

    - 在空闲的 GPU 输出口(未插线的 HDMI/DP )上,通过 自定义 EDID + 内核参数 强制启用虚拟显示器

    - 核心参数:drm.edid_firmware=<接口>:edid/virtual-display.bin video=<接口>:e(两者缺一不可)

    - Moonlight 连接/断开时,自动切换虚拟屏与物理屏( Sunshine global_prep_cmd)

    - 支持 Arch/CachyOS/Fedora/Debian/Ubuntu 等,安装脚本会自动识别 mkinitcpio / dracut / initramfs-tools

    致谢

    本方案基于 Harry Ankers 的 Gist 教程( EDID 生成与 NVIDIA 虚拟屏思路)。我在此基础上做了 Sunshine 自动化、多发行版安装脚本、KDE 显示切换与亮度调节等。原帖作者 Reddit:u/hankers60。

    目前已验证环境

    - GPU: NVIDIA RTX 2070 SUPER (闭源驱动)

    - 系统: CachyOS ( Arch 系)

    - 桌面: KDE Plasma 6 Wayland

    - 串流: Sunshine 2026.x ,KMS 捕获 + NVENC

    - 引导: Limine (也支持 GRUB / systemd-boot )

    已知限制

    - 目前 仅支持 NVIDIA + KDE Wayland

    - NVIDIA 强制启用的虚拟口 不支持 HDR(驱动限制,非 EDID 问题)

    - 虚拟口上 4K@120 可能受驱动/带宽限制,部分环境最高 4K@60

    - 修改 EDID 模式后需重建 initramfs 并重启

    一键安装( NVIDIA + KDE Wayland )```
    curl -fsSL https://raw.githubusercontent.com/mdj2812/sunshine-vdisplay/main/scripts/install.sh | bash
    ```安装后会改 initramfs 和 内核启动参数,建议先备份或快照,再重启测试 Moonlight 连接。

    也可 clone 后本地安装(避免 curl | bash):```
    git clone https://github.com/mdj2812/sunshine-vdisplay.git
    cd sunshine-vdisplay
    ./scripts/install.sh
    ``指定虚拟口/物理口示例:``
    VDISPLAY=HDMI-A-1 PDISPLAY=DP-3 bash <(curl -fsSL \
    https://raw.githubusercontent.com/mdj2812/sunshine-vdisplay/main/scripts/install.sh)

    
    后续计划见 GitHub Milestones,欢迎有对应硬件/环境的朋友帮忙验证:
    
    方向 |
    需要的环境 |
    
    **NVIDIA + KDE Wayland** |
    不同显卡、发行版、引导器 — 基线验证 |
    
    **AMD** |
    `amdgpu` 虚拟显示路径(尚未实现,需硬件反馈) |
    
    **Intel 核显** |
    i915 / xe |
    
    **X11** |
    Plasma on X11 ,`xrandr` 切换 |
    
    **其他桌面** |
    GNOME 、Sway 等(非 `kscreen-doctor`) |
    
    反馈方式
    
    请在 GitHub 开 Issue,尽量附上:
    
    - 显卡型号 + 驱动版本
    
    - 发行版 + 桌面环境 + Wayland/X11
    
    - 引导器( GRUB / systemd-boot / Limine )
    
    - 失败时的 Sunshine 日志:`journalctl --user -u sunshine`
    
    - 对应哪个 Milestone
    主楼
  • haiku

    感谢分享,我之前让 claude 搓了一个虚拟显示器,不过后来重装系统,配置丢了,懒得折腾了

    #1
  • wises

    拼夕夕买一个 4 块钱, 有必要这样折腾吗?

    #2
  • Tink

    主要是思路可以借鉴到其他很多地方上

    #6
  • weyou

    感谢分享,很好的创意,之前就想过为什么不能软件欺骗,原来还真可以

    #3
  • strobber16

    @wises 如无必要,勿增实体

    #4
  • heyjei

    你们的 Moonlight ,在用 macOS 做客户端的时候,键盘功能都正常吗?很早之前试用的时候,键盘有部分按键不好使框,就没用了

    #5
  • kapr1k0rn

    现在一堆 sunshine 的分支项目全都自带这个了,apollo/vipepollo 这些

    #7
  • cluulzz

    在个人服务器上折腾过这个,用 sunshine 串流 retroarch,跑着个不关机的 gba 模拟器

    #8
  • MarMDJtin

    @haiku 那个的限制在于不能自定义分辨率和比例,比如我的笔记本的屏幕是 16:10 的,可以通过定制 EDID 让 server 的虚拟显示 16:10 输出。否则就都是 16:9 的,效果就不完美了。我后面计划要在脚本里加一步来选择 EDID 的可用输出格式,包括分辨率,刷新率,HDR 这些

    #9
  • MarMDJtin

    @Tink 是的,这个就是配合 sunshine on linux 。因为本身 Sunshine 不想原生支持虚拟显示器才诞生了 Apollo 这些 fork

    #10
  • MarMDJtin

    @cluulzz 那是 4:3 的输出?我得记一笔,还有这样制式的需求。

    #11
  • TheNine

    我之前用 pve 虚拟机安装 steamos 也是用 EDID 的
    后来发现 Bazzite 原生就自带这个功能

    图片

    #12
  • TheNine

    @TheNine 对了我是用的 amd 的 9070xtx

    #13

发表回复

登录后回复