Linux运行等级的切换
时间:2006-01-05 来源:wwwlinux
在初始化rc脚本注释中,我们介绍了系统起动和运行等级切换时
,系统大概要做哪些工作,现在我们来具体分析一下,默认等级为3,机器从开机到初始化完成具体做了哪些工作。
一、系统刚开机的启动分析
首先,我们知道不管是哪种原因进入init进程,必然会按以下命令si::sysinit:/etc/rc.d/init.d/rc
sysinit生成一个初始化进程,现在刚开机,这个子进程自然也会得到运行。在以sysinit为参数调用rc脚本,后将执行以下操作:
1、载入/etc/sysconfig/rc中的变量和functions中的函数,设置终端显示参数和信号处理方式;
2、由于刚开机,前一个运行级别被设为N;
3、previous=N,所以等级切换部分跳过,也就是找以K开头的那部分不做(事实上rcsysinit.d中也不存在以K开头的服务)
4、找出rcsysinit.d中所有以S开头的服务,具体为:
/etc/rc.d/rcsysinit.d/S00mountkernfs
/etc/rc.d/rcsysinit.d/S05modules
/etc/rc.d/rcsysinit.d/S10udev
/etc/rc.d/rcsysinit.d/S20swap
/etc/rc.d/rcsysinit.d/S30checkfs
/etc/rc.d/rcsysinit.d/S40mountfs
/etc/rc.d/rcsysinit.d/S50cleanfs
/etc/rc.d/rcsysinit.d/S60setclock
/etc/rc.d/rcsysinit.d/S70console
/etc/rc.d/rcsysinit.d/S80localnet
5、由于previous=N,刚开机且runlevel=sysinit,所以以上的服务被依此启动
6、以上服务启动完成后,该子进程结束。
关于以上服务的具体代码注释将在单独的文件中给出。
由于默认的运行等级3,所以系统在rc sysinit子进程结束后,将启动13:3:wait:/etc/rc.d/init.d/rc
3,即以参数3,运行脚本rc,分析一下过程:
1、初始同上;
2、刚开机,不执第一个循环判,即查找以K开头的服务
3、在查找以S开头的服务时,只有以下两个服务存在
/etc/rc.d/rc3.d/S10sysklogd
/etc/rc.d/rc3.d/S20network
4、由于previous=N,刚开机且runlevel=sysinit,以上两项服务被启动;
5、以上服务启动完成后,该子进程结束。
二、等级切换的情况
现在我们假设,如果我们切换运行等级,那系统会做些什么呢(要切换运行等级,只要以带参数形式运行init进程即可,例如init
1,表示切换至我zai 当前运行级别为3,我们使用init 1,切换至到单用户模式,这时init进程运行过程如下:
首先,以参数sysinit运行rc脚本,通过简单的分析我们可知,由于其中的服务都已经启动,所以不会有任何服务启动或停止(有点问题,我再想一下)。
其次,以参数1运行脚本rc,其执行过程也很简单,由于previous!=N 所以找出/etc/rc1.d目录下以K开头服务,有以下两项:
/etc/rc.d/rc1.d/K80network
/etc/rc.d/rc1.d/K90sysklogd
同时,发现该服务在/etc/rc3.d中(也就是已经被开启),所以以参数stop运行该项服务,也就是要停止服务。同时下一个循环中,判断/etc/rc1.d是否存在以S开头的服务,需要启动。如果有则启动,否则子进程结束。
三、关机和重启动分析
有了以上的基础,就很容易知道关机和重新启动的过程了。
首先,在rc sysinit中关闭以K开头,而且已经启动的服务,只有:
/etc/rc.d/rc0.d/K90sysklogd
其次,在rc 0(rc 6)中以stop为参数运所有以S开头的服务,通常有以下几项:
/etc/rc.d/rc0.d/S60sendsignals
/etc/rc.d/rc0.d/S70mountfs
/etc/rc.d/rc0.d/S80swap
/etc/rc.d/rc0.d/S90localnet
/etc/rc.d/rc0.d/S99halt
在基于DEBIAN的LINUX系统中,我们可以在/etc/init.d目录中新增一个SHELL SCRIPT,然后在/etc/rc2.d中新增一个连接文件,如: ln -s /etc/init.d/rclocal /etc/rc2.d/S99rclocal
再例如JBOSS的系统启动,采取同样的 方法,在jboss/bin目录中有脚本 如:redhat-init-shell 先COPY到/etc/init.d中然后增加连接到/etc/rc2.d中即可
一、系统刚开机的启动分析
首先,我们知道不管是哪种原因进入init进程,必然会按以下命令si::sysinit:/etc/rc.d/init.d/rc
sysinit生成一个初始化进程,现在刚开机,这个子进程自然也会得到运行。在以sysinit为参数调用rc脚本,后将执行以下操作:
1、载入/etc/sysconfig/rc中的变量和functions中的函数,设置终端显示参数和信号处理方式;
2、由于刚开机,前一个运行级别被设为N;
3、previous=N,所以等级切换部分跳过,也就是找以K开头的那部分不做(事实上rcsysinit.d中也不存在以K开头的服务)
4、找出rcsysinit.d中所有以S开头的服务,具体为:
/etc/rc.d/rcsysinit.d/S00mountkernfs
/etc/rc.d/rcsysinit.d/S05modules
/etc/rc.d/rcsysinit.d/S10udev
/etc/rc.d/rcsysinit.d/S20swap
/etc/rc.d/rcsysinit.d/S30checkfs
/etc/rc.d/rcsysinit.d/S40mountfs
/etc/rc.d/rcsysinit.d/S50cleanfs
/etc/rc.d/rcsysinit.d/S60setclock
/etc/rc.d/rcsysinit.d/S70console
/etc/rc.d/rcsysinit.d/S80localnet
5、由于previous=N,刚开机且runlevel=sysinit,所以以上的服务被依此启动
6、以上服务启动完成后,该子进程结束。
关于以上服务的具体代码注释将在单独的文件中给出。
由于默认的运行等级3,所以系统在rc sysinit子进程结束后,将启动13:3:wait:/etc/rc.d/init.d/rc
3,即以参数3,运行脚本rc,分析一下过程:
1、初始同上;
2、刚开机,不执第一个循环判,即查找以K开头的服务
3、在查找以S开头的服务时,只有以下两个服务存在
/etc/rc.d/rc3.d/S10sysklogd
/etc/rc.d/rc3.d/S20network
4、由于previous=N,刚开机且runlevel=sysinit,以上两项服务被启动;
5、以上服务启动完成后,该子进程结束。
二、等级切换的情况
现在我们假设,如果我们切换运行等级,那系统会做些什么呢(要切换运行等级,只要以带参数形式运行init进程即可,例如init
1,表示切换至我zai 当前运行级别为3,我们使用init 1,切换至到单用户模式,这时init进程运行过程如下:
首先,以参数sysinit运行rc脚本,通过简单的分析我们可知,由于其中的服务都已经启动,所以不会有任何服务启动或停止(有点问题,我再想一下)。
其次,以参数1运行脚本rc,其执行过程也很简单,由于previous!=N 所以找出/etc/rc1.d目录下以K开头服务,有以下两项:
/etc/rc.d/rc1.d/K80network
/etc/rc.d/rc1.d/K90sysklogd
同时,发现该服务在/etc/rc3.d中(也就是已经被开启),所以以参数stop运行该项服务,也就是要停止服务。同时下一个循环中,判断/etc/rc1.d是否存在以S开头的服务,需要启动。如果有则启动,否则子进程结束。
三、关机和重启动分析
有了以上的基础,就很容易知道关机和重新启动的过程了。
首先,在rc sysinit中关闭以K开头,而且已经启动的服务,只有:
/etc/rc.d/rc0.d/K90sysklogd
其次,在rc 0(rc 6)中以stop为参数运所有以S开头的服务,通常有以下几项:
/etc/rc.d/rc0.d/S60sendsignals
/etc/rc.d/rc0.d/S70mountfs
/etc/rc.d/rc0.d/S80swap
/etc/rc.d/rc0.d/S90localnet
/etc/rc.d/rc0.d/S99halt
在基于DEBIAN的LINUX系统中,我们可以在/etc/init.d目录中新增一个SHELL SCRIPT,然后在/etc/rc2.d中新增一个连接文件,如: ln -s /etc/init.d/rclocal /etc/rc2.d/S99rclocal
再例如JBOSS的系统启动,采取同样的 方法,在jboss/bin目录中有脚本 如:redhat-init-shell 先COPY到/etc/init.d中然后增加连接到/etc/rc2.d中即可
相关阅读 更多 +
排行榜 更多 +