BBS水木清华站∶精华区
发信人: Hanky@FruitTea1 (骗谁啊?), 信区: Linux
标 题: SysV init 2.6 的开机过程 (三)
发信站: 果茶小站 (Wed May 29 22:16:47 1996)
这下我们的 /etc/init.d/boot 跑完了, 依照 /etc/inittab
的设定, 是跑 runlevel=3, 执行 /etc/init.d/rc 3 这个指令。
/etc/init.d/rc 是一个不错 (聪明?) 的 shell script,
我们来介绍一下它的运作方式。
在 SysV init 2.6 所用的 /etc/ 下, 除了 init.d/ 及
boot/ 这两个子目录外, 尚有:
drwxr-xr-x 2 root 1024 May 28 09:08 rc0.d/
drwxr-xr-x 2 root 1024 May 28 09:08 rc1.d/
drwxr-xr-x 2 root 1024 May 29 09:54 rc2.d/
drwxr-xr-x 2 root 1024 May 28 09:08 rc3.d/
drwxr-xr-x 2 root 1024 May 28 09:08 rc4.d/
drwxr-xr-x 2 root 1024 May 28 09:08 rc5.d/
drwxr-xr-x 2 root 1024 May 28 09:08 rc6.d/
这七个子目录, 我们以 rc3.d 来作□例:
# dir rc3.d/
S20cron -> ../init.d/cron*
S20gpm -> ../init.d/gpm*
S20httpd -> ../init.d/httpd*
S20innbbsd -> ../init.d/innbbsd*
S20ip_acct -> ../init.d/ip_acct*
S20lpd -> ../init.d/lpd*
S20netbase -> ../init.d/netbase*
S20netstd_misc -> ../init.d/netstd_misc*
S20nfs -> ../init.d/nfs*
S20quota -> ../init.d/quota*
S30sendmail -> ../init.d/sendmail*
S30syslogd -> ../init.d/syslogd*
这些都是一个一个的 symbolic link 到 /etc/init.d/ 下的 script,
其中 S20 是一种控制说明, S 是表示 start (K 是表示 kill), 20
这个数字表示它们的执行顺序 (20 比 30 先执行, 同数字则照字母
顺序即可)。
/etc/init.d/rc 就是照给定的 runlevel 数字, 去对应的目录看这些
东西来决定要跑那些 script.
那麽, init.d/ 下的那些 script 又是怎麽回事呢?
我们来看一下好了:
root@Henry:/etc# dir init.d/
total 45
-rwxr-xr-x 1 root 5231 May 28 17:47 boot*
-rwxr-xr-x 1 root 290 May 28 09:08 cron*
-rwxr-xr-- 1 root 2250 May 29 01:29 genpowerfail*
-rwxr-xr-x 1 root 283 May 28 06:41 gpm*
-rwxr-xr-x 1 root 707 Feb 29 20:17 halt*
-rwxr-xr-x 1 root 718 May 28 06:27 httpd*
-rwxr-xr-x 1 root 494 May 28 07:05 innbbsd*
-rwxr-x--- 1 root 333 May 28 07:12 ip_acct*
-rwxr-xr-x 1 root 343 May 28 06:35 lpd*
-rwxr-xr-x 1 root 500 May 28 05:25 modules*
-rwxr-xr-x 1 root 699 May 28 06:12 netbase*
-rwxr-xr-x 1 root 391 Mar 19 10:32 netstd_init*
-rwxr-xr-x 1 root 598 May 29 09:54 netstd_misc*
-rwxr-xr-x 1 root 1372 May 29 10:05 network*
-rwxr-xr-x 1 root 1208 May 28 05:36 nfs*
-rwxr-xr-x 1 root 1258 Dec 28 08:02 powerfail*
-rwxr-x--- 1 root 891 May 28 06:45 quota*
-rwxr-xr-x 1 root 2928 Jan 4 19:59 rc*
-rwxr-xr-x 1 root 653 Feb 29 20:17 reboot*
-rwxr-xr-x 1 root 696 May 28 07:34 sendmail*
-rwxr-xr-x 1 root 527 Mar 20 00:44 single*
-rwxr-xr-x 1 root 1078 Dec 28 08:21 skeleton*
-rwxr-xr-x 1 root 640 May 29 08:21 syslogd*
呵呵, 没想到有这麽多吧?一个提供比较多服务的工作站, 大概
就需要这些。 除了 boot, rc, network, modules 是我们介绍
过的之外, 其他都是给 /etc/rc[0-6].d/ 做 symbolic link 用
去了。
OK, 我叫一个 script 出来给大家看:
-------[/etc/init.d/netbase]----------------------------
#!/bin/sh
#
# Start networking daemons.
test -f /usr/sbin/rpc.portmap || exit 0
case "$1" in
start)
echo -n "Starting base networking daemons: "
echo -n "rpc.portmap "
start-stop-daemon --start --quiet --exec /usr/sbin/rpc.portmap
echo -n "xinetd "
start-stop-daemon --start --quiet --exec /usr/sbin/xinetd
echo
;;
stop)
start-stop-daemon --stop --quiet --oknodo --exec /usr/sbin/xinetd
start-stop-daemon --stop --quiet --oknodo --exec /usr/sbin/rpc.portmap
killall -9 slattach 2>/dev/null || exit 0
;;
reload)
start-stop-daemon --stop --oknodo --signal 10 --exec /usr/sbin/xinetd
;;
*)
echo "Usage: /etc/init.d/netbase {start|stop|reload}"
exit 1
;;
esac
exit 0
-------[end]-----------------------------------------------------------------
其中 start-stop-daemon 是一个 perl script, 参数 --start 是跑它去启动
那个 daemon (例如 xinetd), 参数 --stop 是叫它杀掉那个 daemon。 一般
而言, 如果给的 signal 对的话 (预设值是 9, SIGKILL), 尚可使该 daemon
reload 一次它的设定档 (以 xinetd 为例是 10, SIGUSR1), 而通常都是给
1, SIGHUP。
S20netbase 这个 symbolic link 会使得 /etc/init.d/rc 去启动它, 也就是
跑 '/etc/init.d/netbase start', 使得 rpc.portmap 及 xinetd 执行起来,
就达到我们所要求的。
其他如 lpd、gpm、httpd、nfs、也是如此。 补充一点的是, nfs 类的 daemon
一定得在 rpc.portmap 跑起来之後才能正确动作 (因为 nfs 也是一种 rpc),
但在此 S20netbase 会比 S20nfs 先跑 (考虑字母顺序), 所以看起来没有什麽
问题。 注意一下执行顺序是很重要的事。
在此再补充一点, debian 有一个工具程式 update-rc.d 很有用:
-----------[man update-rc.d]-------------------------------------
NAME
update-rc.d - install and remove System-V style init
script links
SYNOPSIS
update-rc.d <basename> remove
update-rc.d <basename> defaults [ <codenumber> | <startco-
denumber> <stopcodenumber> ]
update-rc.d <basename> start | stop <codenumber> <run-
level> [ <runlevel> [ <runlevel> [...]]] .
----------[end of part]------------------------------------------
它会帮助你把新造好的 script 加入 /etc/rc[0-6].d/ 中的 symbolic
link. 如果是 defaults, 则在 rc[2-5].d/ 下造 S20xxxxx, rc[016].d/
下造 K20xxxxx 的 symbolic link, 不错吧?
BBS水木清华站∶精华区