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