背景
我已经以这种或那种方式遇到这个问题很长一段时间(几年)了,并且在多种配置中。我已经多次更新了驱动程序和内核,此时我真的不知道罪魁祸首在哪里。
这似乎是某种竞争条件,如果一个显示器先于另一个显示器“准备好”,则另一个显示器只会得到“无输入”,尽管 xrandr(和 i3)认为它已连接并且应该工作。
旧设置
- 4K 显示器一台
- 一台 1080p 显示器
行为:两台显示器都进入睡眠状态(从不活动状态),并且在移动鼠标时,只有其中一台(1080p 显示器)正确唤醒。另一台设备几秒钟后醒来,但随后显示“无输入”。
解决方法:
- 运行
xrandr.sh
(旧版本,新版本见下文)- 我不能肯定地说我是否必须做其他事情才能让它发挥作用(整个过程或多或少变成了肌肉记忆......)
新设置
- 一台 4K 显示器(与之前的设置相同)
- 一台 4K 显示器(新)
行为:类似的行为,但现在该行为适用于新的监视器。旧的表现很好(就像旧的 1080p 显示器一样)。
解决方法 1(记住先唤醒显示器):
- (在通过移动鼠标/键盘唤醒屏幕之前)使用显示器上的菜单按钮唤醒“慢速”屏幕
- 当显示器完成从待机状态恢复并显示菜单项时,移动鼠标/键盘以唤醒显示器。
- 两台显示器都工作正常!
解决方法 2(忘记先唤醒显示器):
- (移动鼠标/键盘) 两个显示器都被唤醒。一个工作正常,另一个需要更多时间从挂起唤醒,然后只显示“无输入”。
- 运行
xrandr --output HDMI-0 --off
,这将使显示器返回待机状态。 - 应用解决方法 1。
- 两台显示器都工作正常!
细节
Nvidia 驱动程序版本(来自 Arch 存储库):455.45.01-6
$ lspci | grep NV
01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
$ xrandr
Screen 0: minimum 8 x 8, current 7680 x 2160, maximum 32767 x 32767
DVI-D-0 disconnected (normal left inverted right x axis y axis)
HDMI-0 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 621mm x 341mm
3840x2160 60.00*+ 59.94 50.00 30.00 29.97 25.00 23.98 23.98
2560x1600 59.97
2560x1440 59.95
1920x1080 60.00 59.94 50.00 60.00 50.04
1680x1050 59.95
1440x900 59.89
1440x576 50.00
1440x480 59.94
1280x1024 75.02 60.02
1280x960 60.00
1280x800 59.81
1280x720 60.00 59.94 50.00
1024x768 75.03 70.07 60.00
800x600 75.00 72.19 60.32 56.25
720x576 50.00
720x480 59.94
640x480 75.00 72.81 59.94
640x350 70.07
DP-0 disconnected (normal left inverted right x axis y axis)
DP-1 connected 3840x2160+3840+0 (normal left inverted right x axis y axis) 1280mm x 720mm
4096x2160 29.97 + 25.00 24.00 23.98
3840x2160 29.97* 25.00 23.98 23.98
1920x1080 60.00 59.94 50.00 29.97 25.00 23.98 60.00 50.04
1280x1024 60.02
1280x720 59.94 50.00
1024x768 60.00
800x600 60.32
720x576 50.00
720x480 59.94
640x480 59.95 59.93 59.94
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
DP-4 disconnected (normal left inverted right x axis y axis)
DP-5 disconnected (normal left inverted right x axis y axis)
dmesg
没有表现出任何异常。
xrandr.sh
:
# This used to be uncommented, but doesn't cut it anymore with the new setup
#xrandr --output HDMI-0 --off
sleep 0.5
xrandr --output HDMI-0 --primary --mode 3840x2160 --panning 0x0
xrandr --output DP-1 --mode 3840x2160 --right-of HDMI-0
尝试过的解决方案
多年来,我多次用谷歌搜索类似的问题,但从未真正找到任何有希望的东西。我曾经认为旧的 4K 显示器有一些奇怪的地方(比如坏的 EDID),但现在我在新显示器上遇到了同样的问题,我已经放弃了这种怀疑。
我发现了很多关于屏幕无法恢复的线程暂停(通常用 修复modeset
),但在我的情况下,没有真正的暂停发生,它只是屏幕关闭/消隐(并且只发生在其中一台显示器上!)。此外,我还没有发现任何与我的问题/解决方法类似的“竞争条件”性质的问题。
答案1
保留您的“解决方法”脚本,使用 xrandr 命令按照您想要的方式获取两个监视器。我建议编写一个小的 udev 规则来运行由“省电唤醒”内核事件触发的脚本。您可以通过运行以下命令来监控您获得的触发器类型:
udevadm monitor -u
您还可以通过运行以下命令获取有关监视器的 udev 规则密钥格式中所有可能属性的信息: udevadm info -a -n /dev/dri/card0
其中card0 是您的板载视频卡。阅读一些 udev 规则: https://linux.die.net/man/7/udev
您通常将文件放置在 /etc/udev/rules.d/ 中
仅包含以下内容的东西:
KERNEL=="card0", SUBSYSTEM=="drm", RUN+="/opt/xrandr.sh"
可能会起作用,只要纠正脚本的路径即可。希望这可以帮助。