Linux 创建虚拟显示器
作为程序员,日常需要频繁搭建各类开发和运行环境,Windows 做开发总是各种麻烦,非常影响体验,因此选择了 Linux 系统。我的这台 Arch 开发机不接任何物理显示器,桌面环境使用 KDE Plasma(Wayland),使用串流和SSH来控制这台机器,但是串流软件 Sunshine 有一个限制:无显示输出的环境下无法正常工作。
如果你已有物理显卡欺骗器,可直接跳过本文所有内核 EDID、GRUB 参数配置内容,无需额外设置。
前置环境
-
系统:显卡:支持 NVENC 硬件编码的 NVIDIA 独显
-
桌面:KDE Plasma Wayland
-
引导:GRUB
无物理显示器导致显卡无输出设备,Sunshine无法捕获画面。只要通过内核参数模拟出有效虚拟显示器,就可以正常显示。
EDID虚拟固件
EDID 固件的核心作用就是欺骗显卡与系统,让系统识别为一台真实的显示器。
创建系统 EDID 固件存放目录并下载:
# 创建系统 EDID 目录
sudo mkdir -p /usr/lib/firmware/edid
# 下载 EDID
wget https://git.linuxtv.org/v4l-utils.git/plain/utils/edid-decode/data/dell-up2718q-dp -O virtual-display.bin
# 移动到系统固件目录
sudo cp virtual-display.bin /usr/lib/firmware/edid/
查询显卡可用显示接口
我们需要选用显卡空闲、未连接物理设备的显示接口作为虚拟输出口,避免与物理屏幕冲突,通过命令查询全部 DRM 接口:
$ ls /sys/class/drm/card*
/sys/class/drm/card1@ /sys/class/drm/card2-DP-3@
/sys/class/drm/card1-DP-1@ /sys/class/drm/card2-DP-4@
/sys/class/drm/card1-DP-2@ /sys/class/drm/card2-DP-5@
/sys/class/drm/card2@ /sys/class/drm/card2-HDMI-A-1@
执行命令后,可以清晰区分核显与独显设备:card1 为 CPU 核显,直接忽略不使用,card2 是 NVIDIA 独立显卡,只需要选用 card2 下的空闲接口搭建虚拟显示器。
本机 NVIDIA 独显可用、且适合做虚拟显示的空闲接口如下:
-
DP-3、DP-4、DP-5:标准DP接口,优先首选
-
HDMI-A-1:HDMI 通用接口,兼容性稳定,可作为备用备选接口
GRUB 内核虚拟显示参数
drm.edid_firmware=接口名:edid/virtual-display.bin video=接口名:e nvidia-drm.modeset=1
-
drm.edid_firmware:为指定接口绑定自定义显示器EDID数据 -
video=接口名:e:强制启用该显示接口 -
nvidia-drm.modeset=1:开启NVIDIA内核模式设置
结合本机真实硬件接口,下面提供两组可直接复制使用的成品内核参数,完美适配本机环境:
选用 DP-3
drm.edid_firmware=DP-3:edid/virtual-display.bin video=DP-3:e nvidia-drm.modeset=1
修改GRUB配置生效
编辑内核启动参数配置文件,如果没有Grub,那么请使用其他方式添加内核启动参数:
sudo nano /etc/default/grub
找到 GRUB_CMDLINE_LINUX 字段,将上面选中的完整参数粘贴到字段末尾,保存退出。
更新GRUB配置并重启系统,所有参数永久生效:
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo reboot
验证虚拟显示器
系统重启后,执行以下命令查看显示设备状态:
$ cat /sys/class/drm/card2-DP-3/modes
3840x2160
3840x2160
2560x1440
2048x1280
2048x1152
1920x1200
2048x1080
1920x1080
1920x1080
1920x1080
1920x1080
1920x1080
1920x1080
1600x1200
1680x1050
1280x1024
1280x1024
1280x800
1152x864
1280x720
1280x720
1280x720
1024x768
1024x768
800x600
800x600
720x576
720x576
720x576
720x480
720x480
640x480
640x480
640x480
640x480
分辨率列表中存在 3840x2160 参数,即代表虚拟显示器搭建完成。这样Sunshine+Moonlight就可以正常工作了。