X Window系统:架构、管理与配置全解析
1. X Window系统架构概述
在Xlib之上构建了X Toolkit Instrinsics(Xt),它通过对名为widgets的对象提供支持来简化图形用户界面。Widgets是常见GUI元素(如滚动条、菜单等)的基本原型,以及实现完整窗口所需的其他辅助对象。在Xt之上,还分层了额外的GUI库,它们与窗口管理器一起提供了完整的GUI支持。
常见的三种GUI由Athena widgets、OSF/Motif和OPEN LOOK规范提供,每种规范都包含相应的窗口管理器。幸运的是,一套约定提供了不同基于X的GUI客户端和窗口管理器之间的互操作性。
X客户端和X服务器通过它们都理解的X协议相互通信。这种通信可以是本地的(X客户端和X服务器在同一台机器上),也可以是通过网络进行远程通信。X协议涉及通信双方都熟知的GUI对象,它通过使用指向适当GUI元素的短消息,而不是传输所需图形表示的大量描述,在保证客户端和服务器之间快速通信的同时,还保持了充分的灵活性。在最坏的情况下,如果所需的图形表示不在GUI对象范围内,可能会传输完整的图形图像,但这种情况很少发生。当然,这种通信方式要求X客户端和X服务器双方都支持X协议。
使用X窗口系统有很多好处,它可以在网络内实现资源的灵活分配,将应用程序的执行和与该应用程序的交互分离,并可以任意定位,从而优化可用资源的有效利用。多个用户可以同时访问多个应用程序,在处理和显示资源之间实现最佳平衡。在分布式计算机环境中,X更接近让整个网络看起来像“一个等效的强大处理(计算机)系统”的梦想。
2. X管理哲学
X的基本构建哲学是“提供机制,而非策略”。从未来发展和改进的角度来看,这是一个不错的方法,但从管理角度看,这使得维护更加困难。由于缺乏严格的规则和标准,供应商可以自由创建自己的规则,而X管理员则缺乏明确的指导。
X有很多不同的版本,如X Consortium维护的“标准”X11发行版,以及各种从MIT X11派生而来,但针对供应商操作系统和专有外观进行配置的版本。例如,运行在Sun平台上的Open Windows、运行在DEC平台上的DECWindows、运行在IBM AIX平台上的AIXWindows、运行在HP - UX平台上的VUE(Visual User Environment)等。Common Desktop Environment(CDE)似乎是将通用X平台作为标准的一次成功尝试,它已被大多数供应商接受,并与特定于供应商的X软件包结合使用。
这意味着X在不同的UNIX平台上可能表现不同,管理员可能会发现系统的反应与预期不同。由于X Consortium只提供机制,依赖供应商决定如何使用它,导致在实现过程中存在一些漏洞和差距。管理员在使用之前必须了解其“底层”隐藏的内容,这是X管理中最困难的问题之一。尽管X有相对丰富的文档(这里指的是在线文档 - 手册页),但找到正确的主题有时可能是一项艰巨的任务。
不过,X的设计是为了满足用户的需求,管理员有责任确定用户的需求并相应地配置X。X可以安装在各种环境中,从学术界、工业界到只有一台独立机器的家庭办公室。因此,X中的几乎所有内容都可以在多个级别进行配置,X显示管理器可以在多个不同的地方进行配置,以满足几乎任何需求。甚至X的源代码也可供那些想要创建自己解决方案的人使用,基本思想是如果你不喜欢某些功能的工作方式,就进行更改。
3. 窗口管理器
窗口管理器在所有X程序中扮演着特殊的角色。管理窗口的一些相对简单的任务,如打开、移动、调整大小、关闭、弹出和下拉菜单,创造了一个强大的工作空间,从根本上改变了人机界面。如今,窗口环境(不一定是X窗口)几乎是每个用户的常见工作环境。
最初的MIT窗口管理器是twm(Tab Window Manager),它是MIT X发行版中唯一提供的窗口管理器。此外,供应商还分发了许多其他窗口管理器。其中最受欢迎的窗口管理器之一是mwm(Motif Window Manager),它实现了OSF/Motif的外观和感觉(OSF代表开放系统基金会),OSF/Motif还包括一个完整的图形用户界面。另一个受欢迎的窗口管理器是olwm(OPEN LOOK的窗口管理器)。其他窗口管理器还包括:swm(Solbourne Window Manager),它可以在不同模式下模拟olwm和mwm;gwm(公共领域窗口管理器),可以模拟mwm;以及tvwm和olvwm,它们分别是twm和olwm的版本,但支持虚拟根窗口(根窗口比显示器上可见部分大,可以滚动以显示不同部分)。如今,CDE桌面窗口管理器(dtwm)可能是最有吸引力的,它基于OSF/Motif mwm 1.2.4版本。
虽然不同窗口管理器的管理方式或多或少相似,但可能存在一些差异,建议参考相应供应商的文档。这里主要讨论mwm、dtwm,偶尔也会涉及twm,大多数示例与mwm/dtwm相关。
窗口管理器通常在X会话启动时通过用户的启动脚本调用,但也可以像其他UNIX程序一样从命令行启动。例如:
# dtwm &
这将在后台调用CDE DT窗口管理器。
窗口管理器为每个窗口提供自己的边框和标题栏。例如,在Solaris 2.6平台上启动的dtterm窗口(dtterm是基于CDE的终端仿真客户端程序),通过将光标(指针)移动到窗口标题栏并按住鼠标左键,可以移动窗口;通过按下标题栏右上角的小图标,可以调整窗口大小或将其图标化;还可以使用下拉菜单来处理窗口、选择选项等。
不同的X版本有不同的基于X的终端仿真器,它们在功能上相似,但在外观和有时在功能上有明显的改进。例如,在SunOS 4.1.3平台上启动的较旧版本的基于X的终端xterm。
窗口管理器的行为可以通过编辑其配置文件进行多种方式的配置,其中一种方式是管理单个用户目录中的配置文件(对于mwm,本地配置文件是.mwmrc;对于tdwm是.dtwmrc文件;对于twm是.twmrc等)。窗口管理器在系统级别的默认行为可以通过system.mwmrc文件(对于mwm)进行配置,相应地,对于dtwm是system.dtwmrc,对于twm是system.twmrc。
以下是常见窗口管理器及其配置文件的列表:
| 窗口管理器 | 本地配置文件 | 系统级配置文件 |
| — | — | — |
| mwm | .mwmrc | system.mwmrc |
| dtwm | .dtwmrc | system.dtwmrc |
| twm | .twmrc | system.twmrc |
4. X显示管理器
第一个真正的X显示管理器(xdm)已经使用了很长时间,在此期间经历了几次重大变化,最后一次是引入了CDE登录服务管理器(dtlogin),实际上它已经取代了xdm。虽然xdm和dtlogin在概念上有很多相似之处,但它们是两个不同的程序,用于提供相同的基本任务。理解其中一个实际上意味着也理解另一个。这里将它们统称为“xdm/dtlog”,请注意,这两个程序的目的相同,不会同时运行。
xdm/dtlogin作为守护进程在主机上运行,它为用户提供了一种登录并启动初始客户端的方式,无论他们使用的是哪种X服务器,这是最常见的方式。还有另一种控制X会话的方式,许多站点的用户可以通过常规的登录会话登录,然后通过发出xinit命令启动X服务器和任何客户端。然而,xinit已被X Consortium视为过时,所有必要的功能都已集成到xdm(后来被dtlogin继承)中。
xdm/dtlogin也是通过网络访问X终端的重要工具,两个程序都包括系统范围的配置功能,可实现所需的默认设置。
4.1 xdm/dtlogin概念
xdm/dtlogin程序是一个X客户端程序或一组客户端程序,负责用户会话的连接、控制和协调的起点和终点。对于网络连接的X服务器,xdm/dtlogin的功能类似于连接ASCII终端的init、getty和login程序。
xdm/dtlogin管理一组X显示器,包括本地和远程显示器。X终端的出现促使对该系统的几个部分(包括xdm程序)进行了重新设计,同时开发了X Consortium标准XDMCP(X显示管理器控制协议),它旨在提供运行“会话”所需的服务(类似于字符终端上提供的服务),提示用户输入登录名/密码并进行身份验证。
一般来说,用户登录后,通常会启动一个X终端仿真程序(如xterm、dtterm等)并启动用户的shell。实际上,这与基于字符的终端环境类似,只是基于X的会话在图形上更出色,也更用户友好。不过,X终端仿真器不是必需的,也可以启动任何基于X的应用程序,这时X11的真正优势就显现出来了:具有无限的图形展示可能性。这样的应用程序可以从网络中的任何主机启动,不一定是用户登录的主机。考虑到强大的UNIX远程命令执行功能,这是一项常规任务,在许多实际应用中都得到了验证。整个网络看起来就像一个强大的多主机系统,功能在可用资源之间得到了优化分配,但从用户的角度来看,它完全集成到了一个单一的系统中。
在高处理密集型网络中,有大量用户的情况下,X窗口系统起着重要作用。用户登录到专用的“登录服务器”,从专用的应用服务器启动应用程序,访问大型数据库服务器,并通过X服务器(即低成本的X终端)与应用程序进行交互。总体效果是,用户感觉一切都在他们面前发生——“如此小的X终端竟然能如此高效地处理如此困难的工作,真是太神奇了!”
xdm/dtlogin会跟踪哪些X服务器被允许连接,并协商和建立这种连接(当然,这是逻辑连接)。重置X服务器后,xdm/dtlogin会启动Xsetup脚本,帮助设置用户看到的X服务器屏幕,它会向X服务器显示器发送图形登录小部件(登录框)。为了简化,假设一个带有单个显示器的X服务器,即一个X终端(X终端运行X服务器程序,并且非常了解X协议),这就是图形登录小部件出现在X终端屏幕上的方式和原因。
用户登录(即输入姓名和密码)后,会使用与登录程序相同的机制进行身份验证。然后xdm/dtlogin会运行一系列shell脚本,两个程序的简化执行流程图分别如下:
graph TD;
A[用户登录] --> B[xdm启动Xstartup脚本(以root身份)];
B --> C[启动Xsession脚本(以用户身份)];
C --> D[启动所需的X客户端];
D --> E[用户会话进行];
E --> F[用户注销或会话终止];
F --> G[xdm运行Xreset脚本];
G --> H[重置X服务器,显示登录小部件];
graph TD;
A[用户登录] --> B[dtlogin启动相关脚本];
B --> C[启动所需的X客户端];
C --> D[用户会话进行];
D --> E[用户注销或会话终止];
E --> F[dtlogin进行相应清理和重置];
F --> G[显示登录小部件];
xdm首先以root身份调用Xstartup脚本,然后以用户身份调用Xsession脚本。启动脚本通常会启动所有所需的X客户端,包括一个或多个终端仿真器,每个终端仿真器都将包含一个交互式shell。执行的脚本会调用其他脚本来完成所有必要的初始任务。
当会话终止时,xdm会重置X服务器,并(可选)重新启动整个过程。更准确地说,当用户注销(或X会话的“控制”进程终止)时,xdm会运行Xreset脚本以关闭所有连接、清理并将X终端重置为准备登录状态,再次显示登录小部件,为另一个用户会话做好准备。dtlogin管理X会话的方式非常相似,其现有差异将在后面与其他dtlogin配置问题一起讨论。
xdm/dtlog是一个非常强大的程序,它可以通过多种方式进行配置,控制多个X服务器上的登录、创建自定义X会话、提供一些基本的网络安全功能等。
4.2 xdm/dtlogin启动选项
xdm/dtlogin可以通过多种方式启动,它们有许多相同的选项。从命令行启动程序的格式如下:
xdm [options]
或
dtlogin [options]
其中可能的选项如下表所示:
| 选项 | 描述 |
| — | — |
| -config configuration_file | 指定一个资源文件,该文件指定其余的配置参数,它将替换默认配置文件:对于xdm是/usr/lib/X11/xdm/xdm - config;对于dtlogin是/usr/dt/config/Xconfig |
| -daemon | 将daemonMode资源的值指定为“true”,这会使xdm/dtlogin关闭所有文件描述符,脱离控制终端,并在首次启动时将自身置于后台,这是默认行为 |
| -debug debug_level | 指定debugLevel资源的数值,非零值会使xdm/dtlogin向终端打印大量调试语句,同时禁用“daemonMode”资源,强制xdm/dtlogin同步运行(要解释这些调试消息,几乎必须有程序的源代码副本,因为很难使用) |
| -error error_log_file | 指定“errorLogFile”资源的值,该文件包含xdm/dtlogin的错误以及会话过程中各种脚本和程序写入“stderr”的任何内容 |
| -nodaemon | 将daemonMode资源的值指定为“false” |
| -resources resource_file | 指定“resources”资源的值,该文件用于加载身份验证小部件的配置参数 |
| -server server_entry | 指定“servers”资源的值 |
| -udpPort port_number | 指定“requestPort”资源的值,设置要监视XDMCP请求的端口号,XDMCP使用注册的知名UDP端口177 |
| -session session_program | 指定“session”资源的值,指示用户登录后作为会话运行的程序 |
| -xrm resource_specification | 允许指定任意资源,就像大多数工具包应用程序一样(仅适用于xdm) |
xdm/dtlogin旨在在各种环境中运行,确定其“典型用法”可能并不准确。不过,这里主要关注为一个相当“典型”的环境配置xdm/dtlogin。首先,需要设置xdm/dtlogin配置文件。对于xdm,主配置文件名为xdm - config,它包含对所有其他文件的引用,最好将所有这些文件放在同一目录中,通常是/usr/lib/X11/xdm,该目录将包含所有相关文件。对于dtlogin,主配置文件名为Xconfig,也包含对所有其他文件的引用,其默认位置是/usr/dt/config目录,但也可以位于其他位置。
xdm是在X11R3中引入的,在活动X会话期间X终端关闭再打开时存在一个严重问题。这个问题在X11R4中通过引入XDM控制协议(XDMCP)得到了解决,XDMCP将静态X11配置的概念转变为动态配置,其中X服务器和xdm在会话期间协商连接并交换状态消息。dtlogin只知道动态配置的概念。
xdm/dtlogin可以随时从命令行执行,但它主要作为守护进程在客户端主机上运行。xdm/dtlogin的启动已成为rc初始化脚本文件的常规部分,并在系统启动时作为守护进程激活。虽然xdm和dtlogin的概念和描述相似,但它们的配置略有不同,包括配置文件的名称、位置和内容。后续将分别讨论如何配置这两个程序。
4.3 xdm配置文件
xdm通过一组可编辑的ASCII文件进行配置,这些文件通常位于/usr/lib/X11/xdm目录和用户的主目录中。以下是一些重要的配置文件及其作用:
| 配置文件 | 作用 |
| — | — |
| xdm - config | 主配置文件,指定xdm的所有配置文件 |
| Xservers | 列出由xdm显式管理的X服务器,通常也需要列出本地显示服务器 |
| Xaccess | 配置XDMCP的访问控制,根据使用的查询类型指定不同的行为(后面会结合安全问题进行讨论) |
| Xresources | 由xdm管理的服务器通过xrdb(直接将资源加载到X服务器的客户端)加载的资源 |
| GiveConsole | 一个shell脚本,用于将控制台的所有权更改为用户 |
| TakeConsole | 一个shell脚本,用于将控制台的所有权更改回root |
| Xsetup_0 | 一个shell脚本,用于特定于本地控制台服务器的显示设置 |
| Xsession | 每个单独X会话使用的初始启动脚本,该脚本本身会调用用户主目录中的其他单独的“点”脚本文件:.xsession和.Xresources |
| Xsetup | 一个shell脚本,用于协助设置用户看到的登录屏幕以及xlogin小部件 |
| Xstartup | 用户登录后执行的shell脚本 |
| Xreset | 会话结束时执行的shell脚本,用于清理和重置X服务器 |
在用户的主目录中,以下文件在xdm的默认配置中使用:
| 文件 | 作用 |
| — | — |
| $HOME/.xsession | 由系统范围的Xsession脚本执行的用户特定启动脚本 |
| $HOME/.Xresources | 如果$HOME/.xsession不存在,则由系统范围的Xsession脚本读取的用户特定资源(否则,$HOME/.xsession脚本负责加载它们) |
此外,还有一些其他的文件:
| 文件 | 作用 |
| — | — |
| $HOME/.xsession - errors | 报告特定于用户X会话的错误,请勿编辑 |
| $HOME/.Xauthority | 用户服务器的机器可读授权代码,请勿编辑 |
并非所有配置文件都必须使用和存在,现有配置文件在xdm - config文件中指定。
例如,在运行xdm的Xhost上,一个旧但可行的xdm - config文件示例如下:
DisplayManager.servers: /usr/lib/X11/xdm/Xservers
DisplayManager.errorLogFile: /usr/ lib/X11/xdm/xdm - errors
DisplayManager.pidFile: /usr/lib/X11/xdm/xdm - pid
DisplayManager*resources: /usr/lib/X11/xdm/Xresources
DisplayManager*session: /usr/lib/X11/xdm/Xsession
DisplayManager._0.authorize: true
DisplayManager*authorize: false
所有列出的文件都位于/usr/lib/X11/xdm目录中,这是推荐的做法,但不是必需的。另一个示例是在SunOS 4.1.3上:
# ls /usr/lib/X11/xdm
Xresources Xservers Xsession xdm - config xdm - errors xdm - pid
还有一个在Silicon Graphics, Inc., IRIX 4.x上的示例:
$ls /usr/lib/X11/xdm
Xlogin Xservers Xstartup xdm - errors Xreset
Xsession Xstartup - remote xdm - pid Xresources Xsession - remote
xdm - config
额外的文件用于支持远程会话的启动,以及登录和重置会话的方式,xdm - errors是xdm的错误日志文件,xdm - pid包含xdm进程ID。
4.4 定制xdm
要定制xdm,首先需要理解基本的配置文件。
4.4.1 xdm - config文件
xdm - config是xdm客户端程序的主配置文件,它指定了所有重要的配置数据,即所有其他重要文件。其语法遵循标准的资源规范语法,文件中的每个资源条目都以关键字DisplayManager开头。具体来说,资源规范遵循以下三种形式之一:
-
DisplayManager.variable: value
:这种资源仅在应用于xdm本身时才有意义,例如,
DisplayManager.servers: /path/filename
指定了用于列出由xdm管理的X服务器的文件。
-
DisplayManager.DISPLAY.variable: value
:这种资源仅适用于由DISPLAY指定的单个显示服务器,例如,
DisplayManager._0.authorize: true
启用了本地服务器的访问控制。
-
DisplayManager*variable: value
:这是前一种形式的通用化,通过使用星号代替显示名称(也省略了点),指定了所有未特别定义的服务器。例如,
DisplayManager*authorize: false
和
DisplayManager._0.authorize: true
表示只有本地服务器将使用访问控制。
以下是一个在IRIX平台上的xdm - config文件示例:
#== === === === === === === === === === === === ===
DisplayManager.servers: /usr/lib/X11/xdm/Xservers
DisplayManager.errorLogFile: /usr/lib/X11/xdm/xdm - errors
DisplayManager.pidFile: /usr/lib/X11/xdm/xdm - pid
#== === === === === === === === === === === === ===
DisplayManager*resources: /usr/lib/X11/xdm/Xresources
DisplayManager*reset: /usr/lib/X11/xdm/Xreset
DisplayManager*authorize: off
DisplayManager*startup: /usr/lib/X11/xdm/Xstartup - remote
DisplayManager*session: /usr/lib/X11/xdm/Xsession - remote
#== === === === === === === === === === === === ===
DisplayManager._0.startup: /usr/lib/X11/xdm/Xstartup
DisplayManager._1.startup: /usr/lib/X11/xdm/Xstartup
DisplayManager._0.session: /usr/lib/X11/xdm/Xsession
DisplayManager._1.session: /usr/lib/X11/xdm/Xsession
#== === === === === === === === === === === === ===
DisplayManager._0.openTimeout: 90
DisplayManager._0.startAttempts: 1
DisplayManager._0.authFile: /usr/lib/X11/xdm/xdm - auth
DisplayManager._0.loginProgram: /usr/lib/X11/xdm/Xlogin
#== === === === === === === === === === === === ===
在这个示例中,可以看到所有的条目格式,包括启动远程X会话的一般方式。大多数条目都是自解释的(如需更详细的解释,始终可以参考手册页)。这里简要讨论一些条目:
- 前三个条目指向定义X服务器(即X服务器程序)的文件、日志文件和xdm PID文件。
- 带有星号的条目列表标识了我们已经熟悉的其他配置文件和数据。
-
DisplayManager._0.startup: /usr/lib/X11/xdm/Xstartup
和
DisplayManager._0.session: /usr/lib/X11/xdm/Xsession
指定了身份验证过程成功后(以root身份)执行的程序。通常使用的脚本名为Xstartup(默认情况下没有启动程序),而启动X会话(以用户身份)执行的脚本通常名为Xsession(默认情况下,假设使用X终端仿真器/usr/bin/X11/xterm)。这两个条目都引用了第一个本地X服务器(#0)。不过,这里预见到了两个本地服务器,#0和#1,另外两个条目引用了本地X服务器#1。其他X服务器被认为是远程的,由前面带有星号的条目标识。
- 其余条目也引用了本地X服务器#0,指定了额外的配置数据,例如,
DisplayManager._0.authFile: /usr/lib/X11/xdm/xdm - auth
和
DisplayManager._0.loginProgram: /usr/lib/X11/xdm/Xlogin
指定了用于身份验证的文件和相应的登录程序。
- 其他条目指定了控制xdm在尝试打开X服务器时的行为的数值资源,包括超时时间和尝试过程应重复的次数。
需要注意可能出现的资源条目
DisplayManager.autoRescan: false
,它会禁用xdm自行重新读取配置文件的功能。默认情况下,此条目为“true”,xdm配置为在会话终止且文件更改后重新读取配置文件。如果在修改配置文件后存在此条目,则必须重新启动xdm。
4.4.2 Xservers文件
Xservers文件是在X11R3中设计的,用于静态定义X11配置,它列出了所有由xdm管理的X服务器。这意味着每个X服务器都必须在文件中有一个相应的条目,xdm在启动时会读取该文件并了解所有现有的X服务器。自从引入XDMCP后,X服务器(X终端)负责向主机查询xdm连接,xdm连接在符合条件的X服务器和xdm之间可以协商(符合条件的X服务器在另一个配置文件Xaccess中定义)。因此,以前所需的数据不再需要。不过,Xservers文件并未过时,它仍然用于在通常不支持XDMCP的本地控制台显示器上启动X会话,以及用于不了解XDMCP的旧版预X11R4远程X服务器(如今,这种X服务器很少见)。
例如:
# cat /usr/lib/X11/xdm/Xservers
:0 local /usr/bin/X11/X
这个唯一的条目告诉xdm,控制台显示名称:0在本地机器上,并且应该使用
/usr/lib/X11/X
命令来启动相应的X服务器,该命令在xdm启动时执行。通常,
/usr/lib/X11/X
是实际服务器程序的符号链接(服务器程序依赖于机器,例如,在Sun平台上可能是“Xsun”)。以下是Solaris 2.6上的一个示例,其中X服务器程序位于另一个目录
/usr/openwin/bin
中:
$ ls -l /usr/openwin/bin | grep "^X"
lrwxrwxrwx 1 root root 6 May 28 1998 X -> ./Xsun
-rwxr - sr - x 1 root root 903512 Jul 7 1997 Xsun
对于运行在其他不兼容XDMCP的机器上的X服务器,条目格式如下:
xthostname:0 foreign Old Pre - X11R4 XTerminal
其中,“xthostname:0”指定了X服务器运行的机器和显示器,“foreign”将X服务器标识为远程(非本地)服务器,其他字段被忽略,即视为注释。
一个合理的问题是:“在X会话期间,X客户端应用程序如何知道如何在许多符合条件的X服务器中寻址合适的X服务器?” 这里,X11依赖于UNIX环境变量DISPLAY。与变量TERM标识基于字符的终端类似,DISPLAY变量标识被调用的X客户端的X服务器。如果此变量未定义(或定义错误),启动的X客户端将显示错误消息:“Can’t open display”。另一种标识X服务器(并间接定义DISPLAY变量)的方法是使用“-display”选项启动X客户端程序并指定X服务器。
X服务器由以下格式标识:
Hostname:DisplayNumber.ScreenNumber
其中:
-
Hostname
:表示提供X服务的机器的名称(也可以是IP地址),后面跟着冒号“:”。
-
DisplayNumber
:以数字方式标识在服务器机器上运行的相应显示服务器(可能有多个显示器),后面跟着点“.”。
-
ScreenNumber
:以数字方式标识指定显示器的屏幕(显示器可能有多个屏幕)。
在现实生活中,最常见的X服务器是X终端,只有一个运行的显示服务器和一个屏幕。因此,最常见的X服务器标识是:hostname:0.0。后面还会再次讨论这个问题。
4.4.3 Xresources文件
Xresources文件在每个单独的X服务器连接到xdm时加载到该服务器中。通过这种方式,X服务器了解客户端的资源需求,并准备好提供适当的X服务。Xresources文件的最重要功能是为用户实际登录之前运行的客户端或小部件设置资源。至少,需要加载xlogin小部件(xlogin框),因为它在用户登录之前就会运行(如果对登录框的外观不满意,可以在这里进行修改)。Xresources文件中指定的资源由服务器通过另一个客户端xrdb客户端加载。
以下是一个示例:
# cat /usr/lib/X11/xdm/Xresources
xlogin*login.translations: #override\
<Key>F1: set - session - argument(failsafe) finish - field()\n\
<Key>Return: set - session - argument() finish - field()
xlogin*greeting: CLIENTHOST
xlogin*borderWidth: 3
#ifdef COLOR
xlogin*greetColor: #f63
xlogin*failColor: red
xlogin*Foreground:black
xlogin*Background: #fdc
#else
xlogin*Foreground: black
xlogin*Background: white
#endif
以字符串xlogin开头的资源(实际上这里包含的所有资源)由xlogin框使用。xlogin将该框发送到显示器,提示用户输入姓名和密码。该框还会显示实际的客户端主机名(这里指定为“CLIENTHOST”),可以用任何任意的问候消息字符串替换。通过编辑资源:
xlogin*greeting: "Welcome to CLIENTHOST"
问候消息将比以前的主机名更友好。
Xresources文件的语法与其他配置文件略有不同,原因是xrdb会通过C预处理器(默认是cpp)运行资源文件,这提供了额外的灵活性,因为可以使用适当的cpp命令(如#ifdef、#else和#endif);(井号字符“#”为此目的保留,不能用于注释行)。对于注释,感叹号“!”用作注释行的开头字符。
在上述示例中,xlogin的第一个条目(资源)是一个翻译表,用于定义客户端内特殊按键的使用方式(注意,该条目包含多行,每行以反斜杠“\”结尾,表示资源规范继续)。这个条目将F1键定义为“故障安全键”,按下F1键将启动所谓的故障安全X会话。
X Window系统:架构、管理与配置全解析(续)
5. dtlogin相关配置及与xdm的对比
dtlogin在很大程度上继承了xdm的功能,但也有其自身的特点和配置方式。
5.1 dtlogin配置文件
dtlogin的主配置文件是Xconfig,它同样包含对其他相关文件的引用。与xdm不同的是,其默认位置在 /usr/dt/config 目录,但也可以位于其他位置。
虽然dtlogin和xdm在管理X会话的基本流程上相似,但在配置文件的细节上存在差异。dtlogin更侧重于动态配置,这是因为它诞生于XDMCP引入之后,从设计上就采用了动态配置的概念。
5.2 dtlogin与xdm配置对比
| 对比项 | xdm | dtlogin |
|---|---|---|
| 主配置文件 | xdm - config | Xconfig |
| 配置理念 | 早期版本存在静态配置问题,后通过XDMCP改进 | 从设计上采用动态配置 |
| 默认配置文件位置 | /usr/lib/X11/xdm | /usr/dt/config |
6. X窗口系统的安全与访问控制
X窗口系统的安全和访问控制是管理中的重要方面,主要通过相关配置文件来实现。
6.1 Xaccess文件
Xaccess文件用于配置XDMCP的访问控制,它根据不同的查询类型指定不同的行为。例如,它可以限制某些主机或用户对X服务器的访问,从而提高系统的安全性。
在配置Xaccess文件时,需要考虑以下几个方面:
-
查询类型
:不同的查询类型可能需要不同的访问策略,如远程查询和本地查询。
-
主机和用户限制
:可以指定允许或禁止访问的主机和用户列表。
以下是一个简单的Xaccess文件示例:
# 允许所有本地主机访问
LOCAL: ALLOW
# 允许特定远程主机访问
REMOTE: hostname1, hostname2 ALLOW
# 禁止其他所有远程主机访问
REMOTE: * DENY
6.2 认证机制
X窗口系统使用与登录程序相同的机制对用户进行认证,确保只有合法用户可以访问系统。认证过程通常涉及用户名和密码的验证,以及可能的其他安全措施,如密钥认证。
在配置认证机制时,需要注意以下几点:
-
密码安全
:确保用户密码的复杂性和定期更新。
-
密钥管理
:如果使用密钥认证,需要妥善管理密钥的生成、分发和存储。
7. X窗口系统的性能优化
为了提高X窗口系统的性能,可以从多个方面进行优化。
7.1 资源分配优化
X窗口系统允许在网络内灵活分配资源,将应用程序的执行和交互分离。可以根据不同的需求和资源状况,合理分配处理和显示资源。
例如,对于高处理需求的应用程序,可以将其运行在处理能力较强的服务器上,而将显示任务分配给低成本的X终端。这样可以充分利用网络中的资源,提高整体性能。
7.2 减少图形传输
X协议通过使用指向适当GUI元素的短消息,而不是传输大量的图形描述,来减少图形传输量。在实际应用中,可以尽量避免传输完整的图形图像,只有在必要时才进行传输。
此外,还可以通过优化GUI元素的设计,减少不必要的图形更新,从而进一步提高性能。
7.3 缓存机制
可以在X服务器和客户端之间建立缓存机制,缓存常用的GUI元素和图形数据。这样,在需要使用这些数据时,可以直接从缓存中获取,减少了数据传输和处理的时间。
8. 常见问题及解决方法
在使用X窗口系统的过程中,可能会遇到一些常见问题,以下是一些常见问题及解决方法。
8.1 无法打开显示
如果启动X客户端程序时出现“Can’t open display”错误,可能是由于DISPLAY环境变量未定义或定义错误。
解决方法:
- 检查DISPLAY变量是否正确设置,可以使用以下命令查看和设置:
# 查看DISPLAY变量
echo $DISPLAY
# 设置DISPLAY变量
export DISPLAY=hostname:0.0
- 如果使用“-display”选项启动X客户端程序,确保指定的X服务器正确。
8.2 窗口管理器配置问题
如果窗口管理器的行为不符合预期,可能是配置文件出现问题。
解决方法:
- 检查相应的配置文件,如.mwmrc、.dtwmrc或.twmrc等,确保配置项正确。
- 可以尝试恢复默认配置,然后逐步调整配置项,找出问题所在。
8.3 登录问题
如果在登录过程中遇到问题,如无法登录或认证失败,可能是认证机制或配置文件出现问题。
解决方法:
- 检查认证配置文件,如Xaccess、xdm - auth等,确保配置正确。
- 检查用户密码是否正确,尝试重置密码。
9. 总结
X窗口系统是一个功能强大且灵活的图形用户界面系统,它在分布式计算机环境中具有重要的作用。通过了解其架构、管理哲学、窗口管理器、显示管理器等方面的知识,可以更好地配置和使用X窗口系统。
在管理X窗口系统时,需要注意以下几点:
- 理解“提供机制,而非策略”的哲学,根据用户需求进行灵活配置。
- 注意不同版本和平台的差异,参考相应的文档进行管理。
- 重视安全和访问控制,通过合理配置相关文件确保系统安全。
- 优化系统性能,通过资源分配、减少图形传输和使用缓存机制等方法提高效率。
同时,在遇到问题时,要根据具体情况进行分析和解决,通过检查配置文件、环境变量等方式找出问题的根源。通过不断学习和实践,可以更好地主控X窗口系统,为用户提供稳定、高效的图形用户界面体验。
通过以上对X窗口系统的全面解析,希望能帮助读者深入了解X窗口系统的各个方面,并在实际应用中能够熟练运用和管理。
超级会员免费看

被折叠的 条评论
为什么被折叠?



