busybox下inittab中runlevel解析

Order of scripts run in /etc/rc?.d
==================================

0. Overview.

All scripts executed by the init system are located in /etc/init.d.
The directories /etc/rc?.d (? = S, 0 .. 6) contain relative links to
those scripts. These links are named S<2-digit-number><original-name>
or K<2-digit-number><original-name>.

If a scripts has the ".sh" suffix it is a bourne shell script and
MAY be handled in an optimized manner. The behaviour of executing the
script in an optimized way will not differ in any way from it being
forked and executed in the regular way.

The following runlevels are defined:

N System bootup (NONE).
S Single user mode (not to be switched to directly)
0 halt
1 single user mode
2 .. 5 multi user mode
6 reboot

1. Boot.

When the systems boots, the /etc/init.d/rcS script is executed. It
in turn executes all the S* scripts in /etc/rcS.d in alphabetical
(and thus numerical) order. The first argument passed to the
executed scripts is "start". The runlevel at this point is "N" (none).

Only things that need to be run once to get the system in a consistent
state are to be run. The rcS.d directory is NOT meant to replace rc.local.
One should not start daemons in this runlevel unless absolutely
necessary. Eg, NFS might need the portmapper, so it is OK to start it
early in the bootprocess. But this is not the time to start the
squid proxy server.

2. Going multiuser.

After the rcS.d scripts have been executed, init switches to the
default runlevel as specified in /etc/inittab, usually "2".

Init then executes the /etc/init.d/rc script which takes care of
starting the services in /etc/rc2.d.

Because the previous runlevel is "N" (none) the /etc/rc2.d/KXXxxxx
scripts will NOT be executed - there is nothing to stop yet,
the system is busy coming up.

If for example there is a service that wants to run in runlevel 4
and ONLY in that level, it will place a KXXxxxx script in
/etc/rc{2,3,5}.d to stop the service when switching out of runlevel 4.
We do not need to run that script at this point.

The /etc.rc2.d/SXXxxxx scripts will be executed in alphabetical
order, with the first argument set to "start".

3. Switching runlevels.

When one switches from (for example) runlevel 2 to runlevel 3,
/etc/init.d/rc will first execute in alphabetical order all K
scripts for runlevel 3 (/etc/rc3.d/KXXxxxx) with as first argument
"stop" and then all S scripts for runlevel 3 (/etc/rc3.d/SXXxxxx)
with as first argument "start".

As an optimization, a check is made for each "service" to see if
it was already running in the previous runlevel. If it was, and there
is no K (stop) script present for it in the new runlevel, there is
no need to start it a second time so that will not be done.

On the other hand, if there was a K script present, it is assumed the
service was stopped on purpose first and so needs to be restarted.

We MIGHT make the same optimization for stop scripts as well-
if no S script was present in the previous runlevel, we can assume
that service was not running and we don't need to stop it either.
In that case we can remove the "coming from level N" special case
mentioned above in 2). But right now that has not been implemented.

4. Single user mode.

Switching to single user mode is done by switching to runlevel 1.
That will cause all services to be stopped (assuming they all have
a K script in /etc/rc1.d). The runlevel 1 scripts will then switch
to runlevel "S" which has no scripts - all it does is spawn
a shell directly on /dev/console for maintenance.

5. Halt/reboot

Going to runlevel 0 or 6 will cause the system to be halted or rebooted,
respectively. For example, if we go to runlevel 6 (reboot) first
all /etc/rc6.d/KXXxxxx scripts will be executed alphabetically with
"stop" as the first argument.

Then the /etc/rc6.d/SXXxxxx scripts will be executed alphabetically
with "stop" as the first argument as well. The reason is that there
is nothing to start anymore at this point - all scripts that are
run are meant to bring the system down.

In the future, the /etc/rc6.d/SXXxxxx scripts MIGHT be moved to
/etc/rc6.d/K1XXxxxx for clarity.

 

/etc/rc?.d目录下脚本运行顺序
===========================

0.概要
所有init system机制要执行的脚本都存放在/etc/init.d目录下。/etc/rc?.d(?=S,0..6)目录包含符号链接到/etc/init.d目录下的脚本。这些符号链接以S<2-digit-number><original-name>或者K<2-digit-number><original-name>命名。
假如一个脚本以.sh后缀结尾,那么它是bourne shell并且会以最佳的方式处理。
运行模式定义如下:
N System bootup (NONE)
S Single user mode
0 halt
1 single user mode
2..5 multi user mode
6 reboot
1.boot
当系统引导时,/etc/init.d/rcS脚本会被执行,然后按顺序执行/etc/rcS.d目录下的脚本(按数字大小顺序,从小到大)。传给执行脚本的第一个参数时"start"。此时的运行等级时N。
注意:只有那些被系统执行一次的脚本才放在这个阶段。除非特殊需要,否则守护进程不要放在这个运行等级(N)执行。比如,NFS需要端口映射,所以在boot阶段开启它时OK的。但是开启squid代理服务器就不行。
2.进入multiuser(多用户模式)
当执行完rcS.d脚本,再回到inittab继续解析,一般init切换到默认的运行等级,Linux发行版的运行等级默认通常是2.
init然后执行/etc/init.d/rc脚本,这个脚本中会解析到开始运行/etc/rc2.d目录下的服务脚本。
由于之前运行等级时N,所以/etc/rc2.d/KXXxxxx脚本不会被执行(因为系统刚刚启动,没有什么服务可停止的)。
假如比方说有一个服务想运行且只运行在运行等级4,那么它会放一个KXXxxxx脚本在/etc/rc{2,3,5}.d目录下用于从运行等级4切换到运行等级2或3或5时停止这个服务。因为在运行等级2,3,5不需要这个服务脚本。
当第一个参数设置为"start",/etc.rc2.d/SXXxxxx脚本将会按顺序执行
3.切换运行等级
当从一个运行等级比如2切换到3时,/etc/init.d/rc脚本首先按顺序执行所有在运行等级3的K脚本(即/etc/rc3.d/KXXxxxx),然后执行运行等级3的S脚本(即/etc/rc3.d/SXXxxxx)
作为优化,将会对每一个服务做检查看在之前的运行等级是否已经在运行该服务。如果是在运行并且在切换后的运行等级中没有K(stop)脚本,那就没必要重新开启那个服务。
相反,如果在切换后的运行等级中有K脚本,那么它将先停止这个服务。
一样的我们可以这样优化停止脚本,假如在之前的运行等级中没有S脚本,那么我们可以认为该服务没有运行我们没必要停止该服务。
4.单用户模式
切换到单用户模式是通过切换到运行等级1.这将导致所有的服务被停止(即在/etc/rc1.d目录下有所有的K脚本)。然后运行等级1的脚本将会被切换到运行等级S,运行等级S中没有任何脚本,它所做的就是直接在/dev/console控制台上产生一个shell用于维护
5.Halt/reboot 停机/重启
进入运行等级0或6将会导致系统进入停机或重启。比如,如果我们进入到运行等级6,首先所有的/etc/rc6.d/KXXxxxx脚本会按顺序执行。
然后/etc/rc6.d/SXXxxxx脚本将按顺序执行。

posted @ 2017-02-26 11:41  大海中的一粒沙  阅读(933)  评论(0编辑  收藏  举报