第20章 全部放在一起 -- xdm
现在我们已涵盖了你需要用到X的所有个别的项目,你知道如何启动系统,
如何设定一个视窗管理器的执行,如何执行应用程式,如何从不同的角度定制
系统,最後,如何退出系统。
本章中,我们把这些分开的部份放在一起,且描述一个完整的档案设定,
用来定制涵盖所有的□例功能系统机器环境。在本章我们将看到我们所要介绍
给你的最後一个X的工具:显示管理器(display manager) -- xdm,它提供一
个精巧和清楚的方法在你的机器上启动X。
20.1 我们需要做些什麽 当我们启动之後,我们需要安排萤幕,让一些我们在整个执行期间中都会
使用的应用程式适得其所,让一些偶然用到的则以表徵图为开始时的表示方式。
我们需要执行视窗管理器,对某些种类的功能做一些设定。详细来说,我们需
要下列的程式: .一个xterm 的主控台,在萤幕左上角。 .uwm 在背景下执行。 .一个我们的(正常)编辑器的全萤幕xterm 视窗,以表徵图启始。 .在右上角一个(较一般为小)的时钟。 .xbiff 在时钟之下。 .一个计算器在右下角。 .一个用到我们所有最小的字型的表徵图化的xterm ,它的高度为screen高。 .在xbiff 之下,排列我们使用远方机器的频率图。 除了程式之外的项目: .设定背景视窗为亮灰色。 .启动键盘滴答(key-click) 的功能。 .从我们常用的网路主机存取到我们的server。 .载入我们对所有client用到的server设定的resource,在16章我们定义
的$HOME/.Xresources 档案中,根视窗RESOURCE_MANAGER性质之上。 .启动一个screen saver。 并且我们需要uwm 有选单让我们能够: .容易地存取在网路上其它的主机。 .变更一些键盘和滑鼠的设定,且设定背景视窗的颜色。 .启动那些我们偶而会用到的应用程式。 .启动一些被选定的示□程式。 对这些我们自己的设定,在我们网路上其它的使用者需要不同的初始设定,
所以我们需要安排每一个使用者依他们自己的喜好设定,理想上,使用者应能
自行设定而毋需藉系统管理者的帮助,下一节我们来看程式xdm 如何能帮助我
们达成这些目的。
20.2 xdm -- X显示管理器(X Display Manager)的概观 xdm 管理一或多个显示器,xdm 可在同一机器或远方的机器上执行。它可
以做到所有xinit 能做到的,而且更多。它所隐含的概念为它应控制当你在X
工作时的完整周期 (session),意即从你进入直到结束视窗系统的周期。(用
xinit ,有效周期为当你执行xinit 开始,到你结束(logout)最初的xterm
视窗和关闭server。) xdm 较这更进一步:你可以用它执行一个不确定的周期。当一个结束,下
一个便准备开始。实际上,如果你有需要,它让你不变地指定一个显示器。 xdm 完全取代xinit 。从现在起你可忘掉xinit ,而且不再需要使用它,
我们在最初使用xinit 的原因为它较易观察和了解系统的运作。 xdm 是一个非常灵活的程式,你几乎可用它建构任何你所需要的,在进一
步深入之前,让我们观察一个□例周期的预设行为,然後我们来看一看你如
何改进当一个使用者进入X系统所看到的初始介面。
20.2.1 一个用xdm 的□例周期 我们将使用xdm 来设定在我们机器上执行的X。你的机器已经启动,但尚
未有视窗系统在其上执行。用下列的命令启始xdm xdm xdm 开始执行,你几乎立刻又看到你的shell 提示。然後萤幕背景变更为
通常灰色形式,且你看到一个大的X游标,所以你知道server已经启始。 接下来是一长段修止状态 -- 大约接续15秒或更久 -- 而後突然间一个带
著欢迎标题的视窗出现了,要求你的登录名称(login name)和密码(password),
如图20-1(这是xdm 的authentication widget )。输入你的使用者名称和密
码,又过了一会儿,你可以看到一个xterm 视窗在左上角出现,就如同图5-3
一般,从现在起,你工作的方式和以前相同 -- 启动你的视窗管理器,执行应
用程式等等。 ┌——————————————————————┐
│ FIG 20.1 P.251 │
│ │
│ 图20-1 xdm 的 authentication widget │
└——————————————————————┘
当你需要结束时,你也可用像以前相同的方式结束:logout最初始的xterm
视窗。但这里xdm 和xinit 有不相同的地方,代之关掉server的是,回到非X
的环境,萤幕回到最初始灰色的背景,过一下子之後,你又再度看到X的登录
视窗。事实上,xdm 是执行一个循环的周期。 注意:就像许多的Unix程式,最大的登录名称长度为8 个字元 -- 如果超
过这个长度,login 将会失败。(如果你的实际login 程式允许你使用较长的
名称,这种限制也许让你感到奇怪。) 关闭xdm 有时你可能需要完全地关闭X。为了做到这点,你需要关闭xdm 。 在MIT 版中的server,会依循如果收到Unix讯号SIGTERM ,便会执行中止
程序。xdm 利用到这点:如果你送给它一个SIGTERM ,它将中止所有它所控制
的server後离开。这就是你中止系统的方法。 欲实际地中止xdm ,可以在一个xterm 视窗(在你的机器上)用ps来找出
xdm 的process-id,而後用kill送给它SIGTERM (你将看到数个xdm 处理的执
行:那个最年轻的便是你要的,也就是说,最低的process-id)。例如,在我
们的机器上执行中止的动作: venus% ps ax 1 grep xdm
1997 ? IW 0:00 xdm
1998 ? IW 0:00 xdm
2000 ? IW 0:00 xdm
2078 p0 S 0:00 grep xdm
venus% kill -TERM 1997 你所有的应用程式将被强迫中止,server也随之关闭。 注意:当相关於X的每一件事都结束後,你的萤幕可能只显示通常X背景
的灰色形式,没有任何的shell 提示或任何事。不要被愚弄了:你的shell 已
准备好接受你的命令 -- 按下RETURN键你将会看到。(因为在你以交谈式下
xdm 命令之後,shell 已将提示号送出,所以不再重覆 -- 除非你按下RETURN)。
20.3 有关xdm 的更多 我们在前所述为xdm 的预设模式的操作,所以看起来并没有比xinit 提供
得更多,如果你使用一个正常的工作站或显示器,一些外貌将不是很有趣。无
论如何,X终端机(x-terminal)是一个日渐增加的大众化设备,而xdm 可大量
地简化管理类似的系统。X终端机通常没有它自己的档案系统,且不能支援一
般目的的程式,必需在网路的某处执行包含视窗管理器和显示管理器的控制终
端机软体,xdm 正是符合此需要的软体。 xdm 在下列这些场合较xinit 为优: .它可控制数个server,也暗示说,其中有一些为远方的server,也许是
在X终端机或相当小的工作站上。 .它提供密码来存取系统,同样地,在X终端机上非常有用(但在一个你
已经login 的工作站会有一点困扰。) .它提供无限期的X的周期。你可以建构显示器经常性地以X操作,所以
使用者毋需担心如何启始系统。 .它具有高度的建构性,系统管理者可以设定依机器特性的启始和结束程
序,掌握这些项目以供记帐(accounting),授权(authorization) ,档
案系统等之用,且能让每一个个别的使用者全□围性地修定他们所需的
自己的环境。 .从使用者的观点,它提供一个乾净而简单的方法来启动系统。 所以大体上,xdm 主要是一个系统管理工具,但它也提供让一个普通使用
者定制他所希望的一致和一贯地系统架构。 xdm 的指南页包含了大量的有关如何使用系统的教学资讯和指引,在此我
们不再重覆,我们将在以下的章节说明如何正确地建构xdm 以提供在本章一开
头所描述的环境。 xdm 真的非常有弹性,且你可以用许多不同的方式选择设定,我们将使用
最简单的处理,并试著大致和指南页的描述保持一致,偶而我们在一些档
案中使用不同的名称,用以强调此名称并非硬性的规定。 在我们工作的周期中,请对我们事实上在扮演两个不同的角色保持概念:
第一是系统管理者,对於使用系统的任何人来设定xdm ,第二是一般的使用者
,为我们自己的需求设定xdm 。
20.3.1 系统管理者对xdm 的建构 预设xdm 先查看档案 /usr/lib/X11/xdm/xdm-config 如果它存在,会把它当成多设定几个其它参数的resource档案。我们将使用它,
因为它可简化我们的工作。 指南页会列出所有你能藉xdm-config档案设定的参数,但我们较有兴趣的有: .包含一个server的目录的档案名称。 .当任何错误发生时,xdm 用来记录的档案名称。 .包含和启始系统有关的档案系统名称。 .当server启动後执行程式的名称,这个程式定义了你的”周期” -- 当
这个程式中止时,xdm 视其意义为你的周期已结束,且回到它login 时
的顺序,预设这个程式为xterm ,就和使用xinit 一样,你的周期持续
直到你logout你初始的xterm 。 这是我们已在系统上定义的设定: DisplayManager.severs: /usr/lib/X11/xdm/our-server
DisplayManager.errorLogFile: /usr/lib/X11/xdm/errors
DisplayManager*resources: /usr/lib/X11/xdm/our-resources
DisplayManager*session: /usr/lib/X11/xdm/our-session (我们已选择保持所有xdm 相关的档案在目录/usr/lib/X11/xdm,这只是代表
名称,你可以用任何你喜欢的目录。) 所以你可以看到我们使用xdm-config,实际上是一个两步骤的处理方法,
首先我们定义在xdm-config中的一些档案名称,接著我们来设定方才命名的档
案。现在我们来看一下我们在xdm-config中定义的每一个resource。 xdm 的server的名单 这个被DisplayManager.servers设定的档案的resources 包含了一个xdm
能管理的server的名单。每一列中包含了server的名称(也就是显示器),
server的型态(type),和型态有关的项目。 型态指出了显示器是本地的或远方的。和是否为无限或单一的周期(详见
xdm 指南页)。我们将使用型态localTransient -- 单一周期在本地显示器上
-- 因为以此方式,如果发生任何错误,我们不致於陷入无穷回圈中。稍後,
当我们每件事都设定好且执行无误的话,我们会将型态改为本地而循环的周期。 对本地的显示器而言,和型态相关的讯息是在此显示器上执行的server程
式的名称及其任何所需的引数。对远方的显示器,此讯息可被忽略,但你仍需
输入一个假的(dummy) 程式名称。 所以,在我们所建立的档案/usr/lib/xdm/our-servers包含这一行: :0 localTransient /usr/bin/X11/X :0 (如果我们喜欢执行循环周期,此档案便不再需要 -- 预设设定会做到我们所
需要的 -- 所以我们在建构档中不需定义DisplayManagers.servers resource。) xdm 的错误登录档案 此档案从xdm 和xdm 的周期程式接收所有错误的讯息,且如果你的xdm 设
定工作发生问题的话,这是第一个需要查看的地方。 当你开始设定你的系统,对此档案设定任何人均可写入,否则,有问题的
程式可能因没有写入许可而无法在档案中记录。 启始时的resource档案 此档案包含一个resource的名单,在Authentication Widget 启始之前被
xrdb载入。因此,你能用它来为那些widget设定resource。(你当然也能放置
任何其它的resource规格,但通常周期程式的使用者设定载入时会凌驾其上,
所以通常不把其它的规格放在这里。) authentication widget resource的预设设定在某些情况是很细的,但为
了举例,我们只设定和bunner不同的标题,我们建立我们的档案 /usr/bin/X11/xdm/our-resources 包含一行: xlogin.Login.greeting:X-Window on the Plants network xdm 的"Session(周期)"程式 你可以指定任何程式为你周期中所需的程式,可是当周期结束,你通常选
择一个程式让你能启始其它的程式,你能依赖xdm 的预设设定执行xterm ,但
这种方式每当xterm 执行时你仍必需手动所有你的设定。我们需要定义我们的
周期程式来做所有我们的设定,且保持活动(active)的状态直到我们结束它为
止,但记住,我们希望使用者如果需要能定义他们自己的周期程式,所以我们
将使用两阶段的处理,如果是系统管理者,我们将设定一个一般性目的,基础
的,周期程式来召换一个使用者自己的程式(如果它存在),但其它方面将执
行一个合理预设。当个别的使用者,我们将定义我们自己的设定周期,它将被
xdm 的一般目的程式执行(我们在另外一节讨论它)。 我们的基本的site-wide 周期程式非常简单,如果使用者有设定档案
$HOME/.Xsession 的常规我们便使用之,否则,我们将执行合理的预设 -- 启
动uwm 而後传递控制到一个xterm(xterm为我们指定在萤幕左上方的那一个)
。但在做之前,我们先检查是否使用者设定了档案$HOME/.Xresources(其它的
常规),如果有的话,我们用xrdb载入它。一个完整的程式名单如图20-2。 ┌——————————————————————┐
│ FIG 20.2 P.257 │
│ │
│ 图20-2 程式/usr/lib/X11/xdm/our-session │
└——————————————————————┘ 20.3.2 我们自己对於xdm 的建构 现在我们改变角色:我们不再是系统管理者,而是一个使用者。我们可以
依赖系统管理者已定义之预设周期,但我们比较喜欢定义自己的周期,所以我
们要获取那些说明我们所需的起始设定。 我们的实例.Xsession 我们已建立我们自己的$HOME/.Xsession,如图20-3,且此萤幕初始的建构
在它执行之後会如图20-4。此程式的操作十分直接,但当你自行设定时有一些
要点需要注意,且当你建立site-wide 周期程式也是一样。我们假设你的周期
程式是一个shell :虽非必定,但通常都是(除非你要写一个xetrm 的复杂的
代替品)。 ┌——————————————————————┐
│ FIG 20.3 P.258 │
│ │
│ 图20-3 $HOME/.Xsession 程式 │
└——————————————————————┘ ┌——————————————————————┐
│ FIG 20.4 P.259 │
│ │
│ 图20-4 我们初始化後的萤幕 │
└——————————————————————┘ .档案中的命令依序排列,所以最後一行所执行的是一个程式,它可以持
续整个你的周期。(因为,当此程式结束,则周期程式结束,且每一件
事也均将结束)。 .除了在背景中最後的命令所有的命令均被执行,也就是说,在命令列最
後加一个ampersand(&) 号。如果你不这样做,此周期将从不获取过去
的任何不确定地执行的程式。例如:在我们的实例程式,如果我们在uwm
那一行省略"&" 号,uwm 会启动,但在uwm 结束时,它的下一行将不会
继续执行,绝不! .最後的命令必为exec的命令,所以它继续执行且保持你的周期继续活动。
(如果你像其它命令一样在背景中执行它,它会好好的执行,但此周期
程式执行至档案结束将会中断,而结束周期。如果你不用exec,且省略
"&" 号,则它会执行且此周期将完美地持续工作,你只是较你所需的多
执行了一个处理,就如同你仍有最後的程式(last program)和周期程式
本身。) .对所有的程式建立视窗时设定geometry规格 -- 否则当它们启动时你将
以”手动”方式指定它们的位置。 .在档案中最後一行的程式通常用来启动xterm ,因为它定义了你周期的
生命期,在你执行X时此视窗总是存在,所以你通常设定两个特别的选
项: 1 .使用-C选项使得xterm 为一个”主控台”,所以系统讯息会在它的
视窗显示。 2 .设定-ls 选项使它的shell 为login shell 。如此使得shell 读入
你的.login或.profile,所以你的环境变数会适当地设定。(如果
你不这样做,你只有一点儿定义:DISPLAY,HOME,USER,PATH和SHELL.) 3 .此周期程式档案必需有执行许可。使用上述site-wide 周期程式,
这对使用者周期script不是绝对需要,它实际是对s