外接显示器对接扩展坞时偶尔名称切换的问题求助
嗨,这个问题确实挺闹心的——明明配置好的脚本,一热插拔扩展坞就因为显示器名称打乱失效了。我来给你分享几个可行的解决思路,帮你彻底搞定它:
方案A:给显示器绑定固定名称(基于EDID)
每个显示器的EDID信息是唯一的(除非是同型号同批次的完全一样),我们可以利用这个特性让Xorg每次都给同一个显示器分配固定的自定义名称,彻底摆脱随机切换的问题:
获取显示器的EDID信息
先把两个显示器都接上,运行下面的命令查看每个输出的EDID:xrandr --props | grep -A 10 "DVI-I-"找到
EDID:开头的那一段十六进制字符串,把每个显示器的EDID单独存下来,比如存成left_monitor.edid和right_monitor.edid。创建Xorg配置文件
在/etc/X11/xorg.conf.d/目录下新建一个配置文件,比如10-fixed-monitors.conf,内容如下:Section "Monitor" Identifier "LeftMonitor" MatchEDID "这里替换成左侧显示器的EDID十六进制字符串" EndSection Section "Monitor" Identifier "RightMonitor" MatchEDID "这里替换成右侧显示器的EDID十六进制字符串" EndSection Section "Screen" Identifier "Screen0" Device "Card0" Monitor "LeftMonitor" Monitor "RightMonitor" SubSection "Display" Viewport 0 0 Depth 24 EndSubSection EndSection重启Xorg或者电脑之后,再用
xrandr查看,显示器就会变成你自定义的LeftMonitor和RightMonitor,再也不会乱切换了。
方案B:按扩展坞的物理端口映射
如果你的两个显示器EDID完全一样(比如同型号),那方案A可能不太好用,这时候可以基于扩展坞的物理端口来区分:
识别端口的唯一标识
运行下面的命令查看每个显示器输出对应的设备路径:udevadm info --query=all --name=/dev/dri/card0 | grep DEVPATH你会看到类似
DEVPATH=/devices/pci0000:00/.../drm/card0/card0-DVI-I-1这样的路径,不同的端口路径会有差异。修改你的配置脚本
在脚本里先判断每个输出对应的物理路径,再决定哪个是左哪个是右。比如可以写一段bash逻辑:# 获取每个输出的DEVPATH LEFT_PORT="/devices/pci0000:00/.../card0-DVI-I-1" # 替换成你左侧端口的路径 RIGHT_PORT="/devices/pci0000:00/.../card0-DVI-I-2" # 替换成你右侧端口的路径 for output in $(xrandr | grep " connected" | awk '{print $1}'); do DEVPATH=$(udevadm info --query=property --name=/dev/dri/card0 | grep "DEVPATH.*$output" | cut -d= -f2) if [ "$DEVPATH" = "$LEFT_PORT" ]; then LEFT_OUTPUT=$output elif [ "$DEVPATH" = "$RIGHT_PORT" ]; then RIGHT_OUTPUT=$output fi done # 然后用LEFT_OUTPUT和RIGHT_OUTPUT来执行xrandr配置 xrandr --output $LEFT_OUTPUT --left-of $RIGHT_OUTPUT --auto这样不管系统给端口分配什么名称,脚本都会根据物理端口来识别左右显示器。
其他备选方案
如果上面两个方案都觉得麻烦,还可以试试:
- 基于显示器分辨率/位置判断:如果两个显示器分辨率不一样,可以在脚本里先检测每个输出的分辨率,然后分配左右位置;
- 使用
ddcutil工具:它可以读取显示器的物理端口信息(比如HDMI 0/1),你可以用它来区分不同的显示器,然后在脚本里做判断。
这些方法都能有效解决名称切换导致的脚本失效问题,你可以根据自己的情况选一个最顺手的!
备注:内容来源于stack exchange,提问作者123MilitaryNerd

