如何在 Linux 上获取虚拟显示输出而无需使用 dummy plug
Source: Dev.to
Note: 本指南侧重于 Xorg。在 Wayland 上有更简单的方法实现相同的结果,例如 KDE 在 Krfb 中的虚拟显示器实现:
方法 #1 – 牺牲现有的一个输出
-
检查可用的输出
xrandr -
按照以下内容的前半部分操作
How to Create a Virtual Display for Sunshine on Arch Linux – Anton Ždanov ()
在 Sunshine‑specific 部分之前停止。提示: EDID 文件可以稍后使用
xrandr添加,因此不必挑选完全符合你期望规格的文件。
步骤 1 – 获取 EDID 文件
EDID(Extended Display Identification Data)文件用于模拟显示器。
从 v4l‑utils 仓库下载已有的文件,并选择分辨率和功能符合需求的文件(例如 4K、HDR)。
步骤 2 – 放置 EDID 文件
sudo mkdir -p /usr/lib/firmware/edid
sudo cp samsung-q800t-hdmi2.1 /usr/lib/firmware/edid/
(将 samsung-q800t-hdmi2.1 替换为你下载的文件名。)
步骤 3 – 配置内核参数
-
识别一个空闲的 HDMI 或 DP 输出
for p in /sys/class/drm/*/status; do con=${p%/status} echo -n "${con#*/card?-}: " cat "$p" done记录输出名称(例如
HDMI‑A‑1)。 -
添加内核参数(详细信息请参阅 Arch Wiki 和 EndeavourOS 指南)
drm.edid_firmware=HDMI-A-1:edid/samsung-q800t-hdmi2.1 video=HDMI-A-1:e将
HDMI-A-1替换为你识别的输出。 -
更新
mkinitcpio.confFILES=(/usr/lib/firmware/edid/samsung-q800t-hdmi2.1) -
重新生成 initramfs
sudo mkinitcpio -P -
重启
重启后,可能需要在桌面环境的 显示设置 中启用新显示器。
Source: …
方法 #2 – 使用 EVDI Linux 驱动(在添加内核参数之前)
EVDI – 可扩展虚拟显示接口 – 是一个内核模块,允许用户空间程序管理虚拟屏幕。它主要用于 DisplayLink 设备,但也可以重新用于在没有任何硬件的情况下创建虚拟输出。
背景
- ArchWiki: Extreme Multihead – Using a virtual output
- Stack‑Exchange 讨论: Unable to add a VIRTUAL display to Xorg
- Etam Software – Virtual screen(详细的逐步指南)
注意: 纯 EVDI 方案与桌面环境的屏幕管理器(例如 KDE 的 KScreen2)兼容性不佳。可能需要手动禁用这些服务。
安装 EVDI 内核模块
git clone https://github.com/DisplayLink/evdi.git
cd evdi/module
make && sudo make install # or
sudo make install_dkms
在启动时加载模块
# /etc/modules-load.d/local.conf
evdi
设置所需的虚拟输出数量
# /etc/modprobe.d/local.conf
options evdi initial_device_count=1 # 根据需要更改数字
激活模块
警告: 运行下面的命令会冻结当前的 Xorg 会话。
最安全的做法是编辑完文件后重启,或切换到虚拟终端(Ctrl+Alt+F3)后再执行该命令。
sudo modprobe evdi
重启后,xrandr 应该会列出新的 DVI 输出(例如 DVI‑1)。
如果它们没有模式,可使用 xrandr --newmode / --addmode 手动添加。
现在可以按照 方法 #1 的步骤为虚拟显示附加 EDID 文件并启用它。
使用您新创建的虚拟输出
- 屏幕共享 – 现在可以使用 VNC、RDP 或任何其他远程桌面解决方案来暴露虚拟显示器。请记住,VNC 流量默认未加密。
- Android 设备 – 考虑使用 ADB reverse 以降低延迟并避免配置静态 IP 地址。
adb reverse tcp:5900 tcp:5900 # example for VNC on port 5900
参考文献
- Krfb virtual monitor –
- Anton Ždanov 文章 –
- v4l‑utils EDID 仓库 –
- Arch Wiki – 内核参数 –
- EndeavourOS systemd‑boot 指南 –
- EVDI GitHub –
- Etam Software – 虚拟屏幕 –
祝你虚拟显示黑客玩得开心!
[Virtual screen](https://etam-software.eu/blog/2021-01-09-virtual-screen.html):
4) (optional) Attach Android device through USB cable
adb reverse tcp:5900 tcp:5900
Now you can point your VNC client application, such as [MultiVNC](https://f-droid.org/packages/com.coboltforge.dontmind.multivnc/), to `localhost:5900`.