Multihead (简体中文) - ArchWiki

# Multihead (简体中文)

From ArchWiki
Jump to navigation Jump to search

Related articles

- Xorg (简体中文)
- xrandr (简体中文)
- NVIDIA#Multiple monitors
- Nouveau#Dual head
- AMD Catalyst#Double Screen (Dual Head / Dual Screen / Xinerama)
- ATI#Multihead setup
- Extreme Multihead

翻译状态： 本文是 Multihead 的本地化版本。上次翻译日期：2020-03-05。如果英文版本有所更改 ，则您可以帮助同步翻译。

多头（Multi-head）、多屏（multi-screen）、多显（multi-display）或多监视器（multi-monitor）是指同一台计算机上连接了多个显示设备的配置场景。本文提供多种多头的配置方式，并给出若干设置实例。

Note: 为避免混淆，下列名词在本文中有各自专属的含义：

- 监视器（Monitor）:物理显示设备，如液晶平板显示器。
- 屏幕（Screen）:窗口屏幕，是已经连接到一个显示区（display）的 监视器（monitor）。
- 显示区（Display）: 一组屏幕（screens），各自同时展示同一桌面的某一部分。用户可以在同一个显示区（display）的所有屏幕（screens）之间拖动窗口。

## 历史背景

大多数（甚至是全部）提供图形用户界面的Unix/Linux电脑都使用X窗口系统作为底层图形界面。X窗口系统1984年在麻省理工学院被开发出来。历经35年的开发、调校与新功能、新理念的加入，它的强大得到了公认。应该记得，在开发它的那个时代，常见的配置是一个运行着的X为一个分时系统中的X终端（Xterminal）们提供各自独立的视图。如今的标准情形是X为一台台式机或笔记本提供单一一块屏幕。

Note: 现在仍然有一种罕见的配置，经常被称作Zaphod display。它允许单台电脑的多个用户每人拥有独立的一组显示、鼠标和键盘，就好像每个人使用的电脑是分开的一样，但每个人的平均成本更低。

以上这些都意味着，要实现同一件事或者满足同一目标，互相之间略有差异的许多件事，有着很多方法。在现代的X版本中，有时候只需要很少量的配置或者不需要配置。最近几年的趋势是X是“自配置”（self configuring）的。当然最好的经验法则是配置越少越好，也就是“只配置出问题的地方”。

## 独立屏幕

这是为X配置多监视器的原始方法，已经存在了几十年。每个物理监视器都被指派为一块X屏幕，尽管你可以在它们之间移动鼠标，但它们或多或少都是独立的。

一般来说X显示区有一个类似于`:0`的标识符，在`DISPLAY`环境变量中设置。但在这个配置中，每块屏幕都有不同的`$DISPLAY`值。第一块屏幕是`:0.0`，第二块是`:0.1`，依此类推。

这种配置无法实现在屏幕之间移动窗口，除了一些具有多屏幕支持的特殊程序，如GIMP和Emacs。对于大多数程序，需要在启动它们时更改`DISPLAY`环境变量，使程序出现在另一块屏幕上：

    # Launch a terminal on the second screen
    $ DISPLAY=:0.1 urxvt &

或者如果在每块屏幕上都有一个终端，启动的程序会继承`DISPLAY`值从而出现在启动它的那块屏幕。但是在屏幕之间移动程序需要关闭它，然后在另一块屏幕上重新打开。

这种工作方式确实有其优点，比如如果你在一块屏幕上工作，另一块屏幕上弹出的窗口不会抢走焦点——每块屏幕都是相当独立的。

## RandR

RandR（Rotate and Resize，旋转与缩放）是一个X窗口系统扩展，允许客户端动态调整（即缩放、旋转、翻转）屏幕。多数情况下，它可以完全替代旧的Xinerama配置。这篇文章说明了为什么RandR优于Xinerama。

RandR可以通过xrandr工具为当前会话配置，或者通过xorg.conf文件进行持久设置。

Note: 同一配置有多种方法实现，可能需要进行一些实验才能找到最佳配置。

### 用 arandr 配置

arandr 能够图形化地排列监视器、改变分辨率并保存脚本以存储设置。默认状态下点击“另存为”（Save As）会把脚本保存到 `~/.screenlayout/`，之后你就可以把这些文件加入到你的 `~/.profile`。有时候登录之后过早运行 arandr 脚本会引起问题。

编辑 `~/.profile`

    $ sleep 3
    $ /home/<user>/.screenlayout/myLayout.sh

### 用xrandr配置

注意: 本节内容假定读者已经阅读过xrandr页面，了解了关于xrandr的基本信息。

你既可以对各块屏幕进行相对排列（使用`--right-of`, `--left-of`, `--above`, `--below`选项），也可以使用绝对坐标（使用`--pos`选项； 注意这种情况下你通常需要知道监视器们的分辨率）。详情请参阅xrandr(1)。以下对一些常用设置加以说明。

#### VGA1位于HDMI1左侧，均使用最佳分辨率

    $ xrandr --output VGA1 --auto --output HDMI1 --auto --right-of VGA1

`--right-of`把它前面那块屏幕（`HDMI1`）置于指定屏幕（`VGA1`）的右侧。

#### VGA1位于HDMI1右侧，均使用固定分辨率

    $ xrandr --output VGA1 --mode 1024x768 --pos 1920x0 --output HDMI1 --mode 1920x1080 --pos 0x0

或者

    $ xrandr --output VGA1 --mode 1024x768 --output HDMI1 --mode 1920x1080 --left-of VGA1

`--left-of`把它前面那块屏幕（`HDMI1`）置于指定屏幕（`VGA1`）的右侧。

#### 将多块屏幕组合为一块虚拟显示区

从randr 1.5版本开始，将多个监视器组合为一块虚拟显示区成为可能。这是Xinerama相应功能的升级版，能够用于开源驱动且不需要重启Xorg。有些桌面环境尚不支持此功能。Openbox经过测试可以支持。

执行`xrandr --listmonitors`获取监视器列表

    0: +*DisplayPort-4 1920/518x1200/324+1920+0  DisplayPort-4
    1: +DisplayPort-3 1920/518x1200/324+0+0  DisplayPort-3
    2: +HDMI-A-0 1920/518x1200/324+3840+0  HDMI-A-0

创建虚拟显示区`xrandr --setmonitor SomeName auto DisplayPort-4,DisplayPort-3,HDMI-A-0`。`auto`指定了虚拟显示区的尺寸，设定为auto会自动建立显示阵列的正确尺寸。该命令中监视器的顺序不起作用，在执行该命令之前或之后需要重新正确排列监视器。

更详细的解释见此页。

### 用xorg.conf配置

此方法与使用xrandr类似，每块屏幕都需要各自独立的`Monitor`节。标识符（`Identifier`）使用的值与`xrandr -q`所报告的相同（例如，使用`Identifier "VGA1"`而不是`--output VGA1`）。

#### 例：使用相对坐标的双屏配置

    /etc/X11/xorg.conf.d/10-monitor.conf

    Section "Monitor"
        Identifier  "VGA1"
        Option      "Primary" "true"
    EndSection

    Section "Monitor"
        Identifier  "HDMI1"
        Option      "LeftOf" "VGA1"
    EndSection

#### 例：使用相对坐标以及自定义分辨率的双屏配置

可以通过运行`$ xrandr -q`命令查询到各个监视器的ID。应当在`Device`中按照`Monitor-<ID>`的格式指明监视器的ID。

见Xrandr (简体中文)#添加未检测到的分辨率。

    /etc/X11/xorg.conf.d/10-monitor.conf

    Section "Monitor"
      Identifier "DVI"
      Modeline "1680x1050_60.00"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync
      Option "PreferredMode" "1680x1050_60.00"
      Option "LeftOf" "DP"
      Option "DPMS" "true"
    EndSection

    Section "Monitor"
      Identifier "DP"
      Modeline "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
      Option "PreferredMode" "1920x1080_60.00"
      Option "RightOf" "DVI"
      Option "DPMS" "true"
    EndSection

    Section "Screen"
      Identifier "Screen0"
      Device "Radeon" # e.g. Radeon, Intel, nvidia
      Monitor "DP"
      DefaultDepth 24
      SubSection "Display"
        Depth 24
        Virtual 3600 2130 # 1920 + 1680 (3600), 1080 + 1050 (2130)
      EndSubSection
    EndSection

    /etc/X11/xorg.conf.d/20-radeon.conf

    Section "Device"
      Identifier "Radeon"
      Driver "radeon"
      Option "Monitor-DVI-0" "DVI" # use DVI-0 as DVI
      Option "Monitor-DisplayPort-0" "DP"
    EndSection

#### 例：使用绝对坐标的双屏配置

    /etc/X11/xorg.conf.d/10-monitor.conf

    Section "Monitor"
        Identifier  "VGA1"
        Option      "PreferredMode" "1024x768"
        Option      "Position" "1920 312"
    EndSection

    Section "Monitor"
        Identifier  "HDMI1"
        Option      "PreferredMode" "1920x1080"
        Option      "Position" "0 0"
    EndSection

此例中不使用相对坐标，整个设置中能够被定位到的最左上角在0,0点。

    (0,0)-----------------+
    |                     |(1920,312)---+
    |     1920 x 1080     ||            |
    |        HDMI1        || 1024 x 768 |
    |                     ||    VGA1    |
    +---------------------++------------+

## TwinView

TwinView是nVidia的扩展，可以让系统把一块显卡上连接的两台监视器看做单块屏幕。TwinView提供Xinerama扩展，这样应用程序会知道连接了两台监视器，因此它与Xinerama不兼容。不过如果你有两台连接到同一块nVidia显卡的监视器，TwinView和Xinerama几乎没有差别（尽管这种情况下TwinView可能会提供稍好一些的性能。）

对于两台以上监视器或者监视器接在不同显卡上的情况，需要使用Xinerama而不是TwinView。同样，截至2012年4月，两台监视器的方向必须相同，不能一台水平显示，另一台垂直显示。

以前，要想在能够在屏幕之间拖动窗口的同时获得nVidia显卡的OpenGL加速，TwinView是唯一的办法。不过现在新版本的nVidia闭源驱动即使在使用Xinerama的情况下也能够提供OpenGL加速。

配置示例见NVIDIA#TwinView。

## Xinerama

Xinerama是实现真正多屏X的旧方式。Xinerama将所有监视器组合为单块屏幕（`:0`），从而可以做到在屏幕之间拖动窗口。

Xinerama通过自定义的X配置文件进行配置。也有一款叫WideGuy的图形化工具可以使得切换Xinerama更容易。注意，要使用WideGuy，你仍然需要包含一个ServerLayout节的Xorg配置。

以下是一些例子：

这是ServerLayout节，用于控制各监视器相互之间的位置关系：

    /etc/X11/xorg.conf.d/90-serverlayout.conf

    Section "ServerLayout"
      Identifier   "Main"
      Screen       0 "Primary"
      Screen       1 "DellPortraitLeft" RightOf "Primary"
      Screen       2 "Wacom" RightOf "DellPortraitLeft"
      Screen       3 "U2412" LeftOf "Primary"
      Option         "Xinerama" "1"  # enable XINERAMA extension.  Default is disabled.
    EndSection

上面这一节中的每块屏幕都在一个单独的文件里定义，比如下面这个：

    /etc/X11/xorg.conf.d/30-screen-dell2001.conf

    # Define the monitor's physical specs
    Section "Monitor"
      Identifier   "Dell 2001FP"
      VertRefresh  60
      Option  "dpms"  "on"

      # Modelines are probably unnecessary these days, but it does give you fine grained control

      # 1600x1200 @ 60.00 Hz (GTF) hsync: 74.52 kHz; pclk: 160.96 MHz
      Modeline "1600x1200"  160.96  1600 1704 1880 2160  1200 1201 1204 1242  -HSync +Vsync
    EndSection

    # Define a screen that uses the above monitor.  Note the Monitor value matches the above
    # Identifier value, and the Device value matches one of the video cards defined below
    # (the card and connector this monitor is actually plugged in to.)
    Section "Screen"
      Identifier   "DellPortraitLeft"
      Device       "GeForce 8600GTb"
      Monitor      "Dell 2001FP"
      DefaultDepth 24
      SubSection "Display"
        Depth     24
        Modes     "1600x1200"
        ViewPort  0 0
        Virtual   1600 1200
      EndSubsection

      # This screen is in portrait mode
      Option "Rotate" "left"
    EndSection

对于每个监视器都需要创建一个`Device`节，如一块接了两台监视器的显卡应当有两个Device节。下面的例子展示了两块显卡，每块两路输出，总共四台监视器的情况该如何配置。

    /etc/X11/xorg.conf.d/20-nvidia.conf

    # First head of first video card in the system
    Section "Device"
      Identifier  "GeForce 8600GT"
      Driver      "nvidia"

      # If you have multiple video cards, the BusID controls which one this definition refers
      # to.  You can omit it if you only have one card.
      BusID       "PCI:1:0:0"

      # Need to flag this as only referring to one output on the card
      Screen      0

      # For nVidia devices, this controls which connector the monitor is connected to.
      Option      "UseDisplayDevice"   "DFP-0"

      # We want control!
      Option      "DynamicTwinView"    "FALSE"

      # Various performance and configuration options
      Option      "AddARGBGLXVisuals"  "true"
      Option      "UseEDIDDpi"         "false"
      Option      "DPI"                "96 x 96"
      Option      "Coolbits"           "1"
    EndSection

    # Second head of same video card (note different Identifier but same BusID.)  We can omit
    # the UseDisplayDevice option this time as it will pick whichever one is remaining.
    Section "Device"
      Identifier  "GeForce 8600GTb"
      Driver      "nvidia"
      BusID       "PCI:1:0:0"
      # This is the second output on this card
      Screen      1

      # Same config options for all cards
      Option      "AddARGBGLXVisuals"  "true"
      Option      "UseEDIDDpi"         "false"
      Option      "DPI"                "96 x 96"
      Option      "Coolbits"           "1"
      Option      "DynamicTwinView"    "FALSE"
    EndSection

    # First head of second video card, note different BusID.
    Section "Device"
      Identifier  "G210"
      Driver      "nvidia"
      BusID       "PCI:2:0:0"
      Screen      0

      # Same config options for all cards
      Option      "AddARGBGLXVisuals"  "true"
      Option      "UseEDIDDpi"         "false"
      Option      "DPI"                "96 x 96"
      Option      "Coolbits"           "1"
      Option      "DynamicTwinView"    "FALSE"
    EndSection

    # Second head of second video card.  Output connector is set here, which means the previous
    # Device will use the other connector, whatever it may be.
    Section "Device"
      Identifier  "G210b"
      Driver      "nvidia"
      BusID       "PCI:2:0:0"
      Screen      1
      Option      "UseDisplayDevice"   "DFP-1"

      # Same config options for all cards
      Option      "AddARGBGLXVisuals"  "true"
      Option      "UseEDIDDpi"         "false"
      Option      "DPI"                "96 x 96"
      Option      "Coolbits"           "1"
      Option      "DynamicTwinView"    "FALSE"
    EndSection

## 应用程序支持

This article or section is out of date.

Reason: 本节含有过时的信息，多数与Xinerama有关。 (Discuss in Talk:Multihead (简体中文)#)

本节列出了针对特定应用程序的提示。

- mplayer：使用`-xineramascreen 1`让视频在屏幕#1（第二块屏幕）上播放。添加`xineramascreen=1`到`~/.mplayer/config`使之永久生效。
- Xonotic: if you are playing across multiple screens and you are unable to turn left/right properly, set `vid_stick_mouse` to 1 in `~/.xonotic/data/config.cfg`

### 窗口管理器

本节列出了各种窗口管理器对多监视器的支持情况。

- Awesome - 可用
- FVWM - 可用。 Has support for Xinerama and multi-screen display, such as Single Logical Screen.
- i3 - 可用
- KDE - 可用
- MATE - 可用
- Qtile - 可用
- Spectrwm - 可用（不同的屏幕属于不同的工作区，通过键盘和鼠标都可以访问与切换）——2015年3月时
- Xmonad - 可用（不同的屏幕属于不同的工作区，通过键盘和鼠标都可以访问与切换）——2014年4月时

### 显示管理器

GDM：见GDM#Setup default monitor settings。

由于显示管理器缺乏对多显示器的有效支持，有些人可能会采用`startx`和`~/.xinitrc`替代显示管理器。

### 全屏游戏

当以全屏方式运行时，很多游戏需要让它们的窗口出现在(0,0)。如果不想在位于(0,0)处的那块屏幕（也就是最左边那块）打游戏，那么将一个全屏游戏移到另一块屏幕上几乎是不可能的。

对此，一个变通办法是专门为了打游戏建立一个单独的X11配置（一个新的布局），它所配置的屏幕可能更少（或者只有一块）。然后就可以用这个单独的的布局启动游戏，而通常的桌面工作仍然使用原来的多屏配置。

要创建一个新布局，在同一目录下复制`/etc/X11/xorg.d/90-serverlayout.conf`并命名为`91-serverlayout-gaming.conf`。重要的是使用一个比90大的数字，因为数字最低的那个文件会在加载X的一开始作为默认配置使用。

把新的配置文件调整为你喜欢的游戏配置。以下例子（以前述Xinerama示例配置为基础）只定义了一块屏幕。注意，屏幕参数（如分辨率）在其他文件中定义，与通常配置共享且没有改变：

    /etc/X11/xorg.conf.d/91-serverlayout-gaming.conf

    # New screen layout only using a single screen called "Primary"
    Section "ServerLayout"
        Identifier   "Gaming"
        Screen       0 "Primary" Absolute 0 0
    EndSection

Tip: 利用现有的屏幕定义是最简单的，不过如果希望能够使用一组不同的屏幕分辨率的话，当然也可以作出新的屏幕定义。

通过`startx`脚本运行游戏即可使用这个新布局：

    # Launch Xonotic on a new X11 display using the "Gaming" layout
    startx /usr/bin/xonotic-glx -fullscreen -- :1 -layout Gaming

注意：

- 必须指定要运行的命令的绝对路径，在这里是`/usr/bin/xonotic-glx`。
- `:1`必须指向一个空的显示区。你很可能把`:0`作为第一个显示区用于桌面，所以`:1`对于大多数人应该就可以了。但如果想同时运行第二个游戏，就需要把它改成`:2`。
- 如同你可以按Alt+Ctrl+F1切换到文本控制台、按Alt+Ctrl+F7切换回X一样，新的显示区位于Alt+Ctrl+F8。所以你可以按Alt+Ctrl+F7切换回桌面，再按Alt+Ctrl+F8切换回游戏。这是因为你在运行着一个独立的X桌面，所以如果你通过Alt+Tab或等效操作切出游戏，就会进入一个没有窗口管理器在运行的空桌面。

## 参见

- 论坛帖子：如何使用Nouveau驱动实现双监视器
- 六显示器，六用户Linux系统

Category:

- X server (简体中文)

Hidden category:

- Pages or sections flagged with Template:Out of date