极限多显示器

出自 ArchWiki

本条目或章节可能需要与多显示器合并。

提示: 仅为多显示器的一种特定情况。(在Talk:Extreme_Multihead#Multihead_Consolidation中讨论)

多台显示器可以连接到单个计算机系统。多年前,这只能通过在计算机中安装两块或更多显卡来实现。后来,一些高端显卡开始出现,带有两个显示器输出接口。如今,大多数笔记本电脑都配备一个主显示器和一个外接显示器插口,而台式机系统上的集成显卡则标配 VGA + DVI + HDMI 输出接口。如果您将多台显示器插入可用的任何视频插口,它们通常会“正常工作”——提供相同显示的两个或多个版本。在某些情况下,这正是所需要的;允许从不同方向查看相同的桌面。

也可以让这些多台显示器协同工作,作为一个扩展的单一桌面。甚至可以将来自多台计算机(每台计算机都配备单台或多台显示器)的显示器连接起来,形成一个非常大的扩展桌面。

本文档介绍如何配置这样的系统。

多显示器实验

开始多显示器实验的最简单方法是从一个工作正常的 X 设置系统开始,该系统支持单显示器。如果您已经安装了额外的设备

  • 一块带有多个视频输出接口的显卡或多块显卡
  • 插入每个视频输出接口的显示器

当所有设备都打开时,您应该在每个显示器上看到相同的输出。桌面被“克隆”到辅助显示器上。如果所有显示器的形状不完全相同或支持不同的分辨率,您可能只会看到主桌面显示的部分内容。

配置显示器以达到您期望的显示效果的最佳工具是 xrandr。这可能已经作为 Xorg 安装的一部分安装,来自 xorgxorg-apps 组。

使用 xrandr 尝试不同的配置,直到获得您想要永久保留的设置。DualScreenxrandr 页面、手册页和网络上的各种位置提供了有关使用该工具的更多信息。

例如,以下命令配置了我的双显示器设置

$ xrandr --output VGA-1 --rotate left --output VGA-1 --pos 0x0 --output DVI-0 --rotate left  --output DVI-0 --pos 1080x0

我有两个显示器设备,逻辑名称分别为 VGA-1DVI-0。这些名称可以使用命令 xrandr -q 确定,或者甚至可以通过搜索 X.org 日志文件 /var/log/Xorg.0.log 找到。两台显示器是相同的(分辨率为 1920x1080),可以从横向旋转或枢轴到纵向。

  1. VGA-1 从横向逆时针旋转 90 度到纵向 --output VGA-1 --rotate left
  2. VGA-1 是主显示器,其他显示器的位置将相对于其左上角进行测量 --output VGA-1 --pos 0x0
  3. DVI-0 也被旋转 --output DVI-0 --rotate left
  4. DVI-0 紧靠 VGA-1 的右侧 --output DVI-0 --pos 1080x0

如果您尚未这样做,请创建一个简单的批处理脚本,其中包含您所需的 xrandr 命令。将其保存在有用的位置;例如 /usr/local/bin。然后可以将您的系统配置为在您登录帐户并在窗口管理器启动时调用此脚本。保存初始化命令的位置有很多,实际上一些设置工具可以为您添加这些命令。

在 X 启动时加载配置

将命令添加到个人或系统 xinitrc 脚本中。在窗口管理器启动后但在任何应用程序被调用之前添加一行。命令的执行通常非常明显,因为显示器会从基本的克隆横向显示更改为独立的纵向模式。

注意: 这仅在手动启动 X 时有效,而不是从显示管理器(如 gdm、sddm、slim 或其他管理器)启动时有效。
  • 系统范围的初始化文件是 /etc/X11/xinit/xinitrc
  • 用户的个人初始化文件是 ~/.xinitrc

设为默认设置

现在您拥有了跨越多台显示器的常规桌面,如果能够做到以下几点会更好:

  • 登录时不再发生显示器更改时恼人的闪烁
  • 登录管理器也设置为跨越多台显示器;如果您的显示器像我一样旋转了,那么在登录时您必须将头转动 90 度,这尤其令人恼火

所有需要做的就是创建一个 Xorg 配置文件,该文件与 xrandr 命令的作用相同;现在我们知道配置应该是什么,这很容易。

我们需要创建两个文件

  • 05-device.conf 用于指定如何为视频设备找到显示器配置
  • 10-monitor 用于指定显示器的实际配置

这些配置文件以及您可能需要管理键盘、鼠标和其他设备的配置文件,在 Multihead 和 Xorg 文档中描述了许多可用的选项;下面提供的示例旨在说明一个特定的解决方案。

注意: 由于 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 的引用后,可以重新启动显示管理器,并且

  1. 显示管理器应以所有显示器都正确放置和定向的方式启动
  2. 用户登录将不再在 xrandr 执行时闪烁

当您登录时,某些窗口管理器可能会尝试重置此配置,结果是您登录后的桌面已恢复为一对克隆显示器,在某些情况下,面板会延伸到现在不存在的显示器上。XFCE4 的 4.10 和 4.11 版本会这样做。这种不良行为通常可以通过使用窗口管理器工具和配置文件配置显示器设置来解决。对于 XFCE4,这在 Xfce#Multiple monitors 中进行了解释

将桌面扩展到本地系统之外

本条目或章节已过时。

原因: Xdmx 在 Arch 上不可用,AUR 软件包已被删除。(在 Talk:Extreme Multihead 中讨论)

上一节概述了如何访问通常不在桌面附近的其它系统。本节研究如何访问非常靠近桌面的系统,以便使您的桌面看起来已经进一步扩展以包含这些额外的显示器。有两种可能性

  • synergy 此工具允许您的键盘和鼠标访问远程系统,方法是使您的桌面看起来扩展到远程桌面。只需将鼠标移出桌面边缘,它就会出现在远程系统上,鼠标和键盘都可以在其中与远程系统的 GUI 交互(即,synergy 也可以连接 Mac 和 Windows 系统)。窗口无法跨系统边界拖动,并且通过远程系统 GUI 启动的应用程序在远程系统上运行。对于集成的 Linux 桌面,还需要设置磁盘共享
  • Xdmx X 的代理服务器允许远程系统上的 X 服务器将其显示器贡献给主系统的桌面。在这种情况下,桌面真正扩展到远程系统;窗口可以跨系统边界拖动,并且从远程显示器启动的应用程序在本地主系统上运行。在这种环境中,远程系统只需要提供足够的资源来运行 X 会话。

共享鼠标和键盘

使用名为 Synergy 的工具,单个键盘和鼠标可以访问多个系统,就像它们的所有显示器都是一个桌面一样。

quicksynergyAUR 为该应用程序提供了方便的包装器。

或者,还有 barrier,它是 Synergy 的一个分支。

VNC

使用 X11vncTigerVNCXrandr,可以创建和共享虚拟显示器以在本地网络上显示。

要创建分辨率为 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 很容易识别它,因为它首先列出并且有很多 modeline。

OUTPUT 可以是 xorg 驱动程序接受的虚拟输出(如果可能,推荐使用)或真实输出。有三种可能的方案

使用虚拟输出

某些驱动程序,如旧的“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)无法正确识别屏幕,并且在“双屏模式”下无法工作,或者可能导致一些故障。您可以通过强制启用 HDMI 输出,通过 /sys/debug 接口运行以下命令来解决此问题

# echo on > /sys/kernel/debug/dri/0/OUTPUT/force

其中 OUTPUT 可以是 HDMI-A-1 或 HDMI-A-2 或其他,具体取决于您使用的输出。请注意,该名称与 xrandr 使用的名称不同。这也可能启用 HDMI 端口的音频输出,将您的系统音频重定向到假输出。在这种情况下,您可能希望恢复到以前的音频输出。

使用 EVDI 驱动

在没有备用 HDMI 输出的特殊情况下,可以滥用 evdi 来创建更多输出,如 此处 所述。请注意,目前,此方法与使用 HDMI 输出具有相同的缺点,即输出不会显示为“已连接”,并且可能无法被某些应用程序正确识别和使用。

使用 xorg dummy 驱动

xorg 附带了一个 dummy 驱动程序,该驱动程序旨在用于通过 VNC 导出图形界面的无头服务器。原则上,可以通过向 xorg 添加 dummy 设备和 xinerama 配置来与真实设备一起设置 dummy 设备。使此配置正常工作很棘手,并且对于笔记本电脑来说并不理想,因为您将无法热插拔显示器)。

共享屏幕

要使用 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)的区域时不信任该信息
  • -nonap 当没有输入且屏幕没有变化时,x11vnc 将停止监视屏幕更长的时间,这意味着如果您花一分钟阅读文档,则需要几秒钟才能唤醒它。如果您觉得这很烦人,则可以使用此选项。

鼠标指针选项。为了减少延迟,vnc 客户端在它们自己身上绘制鼠标光标,并且仅将光标位置传输到服务器(如果光标具有透明度,这会使光标看起来很丑陋)。

  • -nocursorpos:默认情况下,x11vnc 使光标位置在所有服务器和客户端上保持同步。即,您可以在 PC 上移动鼠标以在虚拟屏幕中移动光标。如果您使用此选项,则只能通过在 vnc 客户端上操作来在虚拟屏幕上移动光标,例如,如果是平板电脑,则通过触摸。
  • -multiptr 告诉 x11vnc 客户端将使用自己的鼠标光标。实际上,您将有两个指针:一个由主 PC 的鼠标控制,另一个由客户端上的触摸或鼠标控制。这可能是直观的或令人困惑的。如果与 -nocursorpos 结合使用,您将只能在本地屏幕上使用本地鼠标,而在 vnc 屏幕上使用远程鼠标(或触摸)。
  • -noxfixes:告诉 x11vnc 不要将光标图像发送到客户端。如果它看起来非常难看,或者如果您只使用触摸并且宁愿根本没有光标图像,则此选项很有用。