第11章  X Window 系统及虚拟控制台

11.1. 何谓 X Window 系统?
11.2. FreeBSD 上可以使用哪个 X 实现?
11.3. 为什么 X 项目会分裂?
11.4. 为何 FreeBSD 选择了使用 Xorg ports 作为默认实现?
11.5. 我想要执行 X ,我该怎么做?
11.6. 试着 要执行 X, 但是当我键入 startx 时,得到 “KDENABIO failed (Operation not permitted)” 错误。我该怎么办?
11.7. 为什么我不能在 X 里使用鼠标?
11.8. 鼠标的滚轮,能在 X 里面使用吗?
11.9. 如何使用远程的 X 显示?
11.10. 什么是 virtual console?我要怎么做才能用多一点?
11.11. 我要怎么从 X 切换到 virtual consoles?
11.12. 如何在系统引导时启动 XDM
11.13. 为什么执行 xconsole 会得到 “Couldn't open console” 的错误?
11.14. 以前我可以以一般用户的身份执行 XFree86, 为什么现在它说我一定要以 root 才能执行?
11.15. 我的 PS/2 鼠标在 X 中有点不正常?
11.16. 我的 PS/2 鼠标不能透过 MouseSystem 来运作?
11.17. 如何交换鼠标按键的顺序?
11.18. 要如何安装 splash 图形? 哪里可以找得到呢?
11.19. 我能在 X 里使用键盘上的 Windows 键吗?
11.20. 我要怎么样才能得到 OpenGL® 的 3D 硬件加速功能?

11.1. 何谓 X Window 系统?

X 视窗系统 (通常也称作 X11) 是在 UNIX® 或 类-UNIX 系统, 也包括 FreeBSD 中使用最为广泛的视窗系统。 X.Org 基金会 掌管着 X 协议标准, 以及其最新的参考实现, 版本 11 的 7.5.1 版, 您会经常看到有人将其简称为 X11

这套系统在不同的硬件平台和操作系统上也有许多不同的实现。 对其服务器端的实现, 通常也称为 X 服务

11.2. FreeBSD 上可以使用哪个 X 实现?

过去, 在 FreeBSD 上默认的 X 实现是由 The XFree86 Project, Inc. 维护的 XFree86™。 这个软件在 FreeBSD 到 4.10 和 5.2 以前的所有版本都是默认的。 尽管 Xorg 自己在这段时间也维护了一个实现, 但它基本上只是作为一个参考平台提供, 因为它本身有非常多的问题, 而代码也已年久失修。

然而, 在 2004 年初, 由于对代码变动节奏、 未来方向, 以及一些人际关系上发生的冲突, 导致一些 XFree86 开发人员离开了这个项目, 转而直接为 Xorg 进行开发。 此时, Xorg 将其代码更新到了在 XFree86 修改授权之前的最后一个版本 (XFree86 version 4.3.99.903), 并集成了许多先前独立维护的变动, 并将这一软件作为 X11R6.7.0 发布。 一个独立但相关的项目, freedesktop.org (或简写为 fd.o), 则开始重构之前的 XFree86 代码, 以便将更多的工作下放给图形卡 (以期改善性能), 并将其变得更加模块化 (以期改善可维护性, 以便更快地发布新版本, 并更容易配置)。 Xorg 计划在未来的版本中集成 freedesktop.org 所做的修改。

2004 年 7 月, 在 FreeBSD-CURRENT 上, Xorg 取代 XFree86 成为了默认实现。 此后, FreeBSD 中默认的 X11 实现就是 Xorg 了。

如欲了解进一步的信息, 请参阅 FreeBSD 使用手册中的 X11 部分。

11.3. 为什么 X 项目会分裂?

这个问题的答案已经超出了这个 FAQ 的范围。 在 Internet 上关于这个问题有许多邮件列表存档, 因此您可以使用最喜欢的搜索引擎来查找这一历史, 而不是在 FreeBSD 邮件列表中提问。 有些情况则可能只有当事人清楚。

11.4. 为何 FreeBSD 选择了使用 Xorg ports 作为默认实现?

Xorg 开发人员宣称他们的目标是更快地发布新版本, 并在其中集成新特性。 如果他们确实能做到这一点, 那么这将是非常有吸引力的。 此外, 他们的软件仍然使用传统的 X 授权, 而 XFree86 则使用了他们修改过的授权。

11.5. 我想要执行 X ,我该怎么做?

如果需要在已经装好的系统上增加 X, 则应使用 x11/xorg meta-port, 它会联编并安装所有需要的组件, 或通过 FreeBSD 预编译包来安装 Xorg:

# pkg_add -r xorg

另外, 您也可以通过在 sysinstall(8) 中选择 ConfigureDistributions, 然后是 The X.Org Distribution 来安装 Xorg。

装好 Xorg 之后, 您应按照联机手册 xorgconfig(1) 进行操作。 它会帮助您配置 Xorg 使用您的显卡、 鼠标等设备。 此外, 您也可以看看 xorgcfg(1) 工具, 它使用图形化的界面来完成 X 的配置过程。

如欲了解进一步的信息, 请参阅 FreeBSD Handbook 中的 X11 部分。

11.6.试着 要执行 X, 但是当我键入 startx 时,得到 “KDENABIO failed (Operation not permitted)” 错误。我该怎么办?

您的系统可能是以较高的 securelevel 运行的。 在提高了 securelevel 的系统上是不能运行 X 的, 因为 X 需要对 io(4) 进行写操作。 如欲了解进一步的详情, 请参阅联机手册 init(8)

所以这个问题变成: 您需要如何解决这个问题。 基本上, 您有两种选择: 要么将 securelevel 降回零 (通常是在 /etc/rc.conf), 要么在系统启动时就运行 xdm(1) (在 securelevel 被升高之前)。

请参考 问: 11.12. 以取得更多有关启动时执行 xdm(1) 的信息。

11.7. 为什么我不能在 X 里使用鼠标?

如果您用的是 syscons(4) (默认的 console 驱动程序) 的话, 您可以经由设定 FreeBSD 来让它支持在每个 virtual console 使用鼠标。 为了避免和 X 产生冲突, syscons(4) 使用了一个叫做 /dev/sysmouse 的虚拟装置。 所有鼠标产生的事件, 都会利用 moused 来写到 sysmouse 这个装置。 如果您希望在一个或更多 virtual console 上使用鼠标, 而且 还要使用 X 的话, 请参考 问: 4.5.4. 来配置 moused。

然后编辑 /etc/X11/xorg.conf 这个文件, 并确认你有以下这几行的配置:

Section "InputDevice"
   Option          "Protocol" "SysMouse"
   Option          "Device" "/dev/sysmouse"
.....

有些人比较喜欢在 X 中使用 /dev/mouse。 为了让这个配置正常工作, 需要将 /dev/mouse 连接到 /dev/sysmouse (请参考联机手册 sysmouse(4)), 具体做法是在 /etc/devfs.conf (请参考联机手册 devfs.conf(5)) 中加入下列配置:

link    sysmouse    mouse

root)身份重启 devfs(5)

# /etc/rc.d/devfs restart

11.8. 鼠标的滚轮,能在 X 里面使用吗?

可以。

您需要告诉 X 您使用的是 5 键鼠标。 要完成这项工作, 只需将 Buttons 5ZAxisMapping 4 5 写到 /etc/X11/xorg.conf 中的 “InputDevice” 小节就可以了。 例如, 您可能会希望在 /etc/X11/xorg.conf 中使用下面的 “InputDevice” 配置。

例 11-1. 在 Xorg 配合带滚轮鼠标的 “InputDevice” 配置文件片段中

Section "InputDevice"
   Identifier      "Mouse1"
   Driver          "mouse"
   Option          "Protocol" "auto"
   Option          "Device" "/dev/sysmouse"
   Option          "Buttons" "5"
   Option          "ZAxisMapping" "4 5"
EndSection

例 11-2. 在 “.emacs” 中, 设定滚轮鼠的内建页面滚动支持范例

;; wheel mouse
(global-set-key [mouse-4] 'scroll-down)
(global-set-key [mouse-5] 'scroll-up)

11.9. 如何使用远程的 X 显示?

基于安全理由, 默认的配置中是不允许一台机器启用远程窗口的。

要启用这一功能, 只需在启动 X 时指定可选的 -listen_tcp 参数:

% startx -listen_tcp
       

11.10. 什么是 virtual console?我要怎么做才能用多一点?

简单来说,virtual console 就是可以让您不必做太多复杂的设置, 例如使用网络或执行 X, 而在同一台机器上同时做好几件事的方法。

当启动系统并显示完所有开机信息之后,您就会在屏幕上看到一个 login 的提示符号。在这个时候您就可以输入您的 login name 以及 password, 然后就可以在第一个 virtual console 上开始工作了 (或者开始玩!)。

在某些情况下,您可能会想要作其它的工作,例如说是看看您正在执行的程序的说明文件, 或是当您在 FTP 传输的等待时间中看看您的邮件。 您只需要按 Alt+F2 (按住 Alt 键不放,并按下 F2 键), 然后您就会在第二个 “virtual console”上看到一个 login 提示符了! 当您想要回到原来的工作时,请按 Alt+F1

FreeBSD 在安装时的默认值是使用八个 virtual consoles。 您可以使用 Alt+F1Alt+F2Alt+F3 等等这些组合键在它们之间做切换。

如果需要更多的 virtual console 的话, 需要编辑 /etc/ttys (请参阅 ttys(5)) 并在 “Virtual terminals” 后面的注释处添加从 ttyv8ttyvc 的对应项:

# Edit the existing entry for ttyv8 in /etc/ttys and change
# "off" to "on".
ttyv8   "/usr/libexec/getty Pc"         cons25  on secure
ttyv9   "/usr/libexec/getty Pc"         cons25  on secure
ttyva   "/usr/libexec/getty Pc"         cons25  on secure
ttyvb   "/usr/libexec/getty Pc"         cons25  on secure

您想用几个就设几个。 您设的 virtual terminal 越多, 它们就用掉越多系统资源; 如果您只有不到 8MB RAM 的内存的话,这影响就大了。 您可能也会想把 secure 换成 insecure

重要: 如果您想要执行 X 的话,您 必须 为它保留 (或关掉) 至少一个 virtual terminal。 这就是说, 如果您想在按十二个 Alt 功能键时都有 login 提示符号, 而且又在同一部计算机上也想执行 X 的话,那么这真是太不幸了 ── 您只能用十一个。

取消一个 console 最简单的方法就是把它关掉。举例来说,如果 您像上面讲的一样设定了全部的 12 个 terminal 并且想要执行 X , 您必需把 virtual terminal 12 的配置从:

ttyvb   "/usr/libexec/getty Pc"         cons25  on  secure

改为:

ttyvb   "/usr/libexec/getty Pc"         cons25  off secure

如果您的键盘只有 10 个功能键的话,您就要改成这样:

ttyv9   "/usr/libexec/getty Pc"         cons25  off secure
ttyva   "/usr/libexec/getty Pc"         cons25  off secure
ttyvb   "/usr/libexec/getty Pc"         cons25  off secure

(您也可以直接把这几行砍掉。)

接下来, 想要启动这些 virtual console 最简单 (也是最干净) 的做法就是重开机。然后,如果您不想重开机的话,您可以把 X Window 关掉,然后 (以 root 身份):

# kill -HUP 1

当您执行这个命令前,您一定要完全把 X Window 关掉。如果 您不这么做的话,您的系统可能会在您执行 kill 命令后出现当掉, 或出现死锁的情况。

11.11. 我要怎么从 X 切换到 virtual consoles?

请用 Ctrl+Alt+Fn 以切回至 virtual console。 Ctrl+Alt+F1 可以切回至第一个 virtual console。

当你切回至文字 console 后,你就可以使用一般的 Alt+Fn 组合键在各 console 之间切换了。

要回到 X 的话,你必须切回至执行 X 的 virtual console。 如果你是从命令行启动的 X 的话, (例如, 使用 startx), 那么 X 会依附在下一个未使用的 virtual console, 而不是它被启动的文字 console。如果你有八个使用中的 virtual terminal,那么 X 就会在第九个上执行,你就可以使用 Alt+F9 以返回至 X 中。

11.12. 如何在系统引导时启动 XDM

启动 xdm(1) 有两种不同流派的方法。 一种是像前面的例子那样使用 /etc/ttys (参见 ttys(5)) 来启动 xdm, 另一种则是简单地在 rc.local (参见 rc(8)) 中启动 xdm, 或使用 /usr/local/etc/rc.d 中的 X 脚本来启动它。 这两种方法都是有效的, 但有时一种方法适用, 而另一种则不适用。 它们的结果都是一样的: X 会弹出一个图形化的登录提示。

使用 ttys(5) 的优点在于指明了用于启动 X 的 vty, 并将在注销之后重启 X 服务器的责任转嫁给了 init(8)rc(8) 方法的优点则在于它使得在 X 服务器出现问题时对 xdm 使用 kill xdm 变得容易。

如果透过 rc(8) 来加载, xdm 应以不带参数的方式启动 (也就是说, 以服务方式启动)。 xdm 命令必须在 getty(8) 启动 之后 运行, 否则 gettyxdm 会发生冲突, 并导致控制台发生死锁。 绕过这个问题的方法是让脚本休眠 10 秒左右, 然后再运行 xdm

即使透过 /etc/ttys 来启动 xdm, 仍然有可能出现 xdmgetty(8) 发生冲突的情况。 避免这个问题的方法是在 /usr/local/lib/X11/xdm/Xservers 文件中配置 vt 编号:

:0 local /usr/local/bin/X vt4

上面的例子会指示 X 服务器在 /dev/ttyv3 上运行。 请注意这些数字是差一的, 因为 X 服务器从一开始对 vty 进行编号, 而 FreeBSD 内核则是从零开始对 vty 进行编号。

11.13. 为什么执行 xconsole 会得到 “Couldn't open console” 的错误?

如果你是用 startx 来启动 startx 的话, /dev/console 的权限并 不会 改变, 结果就是 xterm -Cxconsole 这类的程序无法正常执行。

这一切的问题,都是因为控制台 (console) 的权限是采用系统默认值。 在一个多用户的系统里, 我们不希望每个使用者都可以直接写入系统控制台。 如果使用者是从机器的 VTY 直接 login 的话,那么 fbtab(5) 可以解决这类的问题。

简单地说,请确保 /etc/fbtab (请参考 fbtab(5)) 这个文件中的这一行没有被注释掉:

/dev/ttyv0 0600 /dev/console

这一行设定的存在可以确保从 /dev/ttyv0 登入的使用者可以控制 console。

11.14. 以前我可以以一般用户的身份执行 XFree86, 为什么现在它说我一定要以 root 才能执行?

所有的 X server 都需要以 root 来执行, 才能直接存取你的视讯硬件。旧版本的 XFree86 (<= 3.3.6) 会自动 将所附的 server 以利用 root 身份执行的方式安装起来 (setuid 为 root)。 由于 X server 都是体积庞大又复杂的程序, 显而易见地, 这是一个安全上的灾难。 因为这个原因, 新版的 XFree86 就不将这些 server 以 setuid 为 root 的方式安装。

很明显地,我们完全无法接受将 X server 以 root 的身份执行。起码就安全上不是个好主意。 有两种方法可以以一般使用者的身份使用 X。第一是利用 xdm 或是其它的 display manager (例如 kdm);第二是利用 Xwrapper

xdm 是一个处理图形界面登入的 daemon。 它通常在开机时执行起来,而且负责对使用者作身份认证,以及起动 使用者的工作环境;它可说是图形环境下的 getty(8)login(1) 的对应程序。 想得知更多有关 xdm 的信息,请参考 XFree86 文档,以及其 FAQ 项目

Xwrapper 是 X server 的包装程序;它可以 让一般使用者可以手动起动 X server 的小工具,而还能维持一定的安全 环境。它会检查传入的命令列参数,如果没问题的话,就起动适当的 X server。如果你因为某种理由而不想执行 display manager 的话, 它是为你而设定的。如果你安装了完整的 Ports 套件,你可以在 x11/wrapper 中找到它。

11.15. 我的 PS/2 鼠标在 X 中有点不正常?

您的鼠标和您的鼠标驱动程序可能存在有不同步的现象。

在极少数的案例中, 这些驱动程序会误报同步性错误, 然后您就会看到这样的内核信息:

psmintr: out of sync (xxxx != yyyy)

然后您就会发现您的鼠标不能正常运作了。

如果发生了这样的状况, 就必须将 PS/2 鼠标驱动的 flag 配置我 0x100 来关闭同步确认。 在开机提示符处输入 -c 来进入 UserConfig

boot: -c

然后,在 UserConfig 命令列中键入:

UserConfig> flags psm0 0x100
UserConfig> quit

11.16. 我的 PS/2 鼠标不能透过 MouseSystem 来运作?

有一些报告指出某些厂牌的 PS/2 鼠标只能在 “高分辨率” 状态下才能运作。如果不是的话,鼠标光标 会常常跑到屏幕的左上角去。

在 PS/2 鼠标驱动程序中设定 0x04 的 flag 会把鼠标设成高分辨率模式。在开机提示符号时用 -c 选项来进入 UserConfig

boot: -c

然后,在 UserConfig 的命令行中键入:

UserConfig> flags psm0 0x04
UserConfig> quit

前一节有提到另一个可能导致鼠标问题的原因。

11.17. 如何交换鼠标按键的顺序?

在您的 .xinitrc.xsession 中执行 xmodmap -e "pointer = 3 2 1"

11.18. 要如何安装 splash 图形? 哪里可以找得到呢?

FreeBSD 提供了在启动时显示 “splash” 图形的功能。 目前, splash 图形必须是 256 色的位图 (*.BMP) 或 ZSoft PCX (*.PCX) 文件。 此外, 如果使用标准 VGA, 它们的分辨率必须是 320x200 或更低; 而如果您的内核有编入 VESA 支持, 则可以使用大至 1024x768 的图形。 实际的 VESA 支持可以通过 VESA 内核配置选项直接联编进内核, 也可以通过在启动时加载 VESA kld 模块来启用。

要使用 splash 图形, 您需要修改控制 FreeBSD 启动过程的文件。

您的 /boot/loader.rc 必须包括这几行:

include /boot/loader.4th
start

还需要一个包含以下几行的 /boot/loader.conf

splash_bmp_load="YES"
bitmap_load="YES"

这是假设您用 /boot/splash.bmp 来当作 splash 的屏幕显示。如果想用 PCX 的档案,把它拷成 /boot/splash.pcx,如上述做出 /boot/loader.rc,再将这几行加到 /boot/loader.conf 中:

splash_pcx_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.pcx"

现在就只剩下 splash 用来显示的图文件,您可以在 http://www.baldwin.cx/splash/ 找到各种样品。

11.19. 我能在 X 里使用键盘上的 Windows 键吗?

可以。你所要作的,就是利用 xmodmap(1) 去定义你想使用的功能。

假设所有的 “Windows” 键盘都是标准的, 那这 3 个键的 keycode 分别为:

  • 115 ── Windows 键, 在左手的 CtrlAlt 键之间

  • 116 ── Windows 键, 在 AltGr 键右边

  • 117 ── Menu 键, 在右手 Ctrl 键左边

要让左手的 Windows 键对应逗点, 试试这个:

# xmodmap -e "keycode 115 = comma"

你可能要重跑你的 windows manager,才会有动作。

要让 Windows 键的对映在每次 X 起动时自动设定好,你可以在你的 ~/.xinitrc 里加上 xmodmap, 或是最好建立一个 ~/.xmodmaprc 文件, 里面每一行就是一个 xmodmap 的选项, 然后把

xmodmap $HOME/.xmodmaprc

加到你的 ~/.xinitrc 中。

例如, 你想要将这三个键各对映到 F13F14F15。 这让你能在你的程序或是 window manager 内将其对应到便利的功能上,等一下 我们会示范。

把这些放进 ~/.xmodmaprc

keycode 115 = F13
keycode 116 = F14
keycode 117 = F15

假如你用 x11-wm/fvwm2 port 的话,你可以作这样的对映, 让 F13 能够让光标所在的窗口缩成小图标 (或是反过来)。 F14 让光标所在的窗口变成最上层的窗口, 或是退到下层去 (如果它已经是最上层了的话)。 F15 则将主 Workplace (应用程序) 选单叫出来, 即使光标不在桌面上。 当你没有可见的桌面区域时, 这个功能就相当地方便 (而且按键上的图案和这个功能相吻合)。

以下的 ~/.fvwmrc 配置可作出前述的功能。

Key F13        FTIWS    A        Iconify
Key F14        FTIWS    A        RaiseLower
Key F15        A        A        Menu Workplace Nop

11.20. 我要怎么样才能得到 OpenGL® 的 3D 硬件加速功能?

是否能够使用 3D 加速能力取决于您使用的 Xorg 版本, 以及所使用的显示芯片型号。 如果您使用 nVidia 芯片, 可以通过下面的 ports 来安装针对 FreeBSD 的二进制驱动:

  • 最新的 nVidia 卡由 x11/nvidia-driver port 支持。

  • 类似 GeForce2 MX/3/4 系列的 nVidia 卡由 96XX 系列的驱动程序支持, 您可以通过 x11/nvidia-driver-96xx port 来安装。

  • 更老一些的卡, 如 GeForce 和 RIVA TNT, 由 71XX 系列的驱动程序支持, 您可以通过 x11/nvidia-driver-71xx port 来安装。

事实上, nVidia 提供了关于哪个驱动能够支持哪些显卡的详细信息。 这些信息可以从他们的网站获得: http://www.nvidia.com/object/IO_32667.html

对于 Matrox G200/G400, 您需要安装 x11-servers/mga_hal port。

对于 ATI Rage 128 和 Radeon, 请参阅联机手册 ati(4)r128(4) 以及 radeon(4)

对于 3dfx Voodoo 3、 4、 5 以及 Banshee 显卡, 有对应的 x11-servers/driglide port。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.