xrandr

出自 ArchWiki

xrandr(1)RandR (Resize and Rotate) X Window 系统 扩展的官方配置实用程序。它可以用于设置屏幕输出的大小、方向或反射。有关配置多个显示器的信息,请参阅 Multihead 页面。

安装

安装 xorg-xrandr

图形前端

  • ARandR — 简单的 XRandR 可视化前端。相对显示器位置以图形方式显示,并且可以通过拖放方式更改。
https://christian.amsuess.com/tools/arandr/ || arandr
  • LXRandR — 用于 LXDE 的屏幕分辨率和显示器位置工具。也适用于 Openbox
https://github.com/lxde/lxrandr || GTK 2: lxrandr, GTK 3: lxrandr-gtk3

命令行前端

  • autorandr — 根据连接的设备自动选择显示配置。
https://github.com/phillipberndt/autorandr || autorandr
  • xlayoutdisplay — 检测和排列显示器。处理:笔记本电脑盖子状态、最高可用刷新率、计算和应用实际 DPI。最好在 .xinitrc 中使用,然后在插入/拔出显示器或关闭笔记本电脑盖子时调用。
https://github.com/alex-courtis/xlayoutdisplay || xlayoutdisplayAUR

测试配置

在不带任何选项运行时,xrandr 会显示系统上可用的不同输出的名称(VGA-1HDMI-1 等)以及每个输出上可用的分辨率,当前分辨率后跟 *,首选分辨率后跟 +

xrandr
Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 8192 x 8192
VGA-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 299mm
   1920x1080     59.93 +  60.00*   50.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1680x1050     59.88  
…
注意: 如果您的分辨率未在上表中列出,请参阅 #添加未检测到的分辨率

您可以使用 xrandr 在某些输出上设置不同的分辨率(必须在上表中列出)

$ xrandr --output HDMI-1 --mode 1920x1080

当列表中存在多个刷新率时,可以使用 --rate 选项更改刷新率,可以同时更改也可以单独更改。例如

$ xrandr --output HDMI-1 --mode 1920x1080 --rate 60

--auto 选项将打开指定的输出(如果该输出已关闭),并设置首选(最大)分辨率

$ xrandr --output HDMI-1 --auto

可以在一个命令中指定多个输出,例如,关闭 HDMI-1 并以首选分辨率打开 HDMI-2

$ xrandr --output HDMI-1 --off --output HDMI-2 --auto
注意
  • 您使用 xrandr 所做的更改仅在当前会话中有效。
  • xrandr 具有更多功能 - 有关详细信息,请参阅 xrandr(1)

配置

xrandr 只是 RandR 扩展的简单接口,没有配置文件。但是,有多种方法可以实现持久配置

  1. RandR 扩展可以通过 X 配置文件 进行配置,有关详细信息,请参阅 Multihead#RandR。此方法仅提供静态配置。
  2. 如果您需要动态配置,则需要在每次 X 服务器启动时执行 xrandr 命令。有关详细信息,请参阅 Autostarting#On Xorg startup。此方法的缺点是在启动过程中发生得相当晚,因此如果您使用 显示管理器,它将不会更改显示管理器的分辨率。
  3. 调用 xrandr 的自定义脚本可以绑定到事件(例如,当插入外接显示器时),有关详细信息,请参阅 udevacpid#脚本 部分为您提供了一些示例脚本,这些脚本可能对此目的有用。
提示: GDMSDDM 都有在 X 启动时执行的启动脚本。对于 GDM,这些脚本位于 /etc/gdm/ 中,而对于 SDDM,则在 /usr/share/sddm/scripts/Xsetup 中完成。此方法需要 root 访问权限,并且需要在系统配置文件中进行修改,但与使用 xprofile 相比,它将在启动过程中更早生效。

脚本

切换外接显示器

此脚本在外部显示器(由 $extern 指定)和默认显示器(由 $intern 指定)之间切换,以便一次只有一个显示器处于活动状态。

运行脚本时,应连接默认显示器,这对于笔记本电脑始终为真。

#!/bin/sh
intern=LVDS1
extern=VGA1

if xrandr | grep "$extern disconnected"; then
    xrandr --output "$extern" --off --output "$intern" --auto
else
    xrandr --output "$intern" --off --output "$extern" --auto
fi
注意: 要在外接显示器连接时保持默认显示器启用,请将 else 子句替换为 xrandr --output "$intern" --primary --auto --output "$extern" --right-of "$intern" --auto

管理双显示器

monsAUR 是一个符合 POSIX 标准的 shell 脚本,用于快速管理双显示器显示。

它提供了众所周知的模式,如计算机、复制、扩展和投影仪模式,以及在插入的显示器中选择和定位一个或两个显示器(有关更多详细信息,请参阅 mons)。

使用 xrasengan 避免 X 崩溃

使用此解决方法来打开可能处于挂起模式并因此显示为断开连接的已连接输出,DisplayPort 显示器通常就是这种情况

declare -i count=2
declare -i seconds=1

while ((count)); do
    xrandr >/dev/null
    sleep $seconds
    ((count--))
done

xrasenganAUR 是一个内置此解决方法的 xrandr 包装器。

$ xrasengan --force -on DisplayPort-0 -off HDMI-0

使用 --force 选项,xrasengan 将在 HDMI-0 关闭之前更新所有输出的状态,从而避免 X 崩溃(如果它们是唯一连接/活动的输出)。

要强制重新加载当前设置,xrasengan 提供了一个 --try-reload-active-layout 选项,该选项使用 --force 和来自 arandr 软件包的 unxrandr 来组装命令行

$ xrasengan --try-reload-active-layout

这可以在 systemd 单元或键盘绑定中使用,以避免从挂起状态恢复 DisplayPort 显示器时出现黑屏。

使用 arandr 进行配置

arandr 可以图形化地排列您的显示器,更改分辨率,并保存脚本以复制您的设置。默认情况下,如果您选择“另存为”,它将保存在 ~/.screenlayout/ 中。然后可以自动启动 这些文件。有时,在登录后不久运行 arandr 脚本会出现问题,如果需要,请添加 sleep 命令。

故障排除

屏幕闪烁

对于某些 LCD 屏幕(例如 Samsung 2343NW、Acer XB280HK 和 Iiyama ProLite XUB3490WQSU-B1),可以使用命令 cvt -r 来计算具有减少消隐的标准模式线,从而允许更高的频率信号。

例如:外接显示器 ProLite XUB3490WQSU-B1 通过 Thunderbolt-HDMI 2.0 适配器连接到戴尔笔记本电脑,使用 59.97Hz 刷新率时出现闪烁问题

计算所需分辨率 3440x1440 的减少模式线得出

cvt -r 3440 1440
# 3440x1440 59.97 Hz (CVT) hsync: 88.82 kHz; pclk: 319.75 MHz
Modeline "3440x1440R"  319.75  3440 3488 3520 3600  1440 1443 1453 1481 +hsync -vsync

有了这些信息,我们可以使用 xrandr 创建一个新模式

$ xrandr --newmode "3440x1440R"  319.75  3440 3488 3520 3600  1440 1443 1453 1481 +hsync -vsync

并将其添加到相应输出的有效模式集中,使其可选择

$ xrandr --addmode DP1 3440x1440R

添加未检测到的分辨率

由于硬件或驱动程序存在错误,xrandr 可能并不总是能检测到您显示器的正确分辨率。例如,从显示器查询的 EDID 数据块可能不正确。要在较低级别修复此问题,请参阅 内核模式设置#强制模式和 EDID。本节将介绍如何在更高级别通过将所需分辨率添加到 xrandr 来解决此问题。此相同过程可用于添加您知道受支持但未被驱动程序启用的刷新率。

首先,我们运行 gtfcvt 以获取我们想要的分辨率的Modeline

$ cvt 1280 1024
# 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz
Modeline "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync
提示
  • 如果您发现应用模式线后屏幕变为空白,请尝试降低刷新率(例如,30 或 45 而不是 60)。刷新率应作为第三个参数传递:cvt 2560 1440 45
注意: 如果使用 Intel 视频驱动程序 (xf86-video-intel),它可能会在 /var/log/Xorg.0.log 中报告所需的分辨率及其属性 — 如果它与 gtfcvt 的输出不同,请首先使用它。例如,日志及其与 xrandr 的使用
[    45.063] (II) intel(0): clock: 241.5 MHz   Image Size:  597 x 336 mm
[    45.063] (II) intel(0): h_active: 2560  h_sync: 2600  h_sync_end 2632 h_blank_end 2720 h_border: 0
[    45.063] (II) intel(0): v_active: 1440  v_sync: 1443  v_sync_end 1448 v_blanking: 1481 v_border: 0
$ xrandr --newmode "2560x1440" 241.50 2560 2600 2632 2720 1440 1443 1448 1481 -hsync +vsync

AMDGPU 视频驱动程序 (xf86-video-amdgpu) 的示例

[    95.798] (II) AMDGPU(0): Printing DDC gathered Modelines:
[    95.798] (II) AMDGPU(0): Modeline "1920x1080"x0.0  148.50  1920 2008 2052 2200  1080 1084 1089 1125 +hsync +vsync (67.5 kHz eP)
$ xrandr --newmode "1920x1080"x0.0  148.50  1920 2008 2052 2200  1080 1084 1089 1125 +hsync +vsync

然后我们创建一个新的 xrandr 模式。请注意,需要省略 Modeline 关键字。

$ xrandr --newmode "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync
提示: 某些程序无法识别标记为 "_60.00" 的模式,请参阅 [1]

创建模式后,我们需要一个额外的步骤将此新模式添加到我们当前的输出 (VGA1)。我们仅使用模式的名称,因为参数已预先设置。

$ xrandr --addmode VGA1 1280x1024_60.00

现在我们将屏幕的分辨率更改为我们刚刚添加的分辨率

$ xrandr --output VGA1 --mode 1280x1024_60.00

请注意,这些设置仅在本会话期间生效。有关如何在启动时自动应用它们的方法,请参阅 Autostarting#On Xorg startup

如果您不确定要测试的分辨率,可以添加 sleep 5 和一个安全的分辨率命令行,如下所示

$ xrandr --output VGA1 --mode 1280x1024_60.00 && sleep 5 && xrandr --newmode "1024x768-safe" 65.00 1024 1048 1184 1344 768 771 777 806 -HSync -VSync && xrandr --addmode VGA1 1024x768-safe && xrandr --output VGA1 --mode 1024x768-safe

另外,将 VGA1 更改为正确的输出名称。

EDID 校验和无效

如果先前的方法在启动期间导致 *ERROR* EDID checksum is invalid 错误,请参阅 KMS#强制模式和 EDID[2]

或者 xrandr --addmode 可能会给您错误 X Error of failed request: BadMatch。 NVIDIA 用户应阅读 NVIDIA/Troubleshooting#xrandr BadMatchBadMatch 可能表明 EDID 校验和无效。要验证是否是这种情况,请在详细模式下运行 X(例如,startx -- -logverbose 6)并检查您的 Xorg 日志中有关错误 EDID 的消息。

屏幕分辨率在闪烁后恢复

如果您使用 GNOME 并且您的显示器没有 EDID,则上述 #添加未检测到的分辨率 可能不起作用,您的屏幕在 xrandr --output 后只会闪烁一次。

~/.config/monitors.xml 中查找,或完全删除该文件,然后重新启动。

这篇文章 中对此进行了更好的解释。

永久添加未检测到的分辨率

使用 xrandr 找到合适的分辨率后,可以通过在 /etc/X11/xorg.conf.d/ 中创建条目来永久添加该模式

/etc/X11/xorg.conf.d/10-monitor.conf
Section "Monitor"
    Identifier "VGA1"
    Modeline "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync
    Option "PreferredMode" "1280x1024_60.00"
EndSection

Section "Screen"
    Identifier "Screen0"
    Monitor "VGA1"
    DefaultDepth 24
    SubSection "Display"
        Modes "1280x1024_60.00"
    EndSubSection
EndSection

Section "Device"
    Identifier "Device0"
    Driver "intel"
EndSection

intel 替换为正确的驱动程序,例如 nvidia。重新启动 X 服务器后,您应该能够设置新的分辨率。

如果这对您不起作用,请尝试删除 Screen 和 Device 部分,而只留下 Monitor 部分。 [3]

分辨率低于预期

提示: 如果不起作用,请先尝试 #添加未检测到的分辨率,您可以尝试此方法。

如果您的显卡被识别,但分辨率低于您的预期,您可以尝试此方法。

背景:ATI X1550 显卡和两台 LCD 显示器,分别是 DELL 2408(最高分辨率 1920x1200)和三星 206BW(最高分辨率 1680x1050)。首次安装后首次登录时,分辨率默认设置为 1152x864。 xrandr 不会列出任何高于 1152x864 的分辨率。 您可能需要尝试编辑 /etc/X11/xorg.conf,添加一个关于虚拟屏幕的 section,注销,重新登录,看看是否有帮助。 如果没有,请继续阅读。

更改 xorg.conf

/etc/X11/xorg.conf
Section "Screen"
        ...
        SubSection "Display"
                Virtual 3600 1200
        EndSubSection
EndSection

关于数字:DELL 在左侧,三星在右侧。 因此,虚拟宽度是两个 LCD 宽度的总和 3600=1920+1680; 然后高度计算为它们的最大值,即 max(1200,1050)=1200。 如果您将一台 LCD 放在另一台 LCD 的上方,请改用此计算方法:(max(宽度1, 宽度2), 高度1+高度2)。

从 .xinitrc 设置分辨率不起作用

DDX 驱动程序,除了 modesetting(4) 驱动程序的 DDX 驱动程序外,可能需要一些时间才能正确枚举连接设备的模式,以至于 xrandr 可能无法立即正常工作。 xf86-video-intel 驱动程序似乎就是这种情况,在启动早期使用 xrandr 会设置不正确的分辨率。 可能的补救措施包括

  • 等待几秒钟再调用 xrandr
~/.xinitrc
...
{ sleep 2; xrandr xrandr_parameters } &
...

这会在后台进行等待,以免阻塞其余的启动过程。 如果不希望这样做,例如,您的窗口管理器配置依赖于显示器的正确排列,则可以在前台执行命令

~/.xinitrc
...
sleep 2
xrandr xrandr_parameters
...
  • 在桌面启动的稍后部分设置模式。 有关启动脚本功能的详细信息,请参阅您的窗口管理器文档。
  • 切换到通用的 modesetting 驱动程序。 最简单的方法是卸载设备特定的 DDX 驱动程序。 对于 xf86-video-intel,该驱动程序还有其他缺陷,切换到 modesetting 驱动程序可能会带来好处; 有关更多信息,请参阅 Intel graphics#Installation

通过 underscan 属性校正过扫描电视分辨率

对于平板电视,w:overscan 看起来像是图片被“放大”了,因此边缘被切掉了。

检查您的电视是否有参数可以更改。 如果没有,请检查输出是否支持 underscan 属性 (xrandr --prop),如果支持,则应用 underscan 并更改边框值。 您需要的 underscan vborderunderscan hborder 值可能有所不同,只需检查并或多或少地更改它即可。

$ xrandr --output HDMI-0 --set underscan on --set "underscan vborder" 25 --set "underscan hborder" 40

通过 --transform 校正过扫描电视分辨率

如果 underscan 不可用,另一种解决方案是使用 xrandr --transform a,b,c,d,e,f,g,h,i,它会对输出应用变换矩阵。 有关变换的说明,请参阅 xrandr(1) § RandR_version_1.3_options 手册页。

例如,将水平坐标缩放 0.8,垂直坐标缩放 1.04,并将屏幕向右移动 35 像素,向下移动 19 像素的变换是

$ xrandr --output HDMI1 --transform 0.80,0,-35,0,1.04,-19,0,0,1

禁用幽灵显示器

在某些情况下,系统可能会检测到不存在的显示器。 要禁用它,请找到幽灵输出的名称,例如 VGA1,并使用以下命令将其关闭

$ xrandr --output VGA1 --off

要使其永久生效,请将以下内容添加到 /etc/X11/xorg.conf.d/ 中的条目中

/etc/X11/xorg.conf.d/10-monitor.conf
Section "Monitor"
    Identifier "VGA1"
    Option "Ignore" "true"
EndSection

AOC G2590PX 的动态隔行扫描图案伪影

如果您在使用此显示器在屏幕上看到运动时,看到非常明显的隔行扫描图案伪影(网格或格栅),则可能是由于刷新率过低造成的。 切换到更高的刷新率(从 60 Hz 到 119.98 Hz 甚至更高)可能有助于减少这种效果。

此显示器通过 HDMI 的 xrandr 输出示例

HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 544mm x 303mm
   1920x1080     60.00 + 119.98*   99.93    50.00    59.94

如上面的输出所示,xrandr 报告的首选刷新率为 60.00,但是使用此刷新率时,伪影非常明显。 切换到 119.98 应该有助于大大减少这种效果。

$ xrandr --output HDMI-1 --mode 1920x1080 --rate 119.98

另请参阅