星期四, 二月 01, 2007

FC6启动过程分析——启动图形界面

上次我们说到,inittab启动到最后,使用/etc/X11/prefdm这个脚本来选择一个DM(Display Manager)来启动图形界面.这个脚本根据/etc/sysconfig/desktop中的配置来选择是该运行gdm,kdm还是xdm,默认将会使用gdm。

无论是gdm,xdm还是kdm,所做的事情都是类似的,及启动一个X窗口,基于这个X窗口提供一个图形化的用户登录界面,以便在实际进入X窗口系统之前,对用户进行验证,并且提供用户选择自己希望的语言,窗口管理器等的机会。除此之外,dm程序一般还支持别的一些操作,比如提供直接关机的选项以及根据配置决定是否打开XDMCP服务的端口等。

XDMCP服务是X窗口显示管理器控制协议的缩写,它允许用户在远程电脑上运行X窗口服务,然后通过XDMCP协议使用本地的XDM登录,登录以后的后续操作将使用远程的X窗口作为显示系统。一个很简单的例子,首先使用gdmsetup程序(管理菜单的登录屏幕)打开XDMCP的支持(远程选项卡更改为与本地相同),然后打开一个终端窗口,运行Xnest :1 -query 127.0.0.1命令(Xnest并不是默认安装的命令),你将在一个新开的窗口中看到和你的登录屏幕一模一样的登录屏幕,你可以登录其它用户,进行所有和本地用户一样的操作。显然如果你是在另外一台电脑上,只需要把相应的ip地址改掉就可以了。

并不一定非要使用Xnest程序,你甚至可以在远程的Win32系统上进行基于XDMCP的远程登录,这首先需要你在你的windows系统上运行一个X 窗口系统,有很多种类似的实现,包括X-win32和cygwin在内的各种免费和收费版本都是一个不错的选择,事实上,一台强劲的服务器可以通过这种方法可以将N台落魄的486PC转变成可以运行高级科学运算的X终端。

说到远程X终端,除了上面提到的方法,你还可以使用内置于gnome之中的vino程序,这个程序可以基于本地的X窗口打开一个兼容于vnc的服务,你可以使用各种类型的vncviewer来连接这个服务并进行远程操作(参见首选项菜单中的远程桌面),这种实现方式下,远程显示的屏幕和本地屏幕是完全相同的。或者你也可以使用单独的vncserver,这种使用方式和XDMCP的使用方法类似,只是登录的用户和使用的窗口管理器都是由vncserver指定好的。

gdm的配置定义在/etc/gdm/custom.conf中,对于其预定义配置的默认值你还可以查询/usr/share/gdm/defaults.conf文件,它们都采用了类似windows下ini文件的文件格式。

在用户选择了语言和窗口管理器以后,DM根据用户的选择设置相应的locale变量,然后运行和那个窗口管理器对应的命令。通常在语言选择菜单中,我们只能看到区域的选择,比如中国大陆,中国香港这样的选项,但是中国大陆的选项可以使用GBK的编码方式,也可以使用UTF8的编码方式,选择的区域是怎样和编码方式对应的呢?所有gdm相关的配置文件保存在/etc/gdm这个目录中,在这个目录中有一个 locale.alias文件,这个文件列出了系统支持的语言以及各个语言对应的编码方式,你可以通过更改这个文件,以便在选择中国大陆的语言时,将编码由默认的UTF8更改为GBK,当然,适应UTF8的编码方式也是一个不错的选择,如果你不需要经常的和windows环境打交道,你应该保留这个默认的设置。

除了选择语言以外,gdm还允许你选择要登录的会话. 系统内建的几个会话包括安全模式终端,安全模式gnome以及上一次的成功登录等,其它的会话则是从配置文件中读取的,gdm将会在多个目录中寻找设定的会话,包括/etc/X11/sessions/,/usr/share/gdm/BuiltInSessions/, /usr/share/xsessions/等,路径可以通过daemon/SessionDesktopDir配置项进行更改,gdm在这些目录中寻找扩展名为desktop的文件,比如默认会话对应的文件是 /usr/share/gdm/BuiltInSessions/default.desktop,而gnome会话对应的文件为 /usr/share/xsessions/gnome.desktop.这些配置文件定义了在不同的语言中这个会话要显示的名称。

当用户选择了一个对话,输入了正确的用户名和密码以后,gdm执行命令的顺序依次是,首先它将执行位于daemon/PreSessionScriptDir 配置项路径下(默认为/etc/gdm/PreSession/)的所有脚本文件,来执行启动会话前的一些任务,比如更改X窗口的默认背景之类,然后它将调用位于daemon/PostLoginScriptDir配置的目录中(默认为/etc/gdm/PostLogin)的脚本,执行一些在刚刚登录以后需要运行的命令,然后它将以前面提到的desktop文件中定义的exec参数的值作为参数,调用daemon/BaseXsession配置项指定的脚本(默认为 /etc/gdm/Xsession),比如如果你选择的是默认会话,那么执行的命令将会是/etc/gdm/Xsession default,如果你查看这个文件你将发现,在这种情况下,它将首先检查是否存在主目录的.xsession文件,如果存在就执行它,否则检查是否存在主目录下的.Xclients文件,如果存在则执行它,否则就将执行/etc/X11/xinit/Xclients文件,这个文件根据 /etc/sysconfig/desktop配置文件中的设置选择相应的命令执行,默认为执行gnome-session.

而配置在 daemon/PostSessionScriptDir配置项(默认值为/etc/gdm/PostSession/)所设定的目录中的脚本将在会话结束以后运行,这意味着无论出于什么原因,gnome程序已经完全退出了,也许是你选择了注销命令,也许是X窗口崩溃了,如果你有这方面的需要,可以将相应的脚本放在对应的目录中。

最后还有一点要说的是,gdm通常是由/etc/X11/prefdm脚本启动的,这个脚本中将会重复启动自己,因此,如果你想在运行级别5的时候完全退出X窗口,你应该将prefdm这个程序杀死,而不是简单的杀死X窗口或者是gdm。