进入待机状态后第二台显示器不会唤醒(没有烦人的解决方法)

erb*_*erb 5 arch-linux nvidia multi-monitor i3 monitors

背景

我已经以一种或另一种方式遇到了这个问题很长一段时间(几年),并且在多种配置中。我已经多次更新驱动程序和内核,此时我真的不知道罪魁祸首在哪里。

这似乎是某种竞争条件,如果一个显示器在另一个之前“准备好”,另一个只会得到“无输入”,尽管 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)
Run Code Online (Sandbox Code Playgroud)
$ 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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

尝试的解决方案

多年来,我为类似的问题在谷歌上搜索了几次,但我从来没有真正发现任何有希望的东西。我曾经认为旧的 4K 显示器有些奇怪(比如坏的 EDID),但现在我在新显示器上遇到了同样的问题,我已经放弃了这种怀疑。

我发现很多关于屏幕在挂起后无法恢复的线程(通常用 修复modeset),但在我的情况下,没有真正的挂起发生,这只是屏幕关闭/消隐(并且它只发生在其中一台显示器上!) . 此外,在问题/解决方法的“竞争条件”性质方面,我也没有发现任何与我的问题类似的问题。

小智 0

保留您的“解决方法”脚本,使用 xrandr 命令按照您想要的方式获取两个监视器。我建议编写一个小的 udev 规则来运行由“唤醒省电”内核事件触发的脚本。您可以通过运行以下命令来监控您获得的触发器类型:

udevadm monitor -u
Run Code Online (Sandbox Code Playgroud)

您还可以通过运行以下命令获取有关监视器的 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"
Run Code Online (Sandbox Code Playgroud)

可能会起作用,只要纠正脚本的路径即可。希望这可以帮助。