X Window 系统管理
当 X Window 系统首次发布时,许多人抱怨该系统庞大、缓慢且复杂。我对 X 的第一次体验是在我的 386 计算机上安装了最早发布的 Intel 硬件版本之一,该计算机运行 UNIX 系统,配备 4MB 内存和 80MB 硬盘。安装占用了驱动器的大部分空间,并且 X 运行得非常缓慢(虚拟内存大量交换),以至于根本无法使用。我很快决定从我的系统中删除它,然后继续“真正的工作”。
然而,我体验到了 X 的样子,并欣赏开发人员在其设计中采取的“高端路线”。他们结合了高度的通用性和客户端-服务器架构,但以现在普遍认为的过时硬件上的性能为代价,这一点很明显。
如今,大多数运行 Linux 的计算机都拥有足够的硬件资源来良好地运行 X,因此在廉价的桌面系统上运行 X 很常见。既然我们都在桌面上运行了 X,那么下一个障碍就是配置 X 并对其进行自定义以满足我们的需求。
我将首先简要介绍 X 的结构以及各个部分如何相互操作。一旦您了解了这一点,就更容易理解实现细节。
需要注意的最基本的事实之一是 X 不是内核的一部分。与其他操作系统(应用程序向操作系统 API 发出请求以弹出窗口、菜单等)不同,X 完全包含在用户空间中,作为普通进程运行。这些进程分为两类:客户端进程和服务器进程。
X 服务器的工作是处理硬件(图形适配器、键盘和鼠标)的接口以及一些额外的低级服务,例如绘图、颜色分配、事件处理、客户端间通信以及管理用户首选项的资源数据库。
客户端通过 X 协议与 X 服务器通信,X 协议可以在一个系统上通过进程间通信 (IPC) 运行,也可以在使用 TCP/IP 的系统之间运行。这允许 X 客户端在一个系统上运行,并在另一个系统上使用显示器、键盘和鼠标。是的,甚至可以通过互联网运行 X 协议。
例如,如果我使用 TELNET 访问我的 ISP 并运行命令 xeyes,程序将启动并在我的 Linux 系统上显示一个窗口。该程序似乎在本地运行,尽管它实际上在远程系统上运行,只是使用我的系统进行显示。其工作原理是远程系统正在运行 xeyes,而客户端(请求服务)和我的 Linux 系统正在运行 X 服务器(满足客户端的请求)。当然,这需要我的系统设置为允许这样做;我使用 xhost 命令来允许我的 ISP 的系统使用我系统上的 X 服务器。此外,我的 TELNET 会话中的 $DISPLAY 环境变量必须正确设置(见下文)。我仅将此示例用作演示;如果您希望您的系统安全,您可能不希望允许人们从外部网络访问您的 X 服务器。攻击者使用的一个技巧是放置一个覆盖您的显示器的隐形窗口,该窗口捕获所有键盘输入,包括密码。
每个显示器由一个服务器进程处理,但许多客户端可以同时使用一个显示器。最基本的客户端类型之一是窗口管理器,它允许用户操作窗口。窗口管理器执行诸如在窗口周围绘制“装饰”(边框、标题栏和按钮)之类的操作,并提供诸如弹出菜单和运行客户端的图标化之类的功能。诸如 KDE 和 Gnome 之类的桌面环境被实现为用户空间 X 客户端,所有在 X 下运行的其他应用程序也是如此。这些应用程序的复杂程度可以从 xlogo 到 Netscape Navigator 不等。
在本文的剩余部分中,我将介绍一些基本的 X Window 系统管理。完整的处理将需要整本书,因此我将仅讨论我认为对于新手 X 管理员来说最重要的几点。在大多数情况下,我将假设您已经配置并运行了 X。我将尽可能跳过诸如安全性和通过网络(在 X 终端或远程系统上)运行 X 之类的高级主题。本文介绍的是 XFree86,它随大多数 Linux 发行版一起提供。如果您正在运行商业 X 服务器,您可能需要跳过下面关于配置 X 服务器的部分,但其余涵盖的材料与您使用的服务器无关。
X Window 系统的大多数文件,包括可执行文件、库、手册页、包含文件和其他杂项文件,都保存在 /usr/X11R6 目录树中。通常有一个名为 /usr/X11 的符号链接指向该目录。
X 的系统范围配置文件位于目录 /etc/X11 中。如果您列出该目录,输出将如下所示
X fs mwm xdm XF86Config fvwm twm xinit XF86Config.0 fvwm2 wmconfig xsm
在上面的列表中,X 是指向 X 服务器可执行文件的符号链接,该可执行文件位于目录 /usr/X11R6/bin 中。请注意,在 /usr/X11R6/bin 中还有一个名为 X 的符号链接,它指向 /etc/X11/X,而不是同一目录中的 X 服务器。(是的,这样做是有原因的。你能想出为什么吗?)XF86Config 是 XFree86 X 服务器启动时读取的文件,其中包含有关鼠标、显卡、显示器以及服务器运行所需的其他一些信息。/etc/X11 中的大多数其他对象是目录,其中包含与目录同名的程序的示例启动文件。/xdm 目录包含 xdm(X 显示管理器)的启动文件。稍后我将讨论该目录中的文件。
XF86Config 文件通常在安装 Linux 期间创建。如果您尚未安装(或正常工作)X,则可以使用 xf86config 命令创建它。确保您首先收集了有关鼠标、显卡和显示器的详细信息。一旦您有了可用的 XF86Config,您就可以修改它以更改 X 的行为。在说其他任何内容之前,我想给出两个警告。
首先,在以任何方式修改文件之前,请备份该文件。事实上,即使您不打算进行任何更改,这也是一个好主意。请注意,在前一页中,我在 /etc/X11 中将文件命名为 XF86Config.0。这只是在安装 Linux 后立即制作的原始 XF86Config 的副本。如果我的 XF86Config 文件发生任何意外情况,我可以从该备份文件中快速恢复它。在对“真实”文件进行任何更改之前,我使用编号扩展名(例如 XF86Config.1、XF86Config.2、XF86Config.3 等)进行备份。这样,我创建了修改历史记录,并且可以将配置恢复到原始状态或任何以前的状态。这是系统管理员中相当常见的做法,如果您还没有这样做,我建议您立即采纳。对于您当前使用的文件版本进行此类备份也是一个好主意,以防它被 XF86Config 或 X 软件的重新安装意外覆盖。
关于 XF86Config 的第二个警告是,以 Section "Monitor" 开头并以 "EndSection" 结尾的部分包含非常敏感的信息。如果您搞砸了它,可能会对您的显示器造成物理损坏!所以不要更改它的任何部分,至少在您阅读了 XF86Config 的手册页和 XFree86-Video-Timings-HOWTO 之后再进行更改。
现在让我们玩得开心一点。可以在您的 XF86Config 文件中修改一些简单(且安全)的事情,这些事情与您的 X 会话的外观和功能有关。这两者都出现在文件底部附近,在以 Section "Screen" 开头并以 "EndSection" 结尾的部分中。查看您的 XF86Config 文件。请注意,有几个 Screen 部分。每个部分都对应于一个特定的 X 服务器,由“Driver”标签标记。您需要识别与您正在运行的服务器相对应的部分。如果您的显卡相当新,您可能正在运行加速服务器之一,该服务器对应于 列表 1 中显示的部分。大多数较新的系统都使用加速服务器,但如果您的系统没有,请不要担心——其他服务器(svga、vga16 和 vga2)的部分类似,只是简单得多。
与 Device 和 Monitor 标签关联的字符串本质上是描述性的,并非至关重要。请注意 DefaultColorDepth 标签,该标签在安装后立即没有出现在我的 XF86Config 中。我添加它是为了将 X 的默认值设置为比通常的 8 位/像素更有趣的值,8 位/像素可能运行速度最快,但仅允许 256 种颜色。16 位/像素允许更多颜色(65536 种),而 24 位/像素允许每个红色、绿色和蓝色颜色分量具有 8 位(或更多位)的“真彩色”。
接下来是 Display 子部分。每个子部分都有不同的 Depth 标签,每个模式(位/像素)一个,服务器可以处理。
Modes 标签定义了显示器支持的物理屏幕分辨率。这些分辨率必须与 XF86Config 的 Monitor 部分中的 Modeline 条目相对应,否则将被忽略。第一个有效条目是 X 服务器初始化的默认分辨率。我经常参与开发项目,在这些项目中,我的目标是 640x480 的最低公分母,因此我将其用作我的默认值;但是,您可能希望从 800x600 或更高分辨率开始。如果要在服务器启动后切换分辨率,请按住键盘上的 alt 和 ctrl 键,然后按数字键盘上的 + 或 - 键以向前或向后循环浏览列表。
ViewPort 标签设置虚拟显示的左上角,并控制当 X 首次启动时,虚拟显示的哪个部分将显示在屏幕中心。这仅当您的虚拟区域大于您的物理分辨率时才有效。我更喜欢将其保留为 0 0,但尝试使用一些不同的非负值,看看会发生什么。您会注意到屏幕从正常位置水平和垂直移动了那么多像素。
最后,还有 Virtual 标签,用于设置虚拟屏幕区域的大小。在 16 位模式下,我可以使用 640x480 的物理分辨率,但我仍然能够在 1024x768 的更大虚拟区域内平移(使用鼠标)。虚拟屏幕区域受显卡上显存量的限制。例如,在 1024x768 像素和 16 位/像素(或每像素 2 字节)的情况下,总共使用了 1.5MB 的显存。某些显卡只有 1MB 的显存,将无法支持该配置。另请注意,X 服务器可能会将少量显存用于其他目的,因此您可能无法将所有显存用于位平面。
XF86Config 文件可以完成的事情远不止我在此处描述的这些。有关更多详细信息,请查看 XF86Config 手册页。
有几种不同的方法可以启动 X 服务器。许多新用户发现的第一种方法之一是 startx 命令,它实际上是 xinit 程序的 shell 脚本包装器。使用不带任何参数的 startx 应该足以启动 X 会话;但是,除非您已如上所述设置 DefaultColorDepth,否则您可能只会获得 8 位平面。如果您想要更好的颜色,则需要添加一些参数,如下所示
startx -- -bpp 16
这将以 16 位平面启动 X。前两个破折号导致 -bpp 16 作为参数传递给 X 服务器,而不是 xinit 程序。如果您厌倦了每次都输入整个命令,则可以在您的主目录中创建一个名为 .xserverrc 的文件,并将启动 X 服务器的命令放入其中,如下所示
exec X -bpp 16 :0有关详细信息,请参阅 xinit(1) 手册页。
当 X 启动时,它将切换到第一个可用的虚拟屏幕并将其用于显示。大多数 Linux 系统都将前六个虚拟屏幕分配为虚拟控制台,因此用户可以通过同时按下 alt 键和一个功能键 (f1-f6) 在它们之间切换。要从 X 显示器访问其中一个虚拟控制台,需要添加 ctrl 键,即使用 ctrl-alt-f1 从 X 转到第一个虚拟控制台。然后,要返回到 X 会话,请按 ctrl-alt-f7。如果您的系统没有启用六个虚拟控制台,则必须使用不同的功能键。
现在,如果我们有六个(或更多)虚拟控制台,为什么不拥有多个 X 会话呢?这是通过向 startx 提供更多信息来完成的。X 服务器需要知道要使用哪个虚拟屏幕以及如何命名显示器。
例如,要在虚拟屏幕 8 上启动 24 位显示,请键入
startx -- :1 -bpp 24 vt8
要在虚拟屏幕 9 上启动 8 位显示,请键入
startx -- :2 -bpp 8 vt9:1 和 :2 是 X 用于引用显示的名称。名称的完整格式为 host:N.M,其中 host 是系统的主机名,N 是该系统上显示的编号,M 是屏幕编号(在使用多个显示器的多头显示器中)。
指定 :0 只是本地系统上第一个显示器 localhost:0.0 的简写。名称 :1 和 :2 指的是第二个和第三个显示器。要在它们之间切换,只需使用 ctrl-alt-fn 组合键。
要了解这些是如何工作的,请如上所示启动 :1 和 :2 显示,并使用 ctrl-alt-f7 切换到您的第一个显示器 (:0)。然后从虚拟终端(例如,xterm、rxvt)运行命令
xeyes -display :1
xeyes 程序将运行(您不会获得另一个 shell 提示符),但它在屏幕上不可见。现在切换到第二个显示器 (ctrl-alt-f8),您将看到它。当 xeyes 退出时,您将在 :0 上的 shell 会话中获得另一个提示符。
许多 X 程序都支持 -display 选项来指定要使用的显示器。请注意,环境变量 DISPLAY 设置为默认显示器。如果您从每个显示器中的虚拟终端运行命令 echo $DISPLAY,您可以看到它在每个显示器上的设置方式都不同。
当 xinit 启动时,它会启动 X 服务器,然后在用户的主目录中查找名为 .xinitrc 的文件,这是一个 xinit 运行的 shell 脚本。该文件通常至少包含如下行
xterm & exec fvwm
它们启动 xterm 终端模拟器,然后它将 xinit 进程替换为 FVWM 窗口管理器。反过来,fvwm 查找其名为 ~/.fvwmrc 的启动文件。可以在 /etc/X11/fvwm 目录中找到该文件的默认值。请注意,xterm 进程在没有窗口管理器的情况下开始运行。窗口管理器不是 X 会话的必需部分,但您可能希望拥有一个。
使用 startx 很简单,但如果您经常使用 X,您可能希望直接登录到 X,而无需先登录到文本控制台的复杂性。直接登录到 X 由 XDM 处理。/etc/X11/xdm 中的文件用于定义配置,然后简单的命令 xdm 使用 xlogin 屏幕启动 X,以允许某人输入其用户名和密码。与 startx 类似,xdm 命令可以从命令提示符(以超级用户身份)输入。这对于测试很有用,但 xdm 实际上旨在在启动序列期间自动运行——稍后会详细介绍。键入 ls 以列出我的 /etc/X11/xdm 目录的输出
GiveConsole Xresources.0 Xsession.0 Xsetup_2 xdm-config.0 TakeConsole Xservers Xsetup_0 authdir Xaccess Xservers.0 Xsetup_0.0 chooser Xresources Xsession Xsetup_1 xdm-config
这些文件中的关键文件是 xdm-config,它是 xdm 的默认配置文件。xdm-config 文件定义了基本配置,包括在哪些文件中查找进一步的设置信息。xdm-config 的内容如 列表 2 所示。请注意,XDM 使用的其他文件的名称在此处定义,因此可以使用不同的文件名或将文件放在其他目录中。默认值可以正常工作,但请注意,在其他 UNIX 系统,甚至不同的 Linux 发行版上,文件可能位于不同的位置。在任何情况下,您都可以通过查看 xdm-config 文件来熟悉系统的配置。
xdm-config 中的信息是使用 X 资源指定的,这有点像在编程语言中设置数据结构字段的值。
文件的第一行设置 DisplayManager.errorLogFile,xdm 在其中写入其错误消息。如果 xdm 未正确启动,请查看错误文件。您可能会在那里找到一些有用的消息。在较旧的 Red Hat 系统和其他 UNIX 系统上,该文件位于 /etc/X11/xdm 中,但在较新版本(例如,Red Hat 5.1)中,它位于 /var/log/xdm-error.log 中。这符合 Linux 文件系统层次结构标准 (FSSTND)。
DisplayManager.pidFile (/var/run/xdm.pid) 是 xdm 将其进程 ID 写入的文件。如果您正在添加自定义项并且想要重新启动 X 以检查它们是否有效,这将非常方便。键入命令
kill -TERM `cat /var/run/xdm.pid`
以在重新启动 xdm 进程之前终止它。实际上,我更喜欢命令
killall -TERM xdm它执行相同的操作。一种变体是将 TERM(终止)信号替换为 HUP(挂起);这不会关闭任何正在运行的 X 会话,但会使用新配置重新启动 xdm(用于启动的任何新会话)。如果您正在从 X 会话中进行 X 管理,您可能希望使用该方法以避免 GUI 服务中的不连续性。
DisplayManager.servers (Xservers) 指向的文件供 xdm 用于启动 X 服务器进程。它包含告诉 xdm 如何启动每个 X 服务器进程的信息。例如,行
:0 local /usr/X11R6/bin/X -bpp 16 vt7 :0
在我的 Xservers 文件中,将使用提供的命令和参数在本地系统上启动显示器 :0。要启动多个显示器,只需以相同的格式向 Xservers 文件添加行。如果 Xservers 文件包含以下行
:0 local /usr/X11R6/bin/X -bpp 16 vt7 :0 :1 local /usr/X11R6/bin/X -bpp 24 vt8 :1 :2 local /usr/X11R6/bin/X -bpp 8 vt9 :2当 xdm 运行时,将启动三个显示器——虚拟终端 7 上的 16 位显示器、vt8 上的 24 位显示器和 vt9 上的 8 位显示器。-bpp 16 选项是多余的,因为我在我的 XF86Config 文件中将 DefaultColorDepth 定义为 16。
请注意 xdm-config 最后几行中的星号。这种机制称为“松散绑定”,它是一个通配符,用于匹配所有可能的字段名称。在本例中,字段名称是显示的名称。显示器 :0 称为 DisplayManager._0。(显示器 :0 为 _0,显示器 :1 为 _1,依此类推。)下划线代替冒号使用,因为在资源中,冒号是资源名称及其设置之间的分隔符。星号表示所有显示器都使用相同的文件,但是当显式指定显示器时(称为“紧密绑定”),该文件仅用于该显示器。当然,也可以仅使用紧密绑定并每次指定相同的文件,但是松散绑定方法更容易。
在 X 服务器启动并且 xlogin 程序运行之前,xdm 在 DisplayManager._0.setup 资源 (Xsetup_0) 定义的文件中查找。这是一个包含任意命令的 shell 脚本,因此它具有很大的通用性。我喜欢在 xlogin 窗口后面放置比默认黑白图案更令人愉悦的背景,因此我可能会使用如下命令
/usr/X11/bin/xsetroot -solid darkcyan
使背景(根窗口)成为纯色。为了使事情更有趣,以下行
/usr/X11/bin/xloadimage -onroot \ /usr/local/images/tiles/purpleblue2.gif使用我自己设计的图像平铺背景。在执行此操作之前,请确保您的系统上安装了 xloadimage 程序。
再次,关于安全性的警告。从 Xsetup._* 文件中运行的程序可能已禁用其键盘和鼠标输入,但如果它们在用户成功登录之前未退出,它们将继续以超级用户(root)权限运行。例如,如果行
/usr/X11/bin/rxvt &
在 Xsetup_0 文件中,在显示器 :0 上登录的用户将被授予超级用户 shell,这不是期望的条件。这是一个明显的例子,但其他例子可能不那么明显,因此请小心。
在圣诞节前后,将
/usr/X11/bin/xsnow &
放入 Xsetup 文件以使雪在计算机等待登录时出现,这似乎很可爱(且无害);但是,由于它将以 root 用户 ID 运行,因此用户在登录后将没有权限终止该进程。此外,许多人会在一段时间后厌倦看到雪花在他们的 X 会话的背景中飘落。幸运的是,有一种方法可以在用户的登录会话开始之前使 xsnow 进程退出。首先,添加一行,在启动 xsnow 的行之后立即保存其进程 ID,如下所示
/usr/X11/bin/xsnow & echo $! >/var/run/xlogin_xsnow.pid在用户通过 xlogin 身份验证之后,以及在他的 X 会话开始之前,xdm 运行在 DisplayManager._0.startup 资源 (GiveConsole) 中命名的 shell 脚本。这通常用于将 /dev/console 的所有权更改为用户,以便可以使用带有 -C 选项的 xterm 或 rxvt 或 xconsole 在 X 会话中显示定向到控制台的错误消息。但是,您可以将任何想要的内容添加到脚本中。例如,以下行强制 xsnow 退出
kill -9 `cat /var/run/xlogin_xsnow.pid` rm -f /var/run/xlogin_xsnow.pid现在,这是一个给您的练习。许多站点希望能够直接从 xlogin 屏幕关闭系统,而无需用户登录或使用 root 密码 su。使用您最喜欢的文本编辑器,创建一个名为 xlogin_buttons 的 Tcl/Tk 脚本,其中包含 列表 3 中显示的行,并使用命令使其可执行
chmod +x xlogin_buttons
现在,按照上面的 xsnow 示例修改您的 Xsetup_0 和 GiveButtons 脚本以使用 Tcl/Tk 脚本而不是 xsnow。我将脚本放在 /etc/X11/xdm 中,并将以下行放在我的 Xsetup_0 脚本中
/etc/X11/xdm/xlogin_buttons & echo $! >/var/run/xlogin_buttons_0.pid
并将以下两行放在我的 GiveConsole 脚本中
kill -9 `cat /var/run/xlogin_buttons_0.pid` rm -f /var/run/xlogin_buttons_0.pid确保检查 Xsetup_0 和 GiveConsole 文件是否在 xdm-config 文件中定义。
与 DisplayManager._0.startup 资源一起的是 DisplayManager._0.reset (TakeConsole),它在 X 会话结束后以及 xdm 在下次登录之前重置 X 服务器之前调用。通常,这只是将 /dev/console 的所有权更改回 root,但您也可以在那里添加自定义项。
xlogin 程序通过接受用户名和密码来识别和授权用户。这些是在 xlogin 窗口中的提示符处输入的。如果您想更改 xlogin 显示,请查看 DisplayManager*resources 指向的文件,在我的系统上,该文件名为 /etc/X11/xdm/Xresources。该文件包含 xlogin 和 xdm 在用户的 X 会话开始之前启动的其他程序的资源定义。我不想让 xlogin 显示我的系统的主机名,而是更喜欢显示蓝色的消息“欢迎使用 Linux”。为此,我定义了 xlogin*greeting 和 xlogin*greetColor 资源,如 列表 4 所示。
安全顾问可能会看到一个配置为对任何碰巧路过的用户说“欢迎”并在他们猜错用户名/密码组合时说“再试一次”的系统而畏缩。我只在我的家庭系统上这样做。如果您在学术或公司环境中工作,您可能希望使用类似
xlogin*greeting: CLIENTHOST xlogin*fail: Authorized Users ONLY!
在上面的示例中,大多数颜色都以 RGB 三元组的形式指定,格式为 #rrggbb。您可以为每种原色使用 1 到 4 个十六进制数字,因此要指定一种非完全明亮的红色,#c00、#c00000 和 #c00000000000 都是等效的。您可以使用颜色名称,如 white(等效于 #ffffff)或 black(等效于 #000),如上面的示例所示。要获取 X 知道的颜色名称列表,请使用 showrgb 命令。这两种方法自 X 系统首次公开发布以来就已可用,并且在某种程度上受到限制。
在 X11 的第 5 版中,添加了新方法。旧方法的主要问题之一是,以 3 位数字格式指定的颜色(每种原色仅提供 4 位)可能在具有 8 位颜色深度的显示器上工作良好,但在 16 位或 24 位显示器上看起来不正确。例如,#fff 在 8 位显示器上将显示为亮白色,但在具有 16 位或 24 位/像素的显示器上将显示为灰白色 (#f0f0f0)。您可以通过始终使用至少 6 位数字的颜色规范或使用新的 Xcms RGB 方法来解决此问题,就像我上面所做的那样,
RGB:f/f/f
对于超过 8 位/像素的显示器,它会自动扩展为 #ffffff。与原始方法一样,每种颜色指定 1 到 4 个十六进制数字。但是使用新方法,您可以为每个颜色使用不同数量的数字。这些数字不是被视为绝对数字,而是用作比例因子。例如,单个数字 9 表示 9/15,而 09 表示 9/255。
如果您不喜欢使用十六进制数字,则可以使用 RGBi(RGB 强度)格式,如下所示
RGBi:1.0/1.0/1.0
这也将产生亮白色。红色、绿色和蓝色的值指定为介于 0.0 和 1.0 之间的浮点数,包括 0.0 和 1.0。还有其他更复杂的颜色空间,如 TekHVC(色调、值、色度)和几种 CIE 格式。
到现在为止,您应该对如何配置 xdm 有了很好的了解,因此我想在介绍如何自动启动 xdm 之前,先处理一些遗留问题。
您可能想要查看的一个文件是 xdm-config 中 DisplayManager*session 资源命名的文件。此文件 (Xsession) 是另一个脚本。它由 xdm 运行以创建用户的 X 会话。通常,它将用户主目录中的文件 .xsession-errors 定义为 X 程序(客户端-服务器架构的“客户端”)的错误日志文件。.xsession-errors 文件被截断以避免与上一个会话中发生的错误混淆,然后标准输出和标准错误输出都重定向到它。除了您的 xdm 错误文件之外,.xsession-errors 文件也是在您的 X 会话未正确启动时检查线索的好地方。
接下来,执行用户主目录中的文件 .xsession。从用户的角度来看,xdm 使用 .xsession 文件的方式与 startx 使用 .xinitrc 的方式相同。但是,存在一些差异。首先,.xinitrc 必须是 shell 脚本,但 .xsession 可以是任何可执行程序(并且必须设置其执行位)。这允许更大的灵活性,尽管 .xsession 通常是一个 shell 脚本,它与 .xinitrc 非常相似(并且可能相同)。可以使一个成为另一个的符号链接,以简化管理并确保 startx 和 xdm 都创建相同的工作环境。
其次,当 X 会话由 xdm 启动时,用户尚未启动登录 shell,并且 shell 的启动脚本(例如,.bash_profile 和 .bashrc)尚未运行。因此,有必要在 .xsession 中设置那些环境变量(例如 PATH),这些环境变量必须可用于从 .xsession 运行的任何程序或从该脚本启动的任何窗口管理器或其他程序。
我只是简要描述了 /etc/xdm/Xsession 脚本的默认行为。通常,它保持不变,并且基于用户的自定义通过用户主目录中的 .xsession 程序完成。但是,也可以通过修改 Xsession 来创建系统范围的自定义项。
在您已从 root 的命令行使用 xdm 成功启动 X 会话后,下一步是在系统初始化期间自动运行 xdm。这可以通过几种不同的方式完成。我将介绍三种方式——正常方式、奇怪的方式和怪异的方式。查看您的 /etc/inittab 文件。您应该找到以下两行
id:3:initdefault: x:5:respawn:/usr/bin/X11/xdm -nodaemon
第一行设置系统启动时的默认运行级别为 3 (完整多用户模式,带网络功能),第二行告诉 init 进程在系统运行级别为 5 时运行 xdm。在某些 Linux 系统(如 Slackware)上,运行级别 5 可能为 4。
使系统自动运行 xdm 的通常方法是更改第一行为:
id:5:initdefault:
这将使系统启动到运行级别 5 而不是运行级别 3。在第二行,“respawn” 告诉 init,如果 xdm 退出,则立即重启它。启动脚本将从 /etc/rc.d/rc5.d 而不是 /etc/rc.d/rc3.d 运行。这意味着如果您已经将运行级别 3 的守护进程配置为您想要的方式,您将不得不为运行级别 5 再次执行此操作。
如果这看起来太麻烦,请使用另一种方法,更改第二行而不是第一行,像这样:
x:3:respawn:/usr/bin/X11/xdm -nodaemon
这将在运行级别 3 而不是运行级别 5 中启动 xdm 进程,从而保留您的运行级别设置。
最后,还有一种奇怪的方法,像启动任何其他守护进程一样启动 xdm,并完全忽略 /etc/inittab 文件。在 /etc/rc.d/init.d 目录中添加一个如下所示的脚本:
#!/bin/sh # /etc/rc.d/init.d/X.init - Start X Window System echo "Starting X Window Services: xdm" /usr/X11/bin/xdm
然后,在 /etc/rc.d/rc3.d 目录中放置指向该脚本的符号链接。当系统启动时,init 会按照 ls 命令显示的字母数字顺序运行这些脚本。在我的系统上,我放入了一个名为 S97X 的链接,它使 X 在几乎所有其他内容之后启动。查看 rc3.d 目录中的其他文件 (使用 ls -l) 并效仿它们的示例。这种方法可能很方便,因为它不会在每次 xdm 退出时都重启 xdm,有时这可能是期望的行为。使用 inittab 执行相同操作的更简单方法是输入以下行:
x:3:once:/usr/bin/X11/xdm -nodaemon这里需要注意一点。/etc/inittab 文件是系统上最关键的文件之一。如果您搞砸了 inittab 文件,您的系统可能无法启动,所以也许那种奇怪的方法毕竟没有那么糟糕。
好了,这就是全部内容。我尽力将一本关于 X Window 系统管理的书压缩成一篇杂志文章。我已经介绍了管理 X 的大部分基础知识,但也遗漏了很多内容。如果您想了解更多信息,请查看“资源”侧边栏中列出的权威文档来源。
Jay Ts 自 UNIX 元年(X 之前六年)以来一直在使用 UNIX,现在为 Linux 提供咨询服务。可以通过 jayts@bigfoot.com 联系他;他的网页是 http://www.kachina.net/~jay/。