跳转至内容

xrandr

来自 ArchWiki

xrandr(1) 是 X Window System 的 RandR (Resize and Rotate) 扩展的官方配置工具。它可用于设置屏幕输出的大小、方向或镜像。有关配置多显示器,请参阅 Multihead 页面。

安装

安装 xorg-xrandr

图形前端

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

命令行前端

  • 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#脚本 部分提供了一些可能对此有用的示例脚本。
提示 一些显示管理器有在 X 初始化时执行的启动脚本。对于 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)。

避免 X 崩溃,使用 xrasengan

使用此解决方法来开启可能处于挂起模式因此显示为断开连接的显示器,这通常是 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 选项,它使用 --forceunxrandr(来自 arandr 包)来组合命令行。

$ xrasengan --try-reload-active-layout

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

使用 arandr 配置

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

故障排除

屏幕闪烁

对于某些 LCD 屏幕(例如 Samsung 2343NW、Acer XB280HK 和 Iiyama ProLite XUB3490WQSU-B1),可以使用 cvt -r 命令计算带有减小消隐的标准化 modeline,以实现更高频率的信号。

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

计算所需分辨率 3440x1440 的减小 modeline 如下:

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

添加未检测到的分辨率

由于硬件或驱动程序存在 bug,xrandr 可能无法始终检测到您显示器的正确分辨率。例如,从显示器查询的 EDID 数据块可能不正确。要从低级别修复此问题,请参阅 Kernel mode setting#Forcing modes and 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
提示
  • 如果您发现在应用 modeline 时屏幕变黑,请尝试降低刷新率(例如,用 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#Forcing modes and EDID[2]

或者 xrandr --addmode 可能会给您一个错误 X Error of failed request: BadMatch。NVIDIA 用户应阅读 NVIDIA/Troubleshooting#xrandr BadMatchBadMatch 可能表示 EDID 校验和无效。要验证这种情况,请以 verbose 模式运行 X(例如 startx -- -logverbose 6)并检查您的 Xorg 日志中关于 bad 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)和 Samsung 206BW(最高 1680x1050)。首次登录安装后,分辨率默认为 1152x864。xrandr 未列出高于 1152x864 的分辨率。您可能需要尝试编辑 /etc/X11/xorg.conf,添加关于虚拟屏幕的部分,注销,登录,看看是否有帮助。如果没有,请继续阅读。

修改 xorg.conf

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

关于数字:DELL 在左边,Samsung 在右边。所以虚拟宽度是两个 LCD 宽度的总和 3600=1920+1680;高度则取其中最大的,即 max(1200,1050)=1200。如果您将一个 LCD 放在另一个之上,请改用此计算:(max(width1, width2), height1+height2)。

在 .xinitrc 中设置分辨率无效

除了 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,该驱动程序还有其他不足之处可能因此受益;有关更多信息,请参阅 Intel graphics#Installation

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

对于平板电视,过扫描看起来像图片被“放大”了,边缘被裁剪掉了。

检查您的电视机是否有可更改的参数。如果没有,请检查输出是否支持 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

参见