Extreme Multihead
可以将多个显示器连接到单个计算机系统。多年前,这只能通过在计算机中安装两个或更多显卡来实现。然后,一些高端显卡开始出现,带有两个显示器的输出。如今,大多数笔记本电脑都配有主显示器和一个外接显示器插槽,而台式机系统的集成显卡则标配 VGA + DVI + HDMI 输出。如果将多个显示器插入您拥有的任何视频插槽,它们通常会“正常工作”——提供相同显示器的两个或更多版本。在某些情况下,这正是所需要的;允许从不同方向查看相同的桌面。
还可以让这些多个显示器协同工作,形成一个扩展的单一桌面。甚至可以将多个计算机(每台计算机都有单一或多个显示器)的显示器合并成一个非常大的扩展桌面。
本文档介绍了如何配置此类系统。
尝试使用多显示器
开始尝试使用多显示器的最简单方法是从一个已经能够支持单个显示器的正常工作的 X 设置的系统开始。如果您已经安装了额外的设备
- 具有多个视频输出或多个视频卡的显卡
- 显示器已插入每个视频输出
一切开启后,您应该会在每个显示器上看到相同的输出。桌面被“克隆”到次级显示器上。如果所有显示器的形状完全相同或支持不同的分辨率,您可能只看到主桌面显示的一部分。
尝试配置显示器以按您希望的方式显示的最佳工具是 xrandr。它可能已作为 Xorg 安装的一部分包含在 xorg 或 xorg-apps 组中。
使用 xrandr 尝试不同的配置,直到您获得要永久保留的设置。 DualScreen 和 xrandr 页面、man 手册页以及网络上的各种位置提供了有关使用此工具的更多信息。
例如,以下命令配置了我的双显示器设置
$ xrandr --output VGA-1 --rotate left --output VGA-1 --pos 0x0 --output DVI-0 --rotate left --output DVI-0 --pos 1080x0
我有两个逻辑名称为 VGA-1 和 DVI-0 的显示器设备。这些名称可以通过命令 xrandr -q 或通过搜索 X.org 日志文件 /var/log/Xorg.0.log 来确定。两个显示器完全相同(分辨率为 1920x1080),并且可以从横向旋转或翻转到纵向。
- VGA-1 从横向旋转到纵向,逆时针旋转 90 度
--output VGA-1 --rotate left - VGA-1 是主显示器,其他显示器的位置将相对于其左上角进行测量
--output VGA-1 --pos 0x0 - DVI-0 也被旋转了
--output DVI-0 --rotate left - DVI-0 位于 VGA-1 的正右侧
--output DVI-0 --pos 1080x0
如果您还没有这样做,请创建一个包含您期望的 xrandr 命令的简单批处理脚本。将其保存在一个方便的位置;例如 /usr/local/bin。然后,您的系统可以配置为在您登录帐户时、在您的窗口管理器启动时调用此脚本。保存初始化命令有不同的位置,事实上,一些设置工具可以为您就地添加这些命令。
在 X 启动时加载配置
将命令添加到单个或系统的 xinitrc 脚本中。在窗口管理器启动后但任何应用程序被调用之前添加一行。执行该命令通常很明显,因为显示器会从基本的克隆、横向显示模式切换到独立的纵向模式。
- 系统范围的初始化文件是
/etc/X11/xinit/xinitrc - 用户的个人初始化文件是
~/.xinitrc
将设置设为默认
现在您已经拥有了跨越多个显示器的常规桌面,最好是
- 登录时显示器切换时的恼人闪烁不会发生
- 登录管理器也设置为跨越多个显示器;当您的显示器旋转时(就像我的情况一样),这尤其令人烦恼,因此您在登录时需要将头转 90 度
只需创建一个 Xorg 配置文件,其作用与 xrandr 命令相同;现在我们知道了配置是什么,这很容易。
我们需要创建两个文件
05-device.conf,用于指定如何为视频设备找到显示器配置10-monitor,用于指定显示器的实际配置
这些配置文件,以及您可能需要的用于管理键盘、鼠标和其他设备的配置,有大量可用选项,在 Multihead 和 Xorg 文档中有描述;以下示例旨在说明一个特定的解决方案。
05-device.conf
此文件用于通过命名设备来引用单个显示器配置。此配置文件应在显示器文件之前加载,因此编号较小(“05”)。
Section "Device"
Identifier "radeon"
Driver "ati"
Option "monitor-VGA-1" "VGA"
Option "monitor-DVI-0" "DVI"
EndSection
Identifier 应与实际视频设备匹配;请检查 /var/log/Xorg.0.log 以确认。同样,Driver 对应驱动程序。然后,我们通过名称引用两个显示器,指向 10-monitor.conf 文件中的相关部分。
monitor-VGA-1指定 Xorg 将检测到的显示器名称;与xrandr -q向我们报告的名称相同;名称前缀为 "monitor-"。VGA指定我们将用于引用此显示器的标识符。
基本上,我们指定了实际设备与其配置之间的关系。
10-monitor.conf
然后,此文件指定我们希望如何配置显示器。文件名不重要,只要确保它在 device 文件之后加载即可。重要的元素是 Section 名称及其 Identifier。
Section "Monitor"
Identifier "VGA"
Option "Rotate" "Left"
EndSection
Section "Monitor"
Identifier "DVI"
Option "Rotate" "Left"
Option "RightOf " "VGA"
EndSection
Option "Rotate" "Left"将每个显示器逆时针旋转 90 度。Option "RightOf" VGA将标识为 DVI 的显示器放置在标识符为 VGA 的显示器的右侧。其他可能性包括“LeftOf”、“Above”和“Below”。
有了这些配置文件,并且移除了对 xrandr 的所有引用,就可以重启显示管理器,并且
- 显示管理器应该启动,所有显示器都已正确放置和定向。
- 用户登录不会因为 xrandr 执行而闪烁。
登录时,一些窗口管理器可能会尝试重置此配置,结果是已登录的桌面已恢复为一对克隆的显示器,在某些情况下,面板会延伸到一个现在不存在的显示器上。XFCE4 的 4.10 和 4.11 版本会这样做。通常可以通过使用窗口管理器工具和配置文件来配置您的显示器设置来解决此不良行为。对于 XFCE4,这在 Xfce#Multiple monitors 中有详细说明。
将桌面扩展到本地系统之外
上一节概述了如何访问通常不在您桌面附近的系统。本节将探讨如何以这样的方式访问非常接近您桌面的系统,以至于似乎您的桌面已进一步扩展以包含这些额外的显示器。有两种可能性:
- synergy 此工具允许您的键盘和鼠标访问远程系统,方法是让您的桌面似乎扩展到远程桌面。只需将鼠标移出桌面边缘,它就会出现在远程系统上,您可以在那里使用鼠标和键盘与远程系统的 GUI 交互(即 synergy 也可以连接 Mac 和 Windows 系统)。无法将窗口拖到系统边界之外,通过远程系统的 GUI 启动的应用程序实际上是在远程系统上运行的。对于集成的 Linux 桌面,还需要设置磁盘共享。
- Xdmx X 的代理服务器允许远程系统的 X 服务器贡献其显示器到主系统的桌面。在这种情况下,桌面确实扩展到了远程系统;窗口可以跨越系统边界拖动,并且从远程显示器启动的应用程序在本地主系统上运行。在此环境中,远程系统只需要提供足够的资源来运行 X 会话。
共享鼠标和键盘
使用一个名为 Synergy 的工具,可以使单个键盘和鼠标访问多个系统,就像所有显示器都组成一个单一桌面一样。
quicksynergyAUR 提供了该应用程序的便捷包装器。
或者,还有 barrierAUR,它是 Synergy 的一个分支。
VNC
使用 X11vnc、TigerVNC 和 Xrandr,可以在本地网络上创建和共享虚拟显示器。
要创建分辨率为 HxW 且刷新率为 X Hz 的虚拟屏幕,需要创建一个“modeline”,即使用 gtf 工具 {{cl|
gtf 1280 800 120 # 1280x800 @ 120.00 Hz (GTF) hsync: 102.96 kHz; pclk: 181.21 MHz Modeline "1280x800_120.00" 181.21 1280 1376 1520 1760 800 801 804 858 -HSync +Vsync
将为 1280x800 像素分辨率、120Hz 刷新率的屏幕创建 modeline。使用高刷新率可以提高在足够快的网络上的响应速度。
可以使用 xrandr 命令配置此 modeline,使用
xrandr --newmode "1280x800_120.00" "181.21 1280 1376 1520 1760 800 801 804 858 -HSync +Vsync
然后可以使用两个命令将模式分配给输出并激活
xrandr --addmode OUTPUT "1280x800_120.00" xrandr --output OUTPUT --mode "1280x800_120.00" --right-of MAIN_SCREEN --auto
MAIN_SCREEN 是主屏幕,它可以是 eDP-1 或 eDP1,具体取决于驱动程序,通常使用 xrandr 很容易识别,因为它列在第一个并且有很多 modelines。
OUTPUT 可以是 xog 驱动程序接受的虚拟(如果可能,推荐)或实际输出。有三种可能的情况:
使用虚拟输出
一些驱动程序,例如旧的“intel”驱动程序,支持虚拟显示。在这种情况下,在 xorg 中至少创建一个虚拟显示器
/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
Identifier "intelgpu0"
Driver "intel"
Option "VirtualHeads" "1"
EndSection
输出的名称通常是 VIRTUAL1(您可以不带任何参数运行 xrandr 来检查)。然后可以使用以下命令激活虚拟显示器。
$ xrandr --output VIRTUAL1 --mode<resolution>
使用 HDMI 输出
如今,大多数驱动程序,包括 nVidia 专有驱动程序和新的 Intel 推荐的“modesetting”驱动程序,都不支持虚拟输出。在这种情况下,通常可以使用空闲的 HDMI 输出(即 HDMI-1 或 HDMI-2)。这在大多数情况下会起作用,您可以将窗口移动到虚拟屏幕并使用 VNC 导出它。
一些用户空间程序(特别是 KDE、LibreOffice Impress、Zoom)无法正确识别屏幕,并且在“双屏模式”下无法工作或可能导致一些小故障。您可以通过运行以下命令,通过 /sys/debug 接口强制启用 HDMI 输出来解决此问题:
# echo on > /sys/kernel/debug/dri/0/OUTPUT/force
其中 OUTPUT 可以是 HDMI-A-1、HDMI-A-2 或其他,具体取决于您使用的输出。请注意,名称与 xrandr 使用的名称不同。这还可能启用 HDMI 端口的音频输出,将您的系统音频重定向到伪输出。在这种情况下,您可能希望恢复到之前的音频输出。
使用 EVDI 驱动
在没有备用 HDMI 输出的特殊情况下,可以使用 evdi 创建更多输出,如 此处所述。请注意,目前此方法与使用 HDMI 输出存在相同的缺点,即输出不会显示为“已连接”,并且某些应用程序可能无法正确识别和使用它。
使用 xorg 虚拟驱动
xorg 附带了一个虚拟驱动程序,该驱动程序旨在用于通过 VNC 导出图形界面的无头服务器。原则上,可以通过向 xorg 添加虚拟设备和 xinerama 配置来设置一个虚拟设备以及一个真实设备。要使此配置正常工作很棘手,并且对于笔记本电脑来说并不理想,因为您将无法热插拔显示器。
共享屏幕
要使用 X11vnc 共享显示,可以显式指定要共享的屏幕区域
$ x11vnc -display :0 -clip <resolution>+<offset>
或者告诉 x11vnc 共享第二个(或第三个...)屏幕
$ x11vnc -display :0 -clip xinerama1
然后可以在远程计算机上显示此 VNC 实例,方法是运行
$ vncviewer -shared -ViewOnly -Fullscreen <host ip>
虽然功能齐全,但在低带宽连接上性能可能较差。
如果外接屏幕是 Android 设备,可以使用 USB 线缆获得更好的带宽。连接线缆并激活 Android 中的 USB 调试模式后,可以使用 adb 工具通过 USB 设置网络套接字
启用 USB 连接
$ adb usb
验证连接是否已建立
$ adb devices|grep "device$"
设置套接字
$ adb reverse tcp:5900 tcp:5900
然后您将能够连接到 localhost:5900
有用的 x11vnc 选项
x11vnc 的一些选项对于减少感知延迟或解决小麻烦非常有效
- -repeat:防止 x11vnc 禁用自动按键重复。
- -forever:默认情况下,x11vnc 接受单个远程连接,并在远程客户端断开连接时退出。这实际上可能是一个脚本中期望的行为,但您可以使用此选项使其保持运行。
- -xdamage -xd_area 1024 -xd_mem 1.5 x11vnc 使用 X11 的“damage”扩展,该扩展会通知它哪些屏幕部分已被修改。不幸的是,大多数应用程序都没有正确实现它,并且可能在每次按键时都指示非常大的区域,甚至整个窗口作为修改。此选项将告诉 x11vnc 不要信任大于 1024 像素(即 32x32)区域的 damage 信息。
- -nonap 当没有输入且没有屏幕更改时,x11vnc 会停止监视屏幕的时间越来越长,这意味着如果您花一分钟阅读文档,它将需要几秒钟才能唤醒。如果您觉得这很烦人,可以使用此选项。
鼠标指针选项。为了减少延迟,vnc 客户端会自己绘制鼠标光标,并将光标位置传输到服务器(这可能会使光标看起来很丑,如果它带有透明度)。
- -nocursorpos:默认情况下,x11vnc 会在所有服务器和客户端上保持光标位置同步。即,您可以移动 PC 上的鼠标来移动虚拟屏幕中的光标。如果您使用此选项,则只能通过操作 vnc 客户端来移动虚拟屏幕中的光标,即通过触摸(如果是平板电脑)。
- -multiptr 告诉 x11vnc 客户端将使用自己的鼠标光标。实际上,您将有两个指针:一个由主 PC 的鼠标控制,另一个由客户端上的触摸或鼠标控制。这可能直观或令人困惑。如果与 -nocursorpos 结合使用,您将只能使用本地屏幕上的本地鼠标和 vnc 屏幕上的远程鼠标(或触摸)。
- -noxfixes:告诉 x11vnc 不要将光标图像发送到客户端。如果光标看起来非常丑陋,或者您只使用触摸并且宁愿根本没有光标图像,则很有用。