Multihead (简体中文)
多头(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为一台台式机或笔记本提供单一一块屏幕。
以上这些都意味着,要实现同一件事或者满足同一目标,互相之间略有差异的许多件事,有着很多方法。在现代的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文件进行持久设置。
用 arandr 配置
arandr 能够图形化地排列监视器、改变分辨率并保存脚本以存储设置。默认状态下点击“另存为”(Save As)会把脚本保存到 ~/.screenlayout/
,之后你就可以把这些文件加入到你的 ~/.profile
。有时候登录之后过早运行 arandr 脚本会引起问题。
编辑 ~/.profile
$ sleep 3 $ /home/<user>/.screenlayout/myLayout.sh
用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。
/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
应用程序支持
本节列出了针对特定应用程序的提示。
- 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或等效操作切出游戏,就会进入一个没有窗口管理器在运行的空桌面。