2014年5月24日星期六

Linux_052:RHEL系统启动过程

环境: RHEL 6.5

RHEL完整的系统启动过程如下图:

本文只从init进程说起,前面的启动过程以后另文专述。

因为init是第一个运行程序,所以它的PID永远是1,可以用top命令查看。

init进程启动后,会读取/etc/inittab文件,并根据其内容按照顺序创建进程,文件内容如下:
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

系统一共有7个运行级别,从0~6,在注释部分对这7个运行级别做了描述。
0 - 关机(请不要切换到此等级)
1 - 单用户模式的文字界面
2 - 多用户模式的文字界面,不具有网络档案系统(NFS)功能
3 - 多用户模式的文字界面,具有网络档案系统(NFS)功能
4 - 未使用
5 - X11
6 - 重新启动(请不要切换到此等级)

这个文件的最后一行:id:5:initdefault:,告诉我们系统的当前运行级别是5。

init程序具体执行过程是这样的:
(1)系统开始初始化,执行脚本:/etc/init/rcS.conf,该脚本会再执行脚本:/etc/rc.d/rc.sysinit。
(2)接着会根据系统的运行级别来运行对应目录里的脚本,以启动相关服务。比如,这里的运行级别是5,init就根据这个级别号运行/etc/rc.d/rc5.d目录里的脚本。
在/etc/rc.d/目录下,有3个普通文件(rc、rc.local、rc.sysinit)和8个目录文件(init.d,rc0.d,rc1.d,rc2.d,rc3.d,rc4.d,rc5.d,rc6.d)。
其中,init.d目录中存放了各种程序和脚本,而rc0.d~rc6.d这7个目录里的文件都是init.d目录里程序文件的链接文件,只是被赋于了相应的运行级别。
(3)以 rc5.d目录中的脚本为例,目录中的所有文件都是以K或S开头(S即start,开启服务;K即kill,关闭服务),然后跟一个数字,然后是文件名。
系统运行级别N确定以后,进入相应的rcN.d目录,执行以S开头的文件以启用相关服务进程,而且是按照S后面的那个数字的顺序依次执行;退出系统时,就依次执行以K开头的文件关闭相关服务。
在rc5.d目录中看以看到,K60nfs表示nfs服务默认是关闭的,关闭顺序是60;S11portreserve表示portreserve服务是开启的,开启顺序是11。
需要说明的是,对于每个运行等级,每个服务只能有一个启动脚本或者停止脚本。
当切换运行等级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。
(4)运行级别是2、3、5的时候,执行完对应的rcN.d目录中的脚本后,最后都会执行rc.local。
也就是说,rc.local是初始化的最后一个执行脚本。
如果你想增加自己要执行的脚本,可以加在rc.local中。

那么,某个服务默认定义在哪个运行级别?默认开启和关闭的顺序是怎样的?
答案就在每个服务的脚本自身之中。
前面说过,rc0.d~rc6.d这7个目录里的文件都是init.d目录里程序文件的链接文件,所以去看一下init.d目录下这些脚本吧。
(1)以nfs服务为例:cat /etc/init.d/nfs,可以看到:# chkconfig: - 30 60。
这表示nfs服务不在任何运行级别上启用(服务不在任何运行级别上启用时,运行级别那个字段用-),启用顺序为第30,关闭顺序为第60。
(2)以portreserve服务为例:cat /etc/init.d/portreserve,可以看到:# chkconfig: 2345 11 89
这表示portreserve服务在运行级别2、3、4、5上启用,启用顺序为第1,关闭顺序为第89。

参考文献:
1. http://share.blog.51cto.com/278008/244106
2. http://blog.csdn.net/wjx515628/article/details/10001623
3. http://www.jb51.net/article/3567.htm

没有评论: