# Xrandr (简体中文)

Related articles

- Xorg
- Multihead

翻译状态： 本文是英文页面 Xrandr 的翻译，最后翻译时间：2013-5-13，点击这里可以查看翻译后英文页面的改动。

"xrandr" 是一款官方的 RandR Wikipedia:X Window System 扩展配置工具。它可以设置屏幕显示的大小、方向、镜像等。对多显示器的情况，请参考 Multihead 页面。

## 安装

请从 官方软件仓库安装 xorg-xrandr 软件包。除此之外，也可使用 arandr 或 lxrandr 等图形前端作为替代。

## 设置分辨率

`xrandr`命令可以直接向您分别显示系统当前有效输出设备的名称(LVDS或VGA-0等等)和所有有效分辨率。

    Screen 0: minimum 320 x 200, current 1400 x 1050, maximum 1400 x 1400
    VGA disconnected (normal left inverted right x axis y axis)
    LVDS connected 1400x1050+0+0 (normal left inverted right x axis y axis) 286mm x 214mm
       1400x1050      60.0*+   50.0
    [...]

您可以通过xrandr为某显示器指定一种分辨率，示例，且其中--output参数指定显示器，--mode参数指定一种有效分辨率：

     xrandr --output LVDS --mode 1024x768

也可以与此同时地，或独立地使用--rate参数来修改刷新率，：

     xrandr --output LVDS --mode 1024x768 --rate 75

注意: 您通过`xrandr`所作出的更改只能在当前会话暂时生效。

## 添加未被检测到的有效分辨率

由于出错的硬件或驱动，xrandr可能并不能检测出您的显示器所有的有效分辨率。不过，我们可以在xrandr里添加所需要的分辨率。

首先，运行`gtf`或者`cvt`，查询某分辨率的有效扫描频率。对于个别LCD显示器（例如samsung 2343NW），可能需要用到"cvt -r"（具有减少空白显示的效果）命令。

     $ 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 (简体中文)或`man xorg.conf`。

### 在xprofile设定xrandr命令

请阅读xprofile.

这方案具有缺点：如果您使用Display manager (简体中文)的话，那么在启动进程之后很大程度上就会执行失败，最终无法顺利修改分辨率。

### 在KDM/GDM的启动脚本设定xrandr命令

KDM和GDM都具备在X初始化时，会被自动执行的启动脚本。GDM的启动脚本放在`/etc/gdm/`， KDM的则是`/usr/share/config/kdm/Xsetup`。您可以把相关的xrandr命令添加到这些启动脚本里。

这些脚本需要root权限及其他系统配置的配合，不过在启动进程里会比xprofile更早生效。

## 图形前端

有若干`xrandr`的图形前端可供您使用：

### ARandR

ARandR为xrandr提供了一个简单易用的前端。

其软件包可通过community仓库下载到：arandr

### LXrandR

LXDE桌面环境默认的显示器配置工具。

这软件也是community仓库的一部分：lxrandr

## 疑难排除

### 分辨率低于理想值

#### 修改xorg.conf

如果您在xorg.conf所设置的显卡能被正确识别出，但是实际分辨率仍低于理想值，您不妨先参考下这方案：

假如您有一块ATI X1550基础显卡和两台LCD显示器：DELL 2408（1920x1200）和Samsung 206BW（1680x1050）。但是xrandr所列出的最高有效分辨率只有默认的1152x864。您可以试试再编辑/etc/X11/xorg.conf，即添加一条虚拟分辨率：

修改xorg.conf

    /etc/X11/xorg.conf

    Section "Screen"
            ...
            SubSection "Display"
                    Virtual 3600 1200
            EndSubSection
    EndSection

关于数字部分的理解：DELL与Samsung左右并列。于是双LCD的总宽度就共有1920+1680=3600，总高度则计为两者中的最大高度数，即max(1200,1050)=1200。如果您打算把其中一台LCD置于另一台之上，就这样计算：(max(宽度1, 宽度2), 高度1+高度2)。

再重新登录下，看看是否有效果。

## 通过Windows客户端查询有效扫描频率

请阅读Obtaining modelines from Windows program PowerStrip。

## 脚本

控制第二显示器的开关状态，默认显示器保持开启：

    ~/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

## 参见

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

Category:

- X server (简体中文)