跳转至内容

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 || 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)。

使用 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 选项,它结合使用了 --forcearandr 软件包中的 unxrandr 来组装命令。

$ xrasengan --try-reload-active-layout

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

使用 arandr 进行配置

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

故障排除

屏幕闪烁

对于某些 LCD 屏幕(例如三星 2343NW、宏碁 XB280HK 和 Iiyama ProLite XUB3490WQSU-B1),可以使用 cvt -r 命令计算具有缩减消隐(reduced blanking)的标准化模式行(modelines),从而允许更高频率的信号。

例如:通过 Thunderbolt-HDMI 2.0 适配器连接到 Dell 笔记本电脑的外接显示器 ProLite XUB3490WQSU-B1,使用 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 数据块可能不正确。若要从底层修复此问题,请参阅 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
提示
  • 如果你发现应用模式行后屏幕变黑,请尝试较低的刷新率(例如使用 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 校验和无效。若要验证这一点,请以详细模式运行 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,添加关于虚拟屏幕的部分,注销并重新登录看看是否有效。如果无效,请继续阅读。

修改 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 放在另一台之上,请改用此计算方式:(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

通过欠扫描属性纠正电视过扫描分辨率

使用平板电视时,过扫描 (overscan) 看起来就像图像被“放大”了,导致边缘被裁剪。

检查你的电视是否有相应的更改参数。如果没有,请检查输出是否支持欠扫描属性 (xrandr --prop)。如果支持,则应用 underscan 并更改边界值。所需的 underscan vborderunderscan hborder 值可能因人而异,只需检查并根据实际情况增减即可。

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

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

如果无法使用欠扫描,另一个解决方案是使用 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

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.