raz*_*azr 7 xorg xrandr graphics
TL;DR:xrandr 在我的系统上随机失败,并xrandr: Configure crtc X failed在我的设置上显示错误消息,其中有两个显示器连接到扩展坞。在我多次打开和关闭单个显示器后,我大部分时间都能正常工作。
我在扩展坞上安装了联想 Thinkpad。两台显示器通过显示端口连接到该扩展坞。这是输出xrandr:
razr@notebook [~]
-> % xrandr
Screen 0: minimum 8 x 8, current 7680 x 1440, maximum 32767 x 32767
eDP1 connected 2560x1440+5120+0 (normal left inverted right x axis y axis) 340mm x 190mm
2880x1620 59.96 + 50.00
2560x1600 59.97
2560x1440 59.95*
2048x1536 60.00
1920x1440 60.00
1856x1392 60.01
1792x1344 60.01
2048x1152 60.00 59.90 59.91
1920x1200 59.88 59.95
1920x1080 59.96 60.00 59.93
1600x1200 60.00
1680x1050 59.95 59.88
1400x1050 59.98
1600x900 60.00 59.95 59.82
1280x1024 60.02
1400x900 59.96 59.88
1280x960 60.00
1440x810 60.00
1368x768 60.00 59.88 59.85
1280x800 59.81 59.91
1280x720 59.86 60.00 59.74
1024x768 60.00
1024x576 60.00 59.90 59.82
960x540 60.00 59.63 59.82
800x600 60.32 56.25
864x486 60.00 59.92 59.57
640x480 59.94
720x405 59.51 60.00 58.99
640x360 59.84 59.32 60.00
DP1 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
DP2-1 connected 2560x1440+2560+0 (normal left inverted right x axis y axis) 610mm x 350mm
3840x2160 60.00 + 30.00 29.97
2560x1440 59.95*
1920x1080 60.00 59.94
1680x1050 59.95
1600x900 60.00
1280x1024 75.02 60.02
1440x900 59.89
1280x800 59.81
1152x864 75.00
1280x720 60.00 59.94
1024x768 75.03 70.07 60.00
832x624 74.55
800x600 72.19 75.00 60.32 56.25
640x480 75.00 72.81 66.67 60.00 59.94
720x400 70.08
DP2-2 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 610mm x 350mm
3840x2160 60.00 + 30.00 29.97
2560x1440 59.95*
1920x1080 60.00 59.94
1680x1050 59.95
1600x900 60.00
1280x1024 75.02 60.02
1440x900 59.89
1280x800 59.81
1152x864 75.00
1280x720 60.00 59.94
1024x768 75.03 70.07 60.00
832x624 74.55
800x600 72.19 75.00 60.32 56.25
640x480 75.00 72.81 66.67 60.00 59.94
720x400 70.08
DP2-3 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
razr@notebook [~]
-> %
Run Code Online (Sandbox Code Playgroud)
我的系统上没有 xorg.conf。我有一个lightdm在启动时调用的 shell 脚本,它检查这些显示器是否已连接(因此笔记本在扩展坞上),如果是这种情况,则执行以下命令:
xrandr --output eDP1 --mode "1920x1080" --output DP2-1 --mode auto --left-of eDP1 --output DP2-2 --mode auto --primary --left-of DP2-1
否则,它只是将笔记本显示器的模式设置为"1920x1080"。
但这根本行不通。我总是收到类似的错误消息xrandr: Configure crtc 1 failed。我认为这个数字会不时变化。
我已经在工作中遇到过类似问题(见我的问题的结尾),所以我知道,在大多数情况下,我可以通过一次又一次地停用和重新激活显示器来解决这个问题。我arandr为此安装了它,因为它使一遍又一遍地执行此操作变得更容易一些。只有一台显示器和笔记本显示器激活它一直工作。哪个监视器处于活动状态并不重要。只有两个显示器(没有笔记本显示器)不起作用。
对于我在家的(新)设置,我无法使其正常工作。我有点让它工作,但只能"2560x1440"在两台显示器上使用模式。这也并非一直有效。有时,我必须再次arandr随机打开和取消/重新激活监视器,以达到其工作状态。直到现在我无法弄清楚那里的任何模式。有时我只是放弃,重新启动我的机器,然后希望它可以正常工作。
如前所述,我在工作时有一个非常相似的设置,在那里我做的基本相同。在工作中,这至少在我在扩展坞上启动我的机器时有效。如果我启动机器,然后将它连接到扩展坞并运行上面的命令,我会得到同样的错误。大多数情况下,在这里随机取消/重新激活监视器也能正常工作。
有谁知道为什么会发生这种情况以及我如何解决这个问题?
我怀疑您的系统只有2 个像素时钟可用于驱动您的 3 个显示器。\xc2\xb9
\n为了证实我的假设,请提供
\nxrandr --verbose | egrep \'^[^[:space:]]|curr|pref\' | sed -e \'s/(norm.*)//\'当所有显示器都正确时dmesg)xrandr --listprovidersecho $XDG_SESSION_TYPEloginctl show-session -p Type $(loginctl session-status | head -1 | cut -d\' \' -f1)99% 的人不会遇到这个问题,但如果您使用 USB-C 扩展坞(我认为 USB-C 使用独立时钟),则会出现不同的问题。
\n我并不完全清楚在连接坞站的情况下重新启动对您有何帮助,但选项并--auto没有xrandr针对节省像素时钟进行优化,但这是可能的。(它只尝试监视器喜欢的内容。)
像素时钟是您在某些输出中看到的 MHz 数。如果您受到(例如)2 个像素时钟的限制,则所有所需 \xe2\x80\x9cmodelines\xe2\x80\x9d (分辨率 + 刷新率 +甚至更多)的并集必须仅引用最多 2 个不同的频率像素时钟。
\n设置监视器时,xrandr尝试使用这些模型行中的时钟速率(重新)配置 CRTC(CRT 控制器),并且可能会因以下行的各种原因而失败(数量不同):
xrandr: Configure crtc 1 failed\nRun Code Online (Sandbox Code Playgroud)\n失败的原因之一是缺少更多的空闲时钟脉冲发生器。(还有很多其他原因!)
\nxrandr似乎没有得到问题的详细信息,但在我的系统上,我可以同时看到内核环形缓冲区中显卡驱动程序的错误(dmesg如果您收到以下消息,则消息可能会有所不同:
[drm:radeon_atom_pick_pll [radeon]] *ERROR* unable to allocate a PPLL\n[drm:drm_crtc_helper_set_config [drm_kms_helper]] *ERROR* failed to set mode on [CRTC:44:crtc-1]\nRun Code Online (Sandbox Code Playgroud)\nPLL 用于生成时钟周期。
\n使用更少的点时钟频率。在我的回答的其余部分中,我将重点讨论以不同方式处理监视器,最终目标是将数量减少到 1 或 2 个。阅读步骤,理解它们,使用您需要适应您的硬件的步骤。
\n请注意,如果不使用相同的模型线,则具有相同刷新率的相同分辨率可能仍需要不同的时钟频率。而且:不同的模型行可能使用完全相同的像素频率。
\nxrandr --verbose | grep MHz | sort --key 3 --numeric-sort --reverse | uniq\nRun Code Online (Sandbox Code Playgroud)\n该行显示了按点时钟排序的所有模型行。\xc2\xb3 一种方法是查找经常报告的频率,即使分辨率不同。我的频率为 108.000MHz:
\n....\n 1600x900 (0x5e) 108.000MHz +HSync +VSync\n 1280x960 (0x10c1) 108.000MHz +HSync +VSync\n 1280x1024 (0x5f) 108.000MHz +HSync +VSync\n 1152x864 (0x6f) 108.000MHz +HSync +VSync\n....\nRun Code Online (Sandbox Code Playgroud)\nxrandr --verbose | egrep \'^[^[:space:]]|108.000MHz\'\nRun Code Online (Sandbox Code Playgroud)\n108.000MHz 模型线适用于我的所有显示器:
\nScreen 0: minimum 320 x 200, current 5520 x 2160, maximum 8192 x 8192\nDisplayPort-0 connected primary 1920x1080+0+1080 (0x184a) normal (normal left inverted right x axis y axis) 509mm x 286mm\n 1280x1024 (0x5f) 108.000MHz +HSync +VSync\n 1280x960 (0x10c1) 108.000MHz +HSync +VSync\n 1152x864 (0x6f) 108.000MHz +HSync +VSync\nHDMI-0 connected 1920x1080+1920+1080 (0x184a) normal (normal left inverted right x axis y axis) 527mm x 296mm\n 1600x900 (0x5e) 108.000MHz +HSync +VSync\n 1280x1024 (0x5f) 108.000MHz +HSync +VSync\nDVI-0 connected 1920x1080+3600+0 (0x5a) normal (normal left inverted right x axis y axis) 477mm x 268mm\n 1280x1024 (0x5f) 108.000MHz +HSync +VSync\n 1280x960 (0x10c1) 108.000MHz +HSync +VSync\n 1152x864 (0x6f) 108.000MHz +HSync +VSync\nDVI-1 connected 1680x1050+1920+0 (0x172a) normal (normal left inverted right x axis y axis) 433mm x 270mm\n 1280x1024 (0x5f) 108.000MHz +HSync +VSync\n 1152x864 (0x6f) 108.000MHz +HSync +VSync\nRun Code Online (Sandbox Code Playgroud)\n如果某些显示器没有显示模型线,请检查 1.1 起常见分辨率的其他频率。
\n为了好玩,我什至使用了 4 种不同的分辨率,从 1.2 的输出中选择。但首先释放除一个时钟周期生成器之外的所有时钟周期生成器:
\nxrandr --output DisplayPort-0 --off \\\n --output DVI-0 --off \\\n --output DVI-1 --off \\\n --output HDMI-0 --mode 0x5e\nRun Code Online (Sandbox Code Playgroud)\n然后将其他时钟设置为相同:
\nxrandr --output DVI-1 --mode 0x6f \\\n --output DVI-0 --mode 0x10c1 \\\n --output DisplayPort-0 --mode 0x5f\nRun Code Online (Sandbox Code Playgroud)\n由于临时使用 3 个不同的时钟,一次全部设置可能会失败。\xe2\x80\x94使用十六进制模式数字(括号中的 1.2. 开始)而不是分辨率名称,因为分辨率名称统一了多个模型行,并且自动操作可能会选择错误一。
\n从要求最高的显示器(即所需的最高像素时钟)开始,这几乎总是最高分辨率。检查推荐的模型行(在 中为每个监视器标有 \xe2\x80\x9c+\xe2\x80\x9d xrandr --verbose)。
由于我们现在在单个点时钟上运行所有内容,因此您可以将任何监视器(但只有一个)设置为图形卡可以生成的任何内容。这将利用第二个时钟节拍生成器,我假设您的显卡至少有两个。
\n通常这就足够了:
\nxrandr --output W_BIGGEST_MON --auto\nRun Code Online (Sandbox Code Playgroud)\n检查其他监视器,看看是否找到带有已在使用的时钟的合适模型线。使用自定义模型行,您绝对应该使用两个时钟,除非您运行一系列完全不喜欢的监视器代!
\n您最终可能会遇到这样的情况:您希望在辅助显示器上运行略低于 \xe2\x80\x9cbest\xe2\x80\x9d 显示器的分辨率。模型行可能具有较低的像素时钟,但很容易提高该时钟。这个技巧不能太过分,因为辅助显示器不会接受远远超出其最高分辨率所需的点时钟。
\n示例:我最好的显示器都是全高清的,运行频率为 148.500MHz,但其中一台稍小,更喜欢 146.250MHz 的模式,如下所示:
\nxrandr --verbose | egrep \'^[^[:space:]]|current|preferred\'\nRun Code Online (Sandbox Code Playgroud)\n输出(缩短):
\nDisplayPort-0 connected primary 1920x1080+0+1080 (0x5a)\n 1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred\nHDMI-0 connected 1920x1080+1920+1080 (0x5a)\n 1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred\nDVI-0 connected 1920x1080+3600+0 (0x5a)\n 1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred\nDVI-1 connected 1152x864+1920+0 (0x6f)\n 1680x1050 (0x6d) 146.250MHz -HSync +VSync +preferred\nRun Code Online (Sandbox Code Playgroud)\n现在我需要一个具有 148.500MHz 点时钟的 1680x1050 模型线。有许多工具可以生成模型行。cvt不好。你不能用那个来设置点时钟。但是这个xtiming网站已经足够好了:
Modeline "1680x1050@60" 148.50 1680 1712 2208 2240 1050 1071 1081 1103(网页顶部)xrandr --newmode my-148.5MHz 148.50 1680 1712 2208 2240 1050 1071 1081 1103xrandr --addmode DVI-1 my-148.5MHz(根据需要添加显示器)xrandr --ouput DVI-1 --mode my-148.5MHz瞧:您的决心和所需的时钟刷新。
\n\xc2\xb9 在我的系统上,我只有 2 个像素时钟来驱动 4 个显示器。
\n\xc2\xb3 点时钟是像素时钟的同义词
小智 1
尝试将 xrandr 命令拆分为多个命令,如下所示:
xrandr --output eDP1 --mode "1920x1080"
xrandr --output DP2-1 --mode auto --left-of eDP1
xrandr --output DP2-2 --mode auto --primary --left-of DP2-1
Run Code Online (Sandbox Code Playgroud)
这是一个解决方法。