本文档的这一部分由 Frederick A. Niles 慷慨捐赠,他保留本节 HOWTO 中包含的所有信息的权利。
本文档的主要目的是帮助您开始运行 Linux 的双显示器配置。虽然这个过程非常直接,但在这个过程中可能会出现许多错误。
我重点介绍的例子是在第二个显示器上运行 X 服务器。我发现这很不错,因为您通常可以找到人们因为无法使用而赠送的旧的 19 英寸到 21 英寸的固定频率显示器。这样,您可以从一个小的多频显示器启动,然后在漂亮的大显示器上使用 X。
请理解,双显示器支持目前正在开发中,因此此信息变化迅速。本文档中的任何内容都可能在您阅读本文时已过时或完全不正确。
** 警告 ** 本文档是在 XFree86 4.0 发布之前编写的。如果您正在阅读本文,并且 XFree86 4.0 已经发布,那么许多事情可能已经发生了变化。如果可以找到,请尝试获取本文档的更新版本。
非常欢迎对本文档提出反馈。没有您的提交和投入,本文档将不会存在。因此,请将您的补充、评论和批评发布到<Frederick.A.Niles@gsfc.nasa.gov>.
对于本文档的内容,不承担任何责任。使用本文档中的概念、示例和其他内容,风险自负。由于这是本文档的新版本,可能存在错误和不准确之处,可能会对您的系统造成损害。请谨慎操作,尽管这种情况极不可能发生,但我对此不承担任何责任。
本文档的这一节版权归 Frederick Niles 1999 年所有,并根据以下条款分发
Linux HOWTO 文档可以完整或部分地以任何物理或电子媒介复制和分发,只要所有副本都保留此版权声明。允许并鼓励商业再分发;但是,作者希望收到任何此类分发的通知。
所有翻译、衍生作品或包含任何 Linux HOWTO 文档的集合作品都必须受此版权声明的约束。也就是说,您不得从 HOWTO 制作衍生作品并对其分发施加额外的限制。在某些条件下,可以批准对这些规则的例外;请联系以下地址的 Linux HOWTO 协调员。
如果您有任何问题,请联系 Linux HOWTO 协调员,地址为<linux-howto@sunsite.unc.edu>
大多数显卡都假定它们将是系统中唯一的显卡,并且永久设置为主显示适配器的寻址方式。但也有一些例外。
Matrox 显卡:包括 Matrox Millennium、Matrox Millennium II、Matrox Mystique、Matrox Mystique 220、Matrox Productiva G100、Matrox Mystique G200、Matrox Millennium G200 和 Matrox Marvel G200 显卡
MDA:包括单色 Hercules 图形适配器等。这仅适用于文本模式的第二个显示器支持。
注意:只有第二个适配器必须是上述之一。
本迷你 HOWTO 主要关注自由软件。但是,也有商业 X 服务器提供多显示器支持。其中包括 Metro Link (www.metrolink.com) 的 Metro-X 和 Xi Graphics (www.xig.com) 的 Accelerated-X。
您需要以下补丁和程序
fbset 程序 - 尝试 http://www.cs.kuleuven.ac.be/~geert/bin/(注意:RedHat 6.0 已经包含了此程序)
fbaddon Matrix 双显示器 Linux 内核补丁 - 尝试 ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/
con2fb 程序 - 尝试 ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/
X11 帧缓冲服务器 XF86_FBDev。这是 XFree86 3.3.1 的标准部分。
您需要做的第一件事是用 "fbaddon" 补丁修补 Linux 源代码副本。然后您需要配置内核并启用帧缓冲支持。如果您有 Matrox 显卡,请启用 Matrox 统一加速驱动程序支持以及您拥有的特定显卡类型。不要启用 VESA 帧缓冲支持。它可能会导致冲突。务必启用多显示器支持(显然)。构建内核并重新启动。
现在您需要安装 "fbset" 程序,并仔细阅读所有关于如何调整设置的文档。一旦您确定了设置,强烈建议使用 "/etc/fb.modes" 文件。fbset 程序包含一个 Perl 脚本,用于将您的 XF86Config 文件转换为 fb.modes 设置。我已在附录 A 和 B 中包含了我的 octave/Borne shell 脚本,用于转换您的 XF86Config 文件。
您需要熟练地在一个显示器上使用帧缓冲设备,了解您的设置可能出现的与多显示器支持无关的任何问题。这可以节省以后大量的挠头苦思。
我将重点解释如何在第二个显示器上运行 X,因为执行大多数其他配置只是该过程的显而易见的子集。
编译 "con2fb" 程序。如果您在没有任何参数的情况下运行它,您将收到以下使用消息:“usage: con2fb fbdev console”。
因此,一个示例命令是 "con2fb /dev/fb1 /dev/tty6",将虚拟控制台编号 6 移动到第二个显示器。使用 Ctrl-Alt-F6 移动到该控制台,并查看它是否确实显示在第二个显示器上。
仅在运行 "fbset" 命令的显示器上设置 "fbset" 设置。因此,您必须小心在第二个显示器上使用 "-fb" 标志。特别是,如果您什么都不做,您可能至少需要将虚拟垂直分辨率设置为您的实际垂直分辨率。
例如 "fbset -fb /dev/fb1 -vyres 600"
这将严重降低文本模式的速度,但没有它,X 会很糟糕。
framebuffer.txt 文件比我能解释得更好,但这里有两个重点。
确保将 "X" 的链接设置为指向 "XF86_FBDev"。
接下来,您需要在 XF86Config 文件中为帧缓冲设备添加一个 Monitor section(显示器节)。这是一个例子
# 帧缓冲服务器 Section "Screen" Driver "fbdev" Device "Millennium" Monitor "NEC MultiSync 5FGp" Subsection "Display" Depth 8 Modes "default" ViewPort 0 0 EndSubsection Subsection "Display" Depth 16 Modes "default" ViewPort 0 0 EndSubsection Subsection "Display" Depth 24 Modes "default" ViewPort 0 0 EndSubsection Subsection "Display" Depth 32 Modes "default" ViewPort 0 0 EndSubsection EndSection
使用 "default" 模式,因为我认为任何其他模式都无法与 Matrox 帧缓冲一起工作。
在第二个显示器上运行 X 服务器所涉及的步骤可以总结如下
获取内核补丁、fbset 和 con2fb
修补内核、配置、重新构建并重新启动
将 XF86_FBDev section 添加到 XF86Config 文件并设置 X 符号链接
然后每次重新启动时
移动控制台,例如 "con2fb /dev/fb1 /dev/tty6"
调整设置,例如 "fbset -fb /dev/fb1 1280x1024"
设置 FRAMEBUFFER,例如 "export FRAMEBUFFER=/dev/fb1"
启动 X 服务器,例如 "startx -- -bpp 16 vt06"
您可以每次重新启动时通过 shell 别名自动执行此操作。它必须是别名而不是 shell 脚本,因为它需要检测当前的控制台编号。这是我的 csh 别名,用于在第二个固定频率显示器上启动 X
alias startxfb = " setenv FRAMEBUFFER /dev/fb\!*; # 将环境变量设置为命令参数。 con2fb $FRAMEBUFFER /dev/$tty; # 将帧缓冲移动到当前 tty。 fbset -fb $FRAMEBUFFER 1280x1024@62; # 来自 /etc/fb.modes 的常用设置 startx -- :\!* -bpp 16 vt0`echo $tty | cut -dy f 2`' # 此 tty 上的 X。 "
在我的 .cshrc 文件中,这些都在同一行上,没有注释,但在这里更容易阅读,添加了换行符和注释。我只给出帧缓冲的编号作为参数,它就会立即启动。
我不确定如何在 bash 中执行相同的别名。我不知道如何确定当前的 tty 或在 bash 中获取别名的参数。如果有人告诉我,我将在此处插入它。但是,您可以使用 "tty" 命令获取当前 VT 的名称,并为每个 X 服务器制作两个单独的别名。
"fbset" 和 "startx" 命令都必须从与受影响的帧缓冲相同的帧缓冲运行。这严重限制了这些命令可以通过脚本自动化的程度。
XFree86 4.0 将具有“正确”的多显示器支持,但 3.3.1 没有。您可以使用 3.3.1 运行两个服务器,并使用 "x2x" 在它们之间切换...(请参阅下一个要点)
非活动的帧缓冲将仅保存上次活动时的图像,不会发生更新。
未选定的显示器并不总是在不活动时保持其状态。(但通常会保持)
Geert Uytterhoeven(帧缓冲维护者)和 Linus Torvalds 不同意当前“每个 VT 一个帧缓冲”的多显示器控制台支持更改(即“fbaddon”),因此它可能永远不会进入主流内核树。(这是第三手听说的,可能完全不真实。)
如果您“违反规则”并从不同的显示器启动 X 服务器(运行 "startx"),则机器最终可能会严重崩溃,键盘和鼠标输入全部混在一起。
内核源代码中的文档 framebuffer.txt 解释说,您可以在运行 X 时直接在 XF86Config 文件中使用 Modeline 设置。使用 Matrox 帧缓冲似乎强制 X 服务器放弃所有这些设置。因此,您一次只能有一个(“default”)设置(与您在文本模式下使用的设置相同)。
XF86_FBDev 驱动程序是未加速的。但是,在 http://www.in-berlin.de/User/kraxel/xfree86/ 有加速 Matrox 支持的补丁。
我还没有找到一种方法可以在双显示器配置下以 init level 5 启动(并且实际上在第二个显示器或两者上都有服务器)。虽然在 gdm/xdm Xservers 文件中添加一行似乎很容易,但您必须从同一帧缓冲启动 X 服务器的约束阻止了显而易见的解决方案起作用。如果有人找到了方法,请给我发电子邮件,我会将其添加到此处。
有一个名为 x2x 的漂亮小程序,当您到达屏幕边缘时,它会为您切换 X 服务器。此程序的最后一个已知主页是:http://ftp.digital.com/pub/DEC/SRC/x2x/ 它也是一个可选的 Debian 软件包。我还没有尝试过,但一些用户报告说成功了。
(注意 bpp 设置)
#!/usr/bin/octave -q bpp = 16; DCF = sscanf(argv(1,:), "%f"); HR = sscanf(argv(2,:), "%f"); SH1 = sscanf(argv(3,:), "%f"); SH2 = sscanf(argv(4,:), "%f"); HFL = sscanf(argv(5,:), "%f"); VR = sscanf(argv(6,:), "%f"); SV1 = sscanf(argv(7,:), "%f"); SV2 = sscanf(argv(8,:), "%f"); VFL = sscanf(argv(9,:), "%f"); pixclock = 1000000 / DCF; left_margin = HFL - SH2; right_margin = SH1 - HR; hsync_len = SH2 - SH1; # 3) vertical timings: upper_margin = VFL - SV2; lower_margin = SV1 - VR; vsync_len = SV2 - SV1; RR = DCF / (HFL * VFL) *1e6; HSF = DCF / HFL * 1e3; printf("mode \"%dx%d\"\n",HR,VR); printf(" # D: %3.2f MHz, H: %3.2f kHz, V: %2.2f Hz\n", DCF, HSF, RR); printf(" geometry %d %d %d %d %d\n", HR, VR, HR, VR, bpp); printf(" timings %d %d %d %d %d %d %d\n", ... pixclock, left_margin, right_margin, ... upper_margin, lower_margin, ... hsync_len, vsync_len); printf("endmode\n");
(这调用 octave 脚本 "cvtmode")
#!/bin/sh # Shell 脚本,用于将 XF86Config 文件转换为 fb.modes 文件。 # 使用 octave 脚本 cvtmode.m if [ -z $1 ]; then FILE=/etc/X11/XF86Config else FILE=$1 fi i=1 LEN=`grep Modeline $FILE | wc -l` while expr $i \< $LEN > /dev/null ; do CURLINE=`grep Modeline $FILE | cut -d'"' -f 3-20 | head -$i | tail -1 ` ./cvtmode.m $CURLINE echo " " i=`expr $i + 1` done