Xrandr - Arch Linux 中文维基

跳至內容

# Xrandr

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Xrandr，最近一次同步於 2020-11-02，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Xorg
- Multihead

本文或本節需要翻譯。要貢獻翻譯，請訪問簡體中文翻譯團隊。

附註： 原文已有大量更新，請持續更新譯文（在 Talk:Xrandr# 中討論）

"xrandr" 是一款官方的 RandR (Resize and Rotate)維基百科：X 窗口系統擴展配置工具。它可以設置屏幕顯示的大小、方向、鏡像等。對多顯示器的情況，請參考 Multihead 頁面。

## 安裝

安裝軟體包 xorg-xrandr包。

### 圖形化操作程序

- ARandR — 提供了一個簡單的圖形化程序給 XrandR。顯示器的位置會圖形化地展示出來並可以使用拖拽的方式調整。

  https://christian.amsuess.com/tools/arandr/ || arandr包

- LXRandR — 是 LXDE 中的屏幕解析度和外置顯示器管理的工具.

  https://wiki.lxde.org/en/LXRandR[失效連結 2022-09-23 ⓘ] || GTK 2: lxrandr包, GTK 3: lxrandr-gtk3包

### 命令行前端

- xlayoutdisplay — 檢測和排列顯示器。可處理：筆記本電腦開合狀態，最高有效刷新率，計算並設定當前的 DPI。最適合用在.xinitrc 中，以便於在接入或斷開外置顯示器或閉合筆記本蓋子時引用這些參數

  https://github.com/alex-courtis/xlayoutdisplay || xlayoutdisplayAUR

## 測試配置

當沒有添加任何選項直接運行時，xrandr 列出該系統可用的顯示輸出設備 (`VGA-1`, `HDMI-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 可能並不能檢測出您的顯示器所有的有效解析度。不過，我們可以在xrandr裡添加所需要的解析度。 Also, this same procedure can be used to add refresh rates you know are supported, but not enabled by your driver。

首先，運行`gtf`或者`cvt`，查詢某解析度的有效掃描頻率。

     $ 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

然後通過--newmode參數新建一種xrandr模式，輸入上面所得到的查詢結果，其中Modeline關鍵詞自然需要被省略。

       xrandr --newmode "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync

新建模式後，我們需要把這模式添加到當前的輸出設備（假定為VGA1）上。由於一些參數已經事先設置，只需輸入模式名稱即可，即1280x1024_60.00。

       xrandr --addmode VGA1 1280x1024_60.00

最後，再把VGA1的解析度指定為剛剛添加的新模式。

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

注意，以上設置同樣地只能在當前會話暫時生效。

如果您對所要添加的某解析度感到不放心，您可以追加新命令「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或DVI-I……

## 使xrandr所更改的解析度設置永久生效

使xrandr定製永久生效的方案有：

- `xorg.conf`（推薦）
- `.xprofile`
- kdm/gdm

### 在xorg.conf設置解析度（推薦）

示例：

    /etc/X11/xorg.conf

    Section "Monitor"
        Identifier      "External DVI"
        Modeline        "1280x1024_60.00"  108.88  1280 1360 1496 1712  1024 1025 1028 1060  -HSync +Vsync
        Option          "PreferredMode" "1280x1024_60.00"
    EndSection
    Section "Device"
        Identifier      "ATI Technologies, Inc. M22 [Radeon Mobility M300]"
        Driver          "ati"
        Option          "Monitor-DVI-0" "External DVI"
    EndSection
    Section "Screen"
        Identifier      "Primary Screen"
        Device          "ATI Technologies, Inc. M22 [Radeon Mobility M300]"
        DefaultDepth    24
        SubSection "Display"
            Depth           24
            Modes   "1280x1024" "1024x768" "640x480"
        EndSubSection
    EndSection

    Section "ServerLayout"
            Identifier      "Default Layout"
            Screen          "Primary Screen"
    EndSection

關於更多的配置細節，請閱讀Xorg或xorg.conf(5)。

### 在xprofile設定xrandr命令

請閱讀xprofile.

這方案具有缺點：如果您使用Display manager的話，那麼在啟動進程之後很大程度上就會執行失敗，最終無法順利修改解析度。

### 在KDM/GDM的啟動腳本設定xrandr命令

KDM和GDM都具備在X初始化時，會被自動執行的啟動腳本。GDM的啟動腳本放在`/etc/gdm/`， KDM的則是`/usr/share/config/kdm/Xsetup`，SDDM 的則是在 `/usr/share/sddm/scripts/Xsetup`。您可以把相關的xrandr命令添加到這些啟動腳本裡。

這些腳本需要root權限及其他系統配置的配合，不過在啟動進程裡會比xprofile更早生效。

## 腳本

控制第二顯示器的開關狀態，默認顯示器保持開啟：

    ~/bin/xdisplay

    #!/bin/bash
    #
    # This script toggles the extended monitor outputs if something is connected
    #

    # all available outputs
    OUTPUTS=$(xrandr |awk '$2 ~ /connected/ {print $1}')

    # your notebook LVDS monitor
    DEFAULT_OUTPUT=$(sed -ne 's/.*(LVDS[^ ]*).*/1/p' <<<$OUTPUTS)

    # get info from xrandr
    XRANDR=`xrandr`

    EXECUTE=""

    for CURRENT in $OUTPUTS
    do
            if [[ $XRANDR == *$CURRENT\ connected*  ]] # is connected
            then
                    if [[ $XRANDR == *$CURRENT\ connected\ \(* ]] # is disabled
                    then
                            EXECUTE+="--output $CURRENT --auto --above $DEFAULT_OUTPUT "
                    else
                            EXECUTE+="--output $CURRENT --off "
                    fi
            else # make sure disconnected outputs are off
                    EXECUTE+="--output $CURRENT --off "
            fi
    done

    xrandr --output $DEFAULT_OUTPUT --auto $EXECUTE

在顯示器之間切換，且只開啟其中一個。

    /usr/local/bin/toggle-display

    #!/bin/bash
    #
    # toggle-display.sh
    #
    # Iterates through connected monitors in xrander and switched to the next one
    # each time it is run.
    #

    # get info from xrandr
    xStatus=`xrandr`
    connectedOutputs=$(echo "$xStatus" | grep " connected" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/")
    activeOutput=$(echo "$xStatus" | grep -e " connected [^(]" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/")
    connected=$(echo $connectedOutputs | wc -w)

    # initialize variables
    execute="xrandr "
    default="xrandr "
    i=1
    switch=0

    for display in $connectedOutputs
    do

    	# build default configuration
    	if [ $i -eq 1 ]
    	then
    		default=$default"--output $display --auto "
    	else
    		default=$default"--output $display --off "
    	fi

    	# build "switching" configuration
    	if [ $switch -eq 1 ]
    	then
    		execute=$execute"--output $display --auto "
    		switch=0
    	else
    		execute=$execute"--output $display --off "
    	fi

    	# check whether the next output should be switched on
    	if [ $display = $activeOutput ]
    	then
    		switch=1
    	fi

    	i=$(( $i + 1 ))

    done

    # check if the default setup needs to be executed then run it
    echo "Resulting Configuration:"
    if [ -z "$(echo $execute | grep "auto")" ]
    then
    	echo "Command: $default"
    	`$default`
    else
    	echo "Command: $execute"
    	`$execute`
    fi
    echo -e "\n$(xrandr)"

您也可以使用xrr-events (from AUR)，一種負責監聽XrandR事件的daemon服務。當某台顯示器接通狀態發生變動時，就會執行相關腳本。可在man頁面進一步查詢具體信息。

## 在VNC上使用xrandr

如果您在使用某台支持xrandr的VNC伺服器，您可以通過"xrandr -s <width>x<height>"命令實時修改VNC的解析度。tigervnc就是一種支持xrandr的VNC客戶端。

示例：

    xrandr -s 1920x1200

登錄VNC之後，如果您在控制台上輸入"xrandr"，您將得到列出當前已配置模式的清單。每個模式均可通過xrandr -s選項激活。不過，若您所需要的模式並不在清單中，您可以按照以下來添加它。

示例：不妨想添加的是1024x600（上網本的一種常見解析度）

首先執行CVT，得到理想解析度所對應的正確刷新頻率。

    $ cvt 1024 600

您會得到如下類似的輸出：

    # 1024x600 59.85 Hz (CVT) hsync: 37.35 kHz; pclk: 49.00 MHz
    Modeline "1024x600_60.00"   49.00  1024 1072 1168 1312  600 603 613 624 -hsync +vsync

在以下命令使用那些關於刷新頻率的輸出部分。

    xrandr --newmode "1024x600"   49.00  1024 1072 1168 1312  600 603 613 624 -hsync +vsync
    xrandr --addmode default "1024x600"

通過以上流程，輸入xrandr -s 1024x600，就可以設置當前解析度為1024x600，但是這設置只在當前的X會話暫時生效。為確保其模式永久可用，在~/.vnc/xstartup添加以下：

    xrandr --newmode "1024x600"   49.00  1024 1072 1168 1312  600 603 613 624 -hsync +vsync
    xrandr --addmode default "1024x600"r

## 疑難排除

### 添加未檢測到的解析度

由於硬體以及驅動程序可能的缺陷，例如，請求的EDID數據塊不正確，導致 xrandr 可能不能準確偵測到顯示器的解析度。不過我們可以手工添加期望的解析度。

首先，運行 `gtf` 或 `cvt` 以獲取所需解析度的模式行（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

提示：For some LCD screens (e.g. Samsung 2343NW, Acer XB280HK), the command `cvt -r` (= with reduced blanking) is to be used.
注意：如果使用了 Intel 的顯示驅動程序 xf86-video-intel包，期望的解析度會在 `/var/log/Xorg.0.log` 中與其他特徵值一併報告——如果該值不同於 `gtf` or `cvt` 的輸出應首選該值。這裡給出一個log文件的報告值與 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

然後創建一個新的 xandr 模式。注意模式行中那些被忽略的關鍵字。

    $ xrandr --newmode "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync

創建完畢還需要一個操作步驟，把這個新模式追加到當前顯示輸出埠（VGA1）。我們只需引用模式的名稱，因為參數已經在前面設置好了。

    $ xrandr --addmode VGA1 1280x1024_60.00

現在，我們可以把屏幕解析度切換為剛剛追加的值：

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

注意，上述這些設置僅在本次會話中有效。

如果你不能確保將要測試的解析度可用，可以在後面附加一個延遲和一個安全解析度命令行，就像這樣：

    $ 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` 錯誤，參閱這裡和這裡.

也許 `xrandr --addmode` 會返回錯誤 `X Error of failed request: BadMatch`。NVIDIA 用戶請參閱 NVIDIA/Troubleshooting#xrandr BadMatch。`BadMatch` 能指示出無效的 EDID 校驗和。要驗證確實是這種情況，請以 verbose mode 運行 X 服務（例如：`startx -- -logverbose 6`）然後查閱 Xorg 日誌中有關 EDID 錯誤的信息。

### 糾正電視機解析度過掃

With a flat panel TV, w:overscan looks like the picture is "zoomed in" so the edges are cut off.

Check your TV if there is a parameter to change. If not, apply an `underscan` and change border values. The required `underscan vborder` and `underscan hborder` values can be different for you, just check it and change it by more or less.

`$ 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手冊頁面來了解`transform`的解釋.

舉個例子，將橫坐標縮放`0.8`，縱坐標縮放`1.04`，並將屏幕向右移動35像素，向下移動19像素，參考如下指令。

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

### HDMI中的Full RGB支持

當Intel驅動沒有正確設置HDMI輸出時可能出現該種問題。這會限制顏色範圍到(16-235)通過Broadcast RGB property，這導致黑色看起來不夠黑，它會變成灰色。

要驗證你是不是這種情況:

    $ xrandr --output HDMI1 --set "Broadcast RGB" "Full"

#### 屏幕解析度在屏幕閃一下之後恢復原狀

如果你使用GNOME而且你的顯示器沒有EDID, 上述#添加未檢測到的解析度可能不會工作，當你使用`xrandr --output`時，屏幕只會閃一下。

你可以試試`~/.config/monitors.xml`,或者把這個文件刪除，然後重啟計算機。

更好的解釋可以參考這個文章。

## 參見

- DualScreen Arch wiki page. How to get dual screens with Xrandr
- https://wiki.ubuntu.com/X/Config/Resolution
- Debian Wiki - RandR 1.2 tutorial
- https://bbs.archlinux.org/viewtopic.php?pid=652861
- https://nouveau.freedesktop.org/Randr12.html
- https://wiki.debian.org/XStrikeForce/HowToRandR12
- man xrandr

分類：​

- X 伺服器
- Xorg 命令
- 包含失效連結的頁面

隱藏分類：​

- 使用「模板:Translateme」標記的頁面或章節

Xrandr
新增話題