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水木清华站∶精华区