Multihead (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Multihead翻译。上次翻译日期:2020-03-05。如果英文版本有所更改,则您可以帮助同步翻译。

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

注意: 为避免混淆,下列名词在本文中有各自专属的含义:
  • 监视器(Monitor):物理显示设备,如液晶平板显示器。
  • 屏幕(Screen):窗口屏幕,是已经连接到一个显示区(display)监视器(monitor)
  • 显示区(Display): 一组屏幕(screens),各自同时展示同一桌面的某一部分。用户可以在同一个显示区(display)的所有屏幕(screens)之间拖动窗口。

历史背景

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

注意: 现在仍然有一种罕见的配置,经常被称作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

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

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

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

用 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-0auto指定了虚拟显示区的尺寸,设定为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

应用程序支持

Tango-view-refresh-red.pngThis article or section is out of date.Tango-view-refresh-red.png

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
提示: 利用现有的屏幕定义是最简单的,不过如果希望能够使用一组不同的屏幕分辨率的话,当然也可以作出新的屏幕定义。

通过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或等效操作切出游戏,就会进入一个没有窗口管理器在运行的空桌面。

参见