You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在X11中创建可热插拔的虚拟显示器

如何在X11中创建可热插拔的虚拟显示器

我明白你想要的是那种能跟着真实显示器插拔自动出现/消失的虚拟显示器——开机没接屏就自动启用,中途插上真实屏就关掉虚拟的,拔掉又自动回来对吧?这个需求确实需要结合udev热插拔检测和xrandr的动态配置,下面是一套能在多数主流发行版(包括Fedora)上跑的方案:

第一步:安装X11虚拟显示器驱动

先装dummy驱动,不同发行版对应的包:

  • Fedora/RHEL系:sudo dnf install xorg-x11-drv-dummy
  • Ubuntu/Debian系:sudo apt install xserver-xorg-video-dummy
  • Arch/Manjaro系:sudo pacman -S xf86-video-dummy

第二步:创建Xorg配置片段(用于虚拟显示器)

/etc/X11/xorg.conf.d/目录下新建一个配置文件,比如99-dummy-monitor.conf,内容如下:

Section "Device"
    Identifier  "DummyDevice"
    Driver      "dummy"
    Option      "IgnoreEDID" "true"
    Option      "NoDDC" "true"
EndSection

Section "Screen"
    Identifier  "DummyScreen"
    Device      "DummyDevice"
    DefaultDepth 24
    SubSection "Display"
        Depth 24
        Modes "1920x1080" "1280x720"
    EndSubSection
EndSection

这个配置不会让虚拟显示器默认启动,只是给后续xrandr操作提供基础支持。

第三步:编写udev热插拔规则

udev是Linux里负责硬件事件监听的工具,我们用它来触发虚拟显示器的切换脚本。在/etc/udev/rules.d/下新建99-dummy-monitor.rules,内容:

ACTION=="add", SUBSYSTEM=="drm", KERNEL=="card0", RUN+="/usr/local/bin/toggle-dummy-monitor.sh"
ACTION=="remove", SUBSYSTEM=="drm", KERNEL=="card0", RUN+="/usr/local/bin/toggle-dummy-monitor.sh"

这条规则会在显卡的显示设备(card0)发生添加/移除事件时,自动执行我们的切换脚本。如果你的系统有多显卡,可能需要调整KERNEL=="card0"为对应的编号。

第四步:编写核心切换脚本

创建/usr/local/bin/toggle-dummy-monitor.sh脚本,这是实现自动切换的关键,内容如下(记得把your-username替换成你的实际用户名):

#!/bin/bash

# 设置X11环境变量(root用户需要指定才能操作X11)
export DISPLAY=:0
export XAUTHORITY=/home/your-username/.Xauthority

# 检测当前已连接的真实显示器数量
real_displays=$(xrandr | grep -E "^[A-Z0-9-]+ connected" | grep -v "dummy" | wc -l)

# 检查虚拟显示器是否已启用
dummy_enabled=$(xrandr | grep -E "^dummy-[0-9]+ connected" | wc -l)

if [ $real_displays -eq 0 ]; then
    # 没有真实显示器,启用虚拟显示器
    if [ $dummy_enabled -eq 0 ]; then
        # 如果虚拟显示器还没启用,先创建模式并启用
        xrandr --newmode "1920x1080" 173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
        xrandr --addmode dummy-1 1920x1080
        xrandr --output dummy-1 --mode 1920x1080 --primary
    fi
else
    # 有真实显示器,禁用虚拟显示器
    if [ $dummy_enabled -gt 0 ]; then
        xrandr --output dummy-1 --off
    fi
fi

然后给脚本加可执行权限:
sudo chmod +x /usr/local/bin/toggle-dummy-monitor.sh

第五步:测试生效

  1. 重新加载udev规则:sudo udevadm control --reload-rules
  2. 可以手动触发一次事件测试:sudo udevadm trigger --subsystem-match=drm --action=change
  3. 现在插拔真实显示器,虚拟显示器应该会自动出现/消失了!

一些注意事项

  • 如果你的虚拟显示器编号不是dummy-1,可以用xrandr命令查看,然后调整脚本里的对应字段
  • Wayland环境下这套方案不适用,因为X11的工具无法直接控制Wayland显示
  • 如果脚本执行失败,可以查看系统日志(journalctl -u systemd-udevd.service)排查问题

备注:内容来源于stack exchange,提问作者kahveciderin

火山引擎 最新活动