使用 Xinerama 配置多显示器 XFree86 V. 4.0+

Dennis Baker

修订历史
修订 3.02002-11-15修订者:drb
重大修订

本文档描述了如何配置 XFree86 版本 4.0+ 以支持多显示器和 Xinerama 扩展。


目录
1. 简介
1.1. 版权
1.2. 免责声明
1.3. 鸣谢
2. 开始入门
3. 规划
3.1. 你需要什么
3.2. 设计注意事项
3.3. 布局
4. 自动配置显卡
5. 手动配置显卡
6. 扫描 PCI 总线
7. 编辑你的 XConfig 文件
7.1. 添加你的显卡
7.2. 识别你的显卡
7.3. 配置服务器布局
8. 测试你的配置
8.1. 配置 X 自动启动 Xinerama
9. 窗口管理器和 Xinerama
10. 示例 XF86Config 文件

1. 简介

为什么你需要 Xinerama?它是什么?Xinerama 扩展在 4.0 版本中被引入到 XFree86 系统。Xinerama 是 XFree86 Release 6 Version 4.0 (X4.0) 的一个扩展,它允许应用程序和窗口管理器将两个(或更多)物理显示器作为一个大的虚拟显示器使用。

Xinerama 扩展的优点在于它们对用户空间是完全透明的。以前,应用程序只能驻留在一个显示器上,并且不能在两个显示器之间移动。窗口管理器必须经过专门编写才能支持两个显示器。有了 Xinerama,窗口管理器和应用程序无需专门编写即可支持 Xinerama 创建的更大的“虚拟桌面”。


1.1. 版权

本文档的版权归 Dennis Baker (c) 2000 所有,并根据以下 Linux 文档项目 (LDP) 许可条款分发。

除非另有说明,否则 Linux HOWTO 文档的版权归其各自作者所有。Linux HOWTO 文档可以完整或部分地以任何物理或电子媒介复制和分发,只要所有副本都保留此版权声明。允许并鼓励商业再分发;但是,作者希望收到任何此类分发的通知。

所有翻译、衍生作品或包含任何 Linux HOWTO 文档的聚合作品都必须受此版权声明的约束。也就是说,你不得从 HOWTO 生成衍生作品并对其分发施加额外的限制。在某些条件下,可以授予这些规则的例外;请联系以下地址的 Linux HOWTO 协调员。

简而言之,我们希望通过尽可能多的渠道促进此信息的传播。但是,我们确实希望保留 HOWTO 文档的版权,并希望收到任何再分发 HOWTO 的计划的通知。

如果您有任何问题,请联系


1.2. 免责声明

对于本文档的内容,我们不承担任何责任。使用文中的概念、示例和其他内容,风险自负。由于这是本文档的新版本,因此可能存在错误和不准确之处,当然,这些错误和不准确之处可能会对您的系统造成损害。请谨慎操作,尽管这种情况极不可能发生,但作者不对由此造成的任何后果承担任何责任。

除非另有明确说明,否则所有版权均归其各自所有者所有。本文档中术语的使用不应被视为影响任何商标或服务标记的有效性。

特定产品或品牌的命名不应被视为认可。

强烈建议您在进行重大安装之前备份您的系统,并在正常间隔进行备份。


1.3. 鸣谢

引言和第一部分的大部分内容都松散地基于 Nico Schottelius 提交给我的文档.

还要感谢许多通过电子邮件向我发送拼写技巧和建议的人。我尽可能地采纳了它们。

前一页精彩的免责声明是由这个美好国度中成千上万的律师提供的,他们将自己的贪婪置于常识之上。


2. 开始入门

本文档并非旨在指导您如何设置特定的显示器或显卡。事实上,我假设您的设置已经运行了 X Window。有关更多信息,请参阅 XF86 文档。

如果您使用的是单张多头显卡,您将需要参考显卡制造商的说明。我知道 nVidia 和 Matrox 都支持 Linux 多显示器设置。nVidia 在其驱动程序中包含了一些文档,但我没有这些卡进行测试,因此我没有任何具体细节。

据我所知,您可以配置的显卡类型没有限制,并且在设置中混合使用不同类型的显卡似乎也没有关系。我在本文档中使用的示例配置使用了两张不同的显卡,一张 AGP Fire GL 1000 和一张 PCI Matrox Millenium II。这对 3D 加速有什么影响我不知道,因为我目前没有加速我的任何一张显卡。

本指南假设您知道如何编辑文本文件,为 X Window 进行基本的显卡配置,从系统中添加和删除硬件,启动和停止系统服务,以及遵循简单的说明。如果您觉得在这些方面有困难,请寻求帮助。如果您损坏了任何东西,我概不负责。


3. 规划

规划 Xinerama 设置非常简单。您基本上需要考虑三件事:屏幕分辨率、颜色深度和屏幕布局。


3.1. 你需要什么

您将至少需要 2 块显卡(双头显卡也应该可以工作)和两台显示器,一个运行 XFree 的操作系统(例如 Linux 或 Solaris)和 XFree86 版本 4.0。我假设您的设置工作正常,并且 XFree86 支持您的两块显卡。

除非您最近升级或安装了 Linux,否则您可能正在运行旧版本的 X。通过键入以下命令验证您是否正在运行 4.0 或更高版本

papel:/ # X -version

您现在应该看到类似这样的内容

  XFree86 Version 4.0 / X Window System
  (protocol Version 11, revision 0, vendor release 6400)
  Release Date: 8 March 2000
         If the server is older than 6-12 months, or if your card is newer
         than the above date, look for a newer version before reporting
         problems.  (see http://www.XFree86.Org/FAQ)
  Operating System: Linux 2.3.46 i686 [ELF] 
  Module Loader present
  

如果版本不是 4.0 或更高(第一行),您将需要升级。使用您的发行版软件包管理器升级到 4.0 或更高版本,或直接从 XFree86 下载并安装。

ftp://ftp.xfree86.org/pub/XFree86/4.0/

或最好使用以下位置找到的镜像之一

http://www.xfree86.org/4.0/ftp.html

下载文件后,使用 Xinstall.sh shell 脚本安装新的 X。请注意,如果您以这种方式安装 X,它将绕过您的系统拥有的任何软件包管理。


3.2. 设计注意事项

在您的 Xinerama 设置中,每个物理屏幕都可以具有不同的分辨率。这样做有一些优势,我能够使用一台仅以 640x480 运行的旧显示器,以及一台更大的 17 英寸显示器,分辨率为 1280x1024。我还听说过 Web 开发人员和图形设计师使用一个大的“预览”屏幕,并在其侧面放置一个或两个较小的屏幕。我认为这种灵活性是 Xinerama 扩展的伟大之处之一。

大多数当前一代窗口管理器 (参见 第 9 节) 都有一些特定于 Xinerama 的 UI 问题,这些问题没有得到很好的解决。最烦人的是对死区的处理不佳。

窗口管理器假定显示区域是一个矩形,其大小等于您的总桌面高度和宽度。如果在 Xinerama 设置中使用多个显示分辨率,则您的桌面将是非矩形的。这会导致“死区”,即显示器上不存在的区域,但窗口管理器将其解释为“空”。许多窗口管理器会尝试利用此死区来放置新窗口。结果是窗口无法访问。随着窗口管理器变得 Xinerama 感知,这个问题将很快消失。

当您运行 Xinerama 时,窗口管理器也不处理最大化窗口的概念。通常发生的情况是它将您的窗口在所有可用屏幕上最大化。将 Netscape 展开在 2 个显示器上通常不是上网的最佳方式。

与屏幕分辨率不同,Xinerama 将您的整个虚拟屏幕限制为一种颜色深度。如果您计划为您的第二个显示器拉出一个廉价的显卡,您需要记住这一点。如果您的旧显卡仅支持 8 位颜色,您可能会获得更大的显示器,但大多数较新的程序在 256 色中看起来都很糟糕。


3.3. 布局

布局决策相当简单,您只需要决定如何物理布局您的显示器。大多数人只是将他们的显示器排成一排,并将他们的桌面视为一个巨大的显示器。也可以重叠显示器,或将它们放置在更复杂的布局中。但请记住我上面所说的关于窗口管理器期望矩形显示器的内容。


4. 自动配置显卡

现在是备份您现有配置文件的好时机

我是这样做的

root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.working

注意:您的系统可能有两个配置文件集 XF86Config 和 XF86Config-4。您可以处理 XF86Config-4 文件,或将 XF86Config-4 重命名为其他名称,然后处理 XF86Config 文件。从现在开始,我将假设您正在处理 XF86Config 文件。如果您正在处理 XF86Config-4,或者您的 XF86Config 文件位于 /etc/X11 以外的其他位置,您将需要相应地调整命令。

较新版本的 X 支持自动配置文件生成,并且效果非常好。如果这对您有效,您应该可以跳过接下来的几个步骤。

将您的所有显卡放入您的系统并设置您的显示器。按照您完成时的意愿设置一切,因为如果您更改内容,您将不得不稍后重复步骤。

下一步需要在没有 X 运行的情况下从控制台完成。如果您在 X 中,请立即退出。如果您的系统使用显示管理器(如 xdm 或 gdm),则您需要停止该服务。

如果您需要从 RedHat 停止显示管理器,最简单的方法是这样

root# > telinit 3

对于 Debian 或 Libranet

root# > /etc/init.d/xdm stop

如果这些方法都不起作用,请重新启动计算机并在单用户模式下启动。

一旦您到达控制台提示符并以 root 用户身份登录,请使用 configure 选项运行 X

root# > X -configure

完成此操作后,X 通常会在 root 用户的 home 目录中生成一个名为 XF86Config.new 的配置文件。测试配置文件以查看它是否正确启动 X windows

root# > X -xf86config /root/XF86Config.new

您的显示器很可能会出现通用的 X Windows 启动屏幕。如果是这样,您就成功了,只需进行一些微调即可。按 Control-Alt-Backspace 退出 X,并将新配置文件复制到 /etc/X11 目录

root# > cp /root/XF86Config.new /etc/X11/XF86Config

然后继续 第 7.3 节

如果您的显示器没有正确显示,请继续下一节手动配置您的显卡。


5. 手动配置显卡

如果您在上一步中没有备份您的 XF86Config 文件,请立即备份。例如

root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.working

一次配置一块显卡,手动配置和安装您将在最终设置中使用的每个显卡/显示器组合。如果您有几块相同的显卡,您可以配置一块并复制其他显卡的配置。

注意,无需物理交换显卡即可配置和测试您的显卡。如果您使用下面 第 6 节 中的技术并指定总线 ID。

在您设置好每张卡后,备份或打印其配置文件,因为您稍后会需要它。这是我这样做的方式

root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.Matrox

如果您的显卡是相同的,您可能只需一份副本即可。但是不要跳过此步骤,如果一切都失败了,这将是您的备份配置文件,以防我的说明误导您。

一旦您配置了所有显示器,您就快完成了...


6. 扫描 PCI 总线

对于这一部分,您需要将所有显卡都安装在系统中,并正确插入显示器。按照您完成时的意愿设置一切,因为如果您更改内容,您将不得不稍后重复步骤。

下一步需要在没有 X 运行的情况下从控制台完成。如果您在 X 中,请立即退出。如果您的系统使用显示管理器(如 xdm 或 gdm),则您需要停止该服务。

如果您需要从 RedHat 停止显示管理器,最简单的方法是这样

root# > telinit 3

对于 Debian、Storm 或 Corel

root# > /etc/init.d/xdm stop

如果这些方法都不起作用,请重新启动计算机并在单用户模式下启动。

在多显示器设置中,您需要在配置文件中显式标识每张显卡。为此,您需要使用系统分配给显卡的 PCI 总线标识符。此时,所有显卡都需要安装在您的系统中。

要查找您的 PCI 总线 ID,请执行

root# > XFree86 -scanpci 

然后 X 将为您的 PCI 总线上的每个设备输出一个代码。

(0:0:0) Intel 82443BX Host
(0:1:0) Intel 82443BX AGP
(0:7:0) Intel 82371AB PIIX4 ISA
(0:7:1) Intel 82371AB PIIX4 IDE
(0:7:2) Intel 82371AB PIIX4 USB
(0:7:3) Intel 82371AB PIIX4 ACPI
(0:9:0) Adaptec 2940U/UW
(0:11:0) 3COM 3C900 10b Combo
(0:12:0) Matrox unknown card (0x2007) using a Matrox MGA 2164W
(1:0:0) unknown card (0x1092/0x0152) using a Texas Instruments Permedia 2

PCI 卡和设备以 0 开头标识,AGP 卡以 1 开头标识。在我的例子中,我有一张 Matrox Millenium II (0:12:0) 和一张 Diamond FireGL(1:0:0)。找到您的显卡并记下与其关联的数字。重要的是您知道哪个数字对应哪张卡。


7. 编辑你的 XConfig 文件

如果我还没有让您迷失方向,那么我们现在正处于最后阶段。本节内容有点令人困惑,所以我建议您也阅读 XF86Config 的手册页,或者至少浏览一下。现在就去做...我会等你的。

 root# > man XF86Config 

7.1. 添加你的显卡

打开您当前的 XF86Config 文件并向下滚动到 Monitor Section。您需要从上面创建的特定于设备的 XF86Config 备份文件中复制以下部分:Monitor、Device、Screen。这些部分应该放在您打开的文件中对应部分之后的 XF86Config 文件中。在复制每个部分时,请确保每个部分的标识符都是唯一的,您稍后将引用这些标识符。

像泥浆一样清晰,对吧?您现在应该为每个显卡/显示器组合都有一个 Monitor Section、一个 Device Section 和一个 Screen Section,每个 Section 都应该有一个唯一的标识符。如果您仍然感到困惑,请重新阅读上一段。如果这没有帮助,请查看我包含在末尾的 第 10 节。您确实阅读了手册页,对吧?


7.2. 识别你的显卡

现在您需要在每个 Device Section 的末尾添加相应的 PCI BusID 作为选项。条目应如下所示:BusID "PCI:0:12:0",将这三个数字替换为标识您的显卡的 PCI 总线 ID,您应该从 第 6 节 中获得此 ID。这是一个我的显卡之一的 Device Section 示例。

Section "Device"
    Identifier  "FireGL"
    Driver      "glint"
    BusID      "PCI:1:0:0"
EndSection

请注意,即使 AGP 卡也使用此布局。


7.3. 配置服务器布局

现在您需要编辑 XF86Config 文件末尾的 ServerLayout Section。ServerLayout Section 准确来说就是这样,它告诉您要使用哪些屏幕,如何从逻辑上布局它们,以及要为它们分配哪些输入设备。您当前的布局适用于一个屏幕、键盘和鼠标。对于您创建的关于您的每个 Screen 部分,您都需要在本节中引用它们才能出现在您的显示器中。

使用现有的屏幕参考作为起点,为您的其他 Screen Section 创建额外的参考。参考看起来像这样

Screen "Screen 2" Relationship "Screen 1"

这定义了“Screen 2”和“Screen 1”之间的关系。有效的关系包括:RightOf、Below、Above、LeftOf、Absolute X Y、Relative。前四个关系的用法非常明显,如我的示例所示

Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 2"
    Screen "Screen 1" RightOf "Screen 2"
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

我在 第 10 节 中还有其他示例。


8. 测试你的配置

完成更改您的 XF86Config 文件后,保存它,您现在可以测试您的配置了

 root# > startx -- +xinerama 

希望您现在可以与多个伙伴一起享受 X... 呃,我的意思是,显示器。


8.1. 配置 X 自动启动 Xinerama

让 X 启动时自动加载 Xinerama 扩展的最简单方法是在 "ServerFlags section 中添加一个选项,如下所示

Section "ServerFlags"
  Option "Xinerama" "true"
  
EndSection

现在,每次启动 X 时,Xinerama 都应该启动。


9. 窗口管理器和 Xinerama

正如我上面提到的,窗口管理器不需要专门编写来支持 Xinerama。但是,窗口管理器开发人员可以做一些增强功能,使 Xinerama 用户的生活更轻松。我认为以下功能是可取的

* 智能窗口放置。

- 窗口管理器不应将窗口放置在死区或跨越两个显示器的边界。

- 新窗口应放置在当前桌面中。

* 最大化窗口应仅将窗口最大化到当前显示器。

* 窗口移动在显示器之间应具有边缘阻力(很像它们对其他窗口具有阻力一样)。

* 对话框和信息性消息不应在显示器之间弹出。

在我的旧版指南中,我列出了许多窗口管理器及其对 Xinerama 的支持级别。但现在大部分信息都已过时。大多数现代窗口管理器都在某种程度上支持 Xinerama。


10. 示例 XF86Config 文件

我当前的 XF86Config 文件

Section "Module"
    Load        "dbe"  	# Double buffer extension
    SubSection  "extmod"
      Option    "omit xfree86-dga"   # don't initialise the DGA extension
    EndSubSection
    Load        "type1"
    Load        "freetype"
# This loads the GLX module
#    Load       "glx"
EndSection

Section "Files"
    RgbPath	"/usr/X11R6/lib/X11/rgb"
    FontPath   "/usr/X11R6/lib/X11/fonts/local/"
    FontPath   "/usr/X11R6/lib/X11/fonts/misc/"
    FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
    FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
    FontPath   "/usr/X11R6/lib/X11/fonts/Type1/"
    FontPath   "/usr/X11R6/lib/X11/fonts/Speedo/"
    FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/"
    FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/"
# The module search path.  The default path is shown here.
#    ModulePath "/usr/X11R6/lib/modules"
EndSection

Section "ServerFlags"
  Option "Xinerama" "true"
EndSection

Section "InputDevice"
    Identifier	"Keyboard1"
    Driver	"Keyboard"
    Option "AutoRepeat" "500 30"
    Option "XkbRules"	"xfree86"
    Option "XkbModel"	"pc101"
    Option "XkbLayout"	"us"
EndSection

Section "InputDevice"
    Identifier	"Mouse1"
    Driver	"mouse"
    Option "Protocol"    "PS/2"
    Option "Device"      "/dev/psaux"
EndSection

Section "Monitor"
    Identifier  "Mini"
    HorizSync   31.5
    VertRefresh 50-90
EndSection

Section "Monitor"
    Identifier  "Impression"
    HorizSync   31.5 - 82.0
    VertRefresh 50-100
EndSection

# Video Card #1, Matrox Millenium II PCI Video Card
Section "Device"
    Identifier  "Matrox"
    Driver      "mga"
    VideoRam 8192
    BusID      "PCI:0:12:0"
EndSection

# Video Card # 2, Fire GL 1000 AGP video card.
Section "Device"
    Identifier  "FireGL"
    Driver      "glint"
    #VideoRam    8192
    BusID      "PCI:1:0:0"

EndSection

Section "Screen"
    Identifier  "Screen 2"
    Device      "FireGL"
    Monitor     "Impression"
    DefaultDepth 16

    Subsection "Display"
        Depth       16
        Modes       "1280x1024" "640x480"
        ViewPort    0 0
    EndSubsection
EndSection

# My Miniature monitor,  notice that I used the virtual option so it is
#   the same heighth as the larger monitor,  this is not necessary.
Section "Screen"
    Identifier  "Screen 1"
    Device      "Matrox"
    Monitor     "Mini"
    DefaultDepth 16

    Subsection "Display"
        Depth       16
        Modes       "640x480"
        ViewPort    0 0
        Virtual     640 1024
    EndSubsection
EndSection

Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 2"  
    Screen "Screen 1" Rightof "Screen 2" 
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

一个替代的 ServerLayout Section,其中一个显示器在另一个显示器之上。

Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 2"
    Screen "Screen 1" Below "Screen 2"
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

屏幕也可以重叠。在此配置中,我使两个显示器重叠 80 像素。

Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 2"
    Screen "Screen 1" Relative "Screen 2" 1200 0
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection