BBS水木清华站∶精华区

发信人: Hanky@FruitTea1 (骗谁啊?), 信区: Linux 
标  题: SysV init 2.6 的开机过程 (一) 
发信站: 果茶小站 (Wed May 29 19:38:46 1996) 
 
首先我们先讲一下为什麽是 sysv init 2.6: 
因为很多 distributions 用了有问题的 2.5x 版...... 
所以我们以 Linux 为平台, 讲 2.6 的。 
 
这样开场白好像怪怪的, 先不管它。 
 
一般来说, 系统在跑完 kernel bootstrapping 後, 就去跑 init 
这个『万process之父』, 有了它, 才能开始生小孩...... 
另外 Linux 有两个 kernel 类的 process 也开始跑了起来, 
一个是 kflushd, 另一个是 kswapd: 
 
        * process ID 1: init 
        * process ID 2: kflushd 
        * process ID 3: kswapd 
 
只有这个 init 是完全属於 user 类的 process, 後两者是 kernel 
假藉 process 之名挂在排程上。 
 
init 一开始就去读 /etc/inittab, 这个 inittab 中对於各个 
runlevel 要跑哪些 rc 或 spawn 出什麽有很清楚的设定。 
 
--------[/etc/inittab □例档]--------------------------------- 
 
# /etc/inittab: init(8) configuration. 
# $Id: inittab,v 1.4 1996/03/10 11:47:55 miquels Exp $ 
 
# The default runlevel, 我们设为 3; runlevel 的概念我们等会儿提。 
id:3:initdefault: 
 
# 开机的 system configuration/initialization script. 
# This is run first except when booting in emergency (-b) mode. 
si::sysinit:/etc/init.d/boot 
 
# What to do in single-user mode. sulogin 即为 Single User LOGIN. 
~~:S:wait:/sbin/sulogin 
 
# /etc/init.d executes the S and K scripts upon change 
# of runlevel. 其中 /etc/init.d/rc 是一个 shell script, 
# 後面的 0~6 参数表示要跑该 runlevel 所应跑的设定 script. 
# Runlevel 0 is halt. 
# Runlevel 1 is single-user. 
# Runlevels 2-5 are multi-user. 
# Runlevel 6 is reboot. 
 
l0:0:wait:/etc/init.d/rc 0 
l1:1:wait:/etc/init.d/rc 1 
l2:2:wait:/etc/init.d/rc 2 
l3:3:wait:/etc/init.d/rc 3 
l4:4:wait:/etc/init.d/rc 4 
l5:5:wait:/etc/init.d/rc 5 
l6:6:wait:/etc/init.d/rc 6 
 
# 当 CTRL-ALT-DEL 按下去了, 该做什麽?一般都是 shutdown -r now 
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -r now 
#                                 ^^^^^先等个一秒好了 
 
# Action on special keypress (ALT-UpArrow). 这个我暂时查不到, 抱歉。 
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work." 
 
# What to do when the power fails/returns. 这个我晚一点讲 (有关 UPS 的部份) 
pf::powerwait:/etc/init.d/genpowerfail start 
#pn::powerfailnow:/etc/init.d/genpowerfail now 
po::powerokwait:/etc/init.d/genpowerfail stop 
#pg::powerokwait:/etc/init.d/genpowerfail stop 
 
# /sbin/getty invocations for the runlevels. 
# ^^^^^^^^^^^开 console 出来了。 
# The "id" field MUST be the same as the last 
# characters of the device (after "tty"). 
# 例如在 runlevel==3 时, 会有六个 virtual console (tty1~tty6) 
# Format: 
#  <id>:<runlevels>:<action>:<process> 
1:2345:respawn:/sbin/agetty 19200 tty1 
2:23:respawn:/sbin/agetty 19200 tty2 
3:23:respawn:/sbin/agetty 19200 tty3 
4:23:respawn:/sbin/agetty 19200 tty4 
5:23:respawn:/sbin/agetty 19200 tty5 
6:23:respawn:/sbin/agetty 19200 tty6 
 
----------[End of /etc/inittab]--------------------------------- 
 
上面的设定, 令系统在一跑完 kernel bootstrapping 後, 就去执 
行 /etc/init.d/boot 这个 shell script, 如果没什麽问题, 就 
进入 default runlevel, runlevel 在 sysv 通常是有如下意义: 
 
0: halt (只有 shutdown, 不 reboot 了) 
1: Single-user 
2: Multi-user 
3: Multi-user & 把 network resource export 出来 
4: 除了有 Multi-user & export network resource, 一般来讲是留给 xdm 
5: 不太用到了. 
6: reboot (shutdown 後会 reboot) 
 
其中 2-5 都是 multi-user 的 runlevel, 通常 runlevel(2~5) 
越高, 所提供的服务也就越多。当系统资源有所变动 (例如电力) 
时, 我们可以用 telinit 去告知 init 要变换 runlevel (例如 
原来是 runlevel=3, 用 telinit 2 使 runlevel 降为 2), 这 
样子可以关掉一些网路资源服务; 或例如 telinit S 与 telinit 1 
都是到 Single-user mode (但前者不同的是, telinit S 根本 
就直接在 /dev/console 上执行一个 /bin/sh 给你用; 後者会 
去执行 /etc/init.d/rc 1 这个指令); telinit 6 就等於 reboot. 
 
OK, 有问题请先提出来。 
 
下面我们要讲到的是 /etc/init.d/boot 这个 script 应该做些 
什麽, 才是我们要的。 
 

BBS水木清华站∶精华区