星期四, 二月 01, 2007

FC6启动过程分析——从run level 到 log in

根据inittab的指示,在启动完rc.sysinit之后,init程序将进入相应的运行级别,并运行这个级别的脚本。 默认的运行级别也是在inittab中指定的,一般设置为3或者5,两者的区别在于是否默认进入图形模式(启动XWindow)。

启动脚本是通过/etc/rc.d/rc这个程序运行的,它做的事情也不算很复杂,首先它将根据你是否在前面的rc.sysinit的时候摁下"I"键来决定是交互启动模式还是非交互启动模式并且进行相应的输出,然后,依次运行位于相应启动级别目录(/etc/rc.d/rc启动级别.d/)中的脚本,运行的次序是,首先按照名称顺序运行那些K打头的脚本,然后按照名称顺序运行那些S打头的脚本。如果是交互启动模式,它将在运行每个S打头的脚本之前,询问你是否运行这个脚本。

由于脚本运行的顺序是按照字母顺序,你就可以理解为什么在每个脚本之前要被加上一个两位的数字,这只是为了在排列脚本执行顺序的时候显的更直观,另外,所有的启动脚本文件都存在在/etc/rc.d/init.d目录中,位于不同启动级别下的脚本是指向 /etc/rc.d/init.d目录中相应脚本的符号链接。启动脚本符号链接中的数字是怎么来的呢,它是由你指定的,如果你要增加自己的启动脚本到相应的启动级别中去,这个数字当然应该由你指定,因为只有你才知道这个脚本应该以什么样的优先级启动。但是对于那些已经存在的启动脚本,作为FC6发行的一部分,它们的优先级是在脚本中最前面的注释行中的chkconfig这一行指定的,在这一行中,你可以看到类似# chkconfig: 35 99 95的字样,它的含义是:这个脚本应该增加到运行级别3和运行级别5中,启动的优先级是99,关闭的优先级是95,当然,这些数字是由那些FC6的开发者测试过没有问题,所以才写在这里的。一个二进制的程序/sbin/chkconfig将会读取这一行,并且在将服务增加到启动级别中去的时候自动生成文件名。

文件名中的第一个字符S和K代表了什么含义呢?它代表了你在services控制面中选择了打开这个服务还是关闭这个服务,如果你在那里打开了这个服务,则以S作为前导符,否则为K,结合我们前面介绍的启动过程,你就可以知道,在启动的时候,FC6会首先保证那些K打头的脚本是关闭的(通过以stop参数调用这个脚本),然后才会逐个启动那些S打头的脚本(通过以start参数调用这个脚本)。

对于每个启动脚本文件,如果想知道启动了时候都做了些什么,可以查看相应脚本中的start()函数,比如对于avahi-dnsconfd这个脚本,我们可以看到,它只是运行了/usr/sbin/avahi-dnsconfd -D这个命令。

除了位于系统控制面板中对各个services的简单描述以外,你还可以在 http://www.mjmwired.net/resources/mjm-services-fc5.html 找到对各个Fedora Core服务功能的描述以便决定是启动还是关闭某个服务。

在所有需要启动的服务都启动完毕以后,rc程序通过rhgb-client程序通知rhgb图形界面退出,rhgb的使命就完成了。

接下来,init程序在tty1-tty6启动mingetty程序,从现在开始,你可以通过Ctrl-Alt+F1..F6在各个不同的tty之间进行切换了。

然后,如果当前启动级别为5,init程序通过调用/etc/X11/prefdm程序,启动一个图形界面的登录屏幕,让用户登录。这个程序将会读取位于 /etc/sysconfig/desktop中的配置文件,如果没有指定任何配置文件,prefdm运行的顺序依次为gdm,kdm和xdm.

后面的启动部分就属于Gnome,Kde或者其它相应的窗口管理器了。