BBS水木清华站∶精华区

发信人: Hanky@FruitTea1 (骗谁啊?), 信区: Linux 
标  题: SysV init 2.6 的开机过程 (二) 
发信站: 果茶小站 (Wed May 29 21:29:06 1996) 
 
再来我们讲一下 /etc/init.d/boot 这个 script. 
 
既然 kernel bootstrapping 完, 我们就要开始做一些 
很基本的检查、设定, 以及做一些『准备工作』。 
 
在 kernel bootstrapping 後, 在 mount root as read-only 
前会先做一些工作, 以 Linux 为例: 
 
        * 先设定这个 script 的 PATH 及 umask 
        * 挂入 kerneld 这个 daemon (这个和 kernel modules 有关, 後面再讲) 
        * mdadd -ar, 把 md device 跑起来 (这也是後面再讲) 
        * swapon -a, 把所有的 swap partition 打开来用. 
        * 挂入 update (bdflush) 这个 daemon 
 
kerneld 是 Linux kernel 1.3.xx 有了 modules 化後, 
一个会自动插 modules 进 kernel 的 daemon, 也会把 
经一段时间後不曾用到的 modules 拔出 kernel。 有关 
modules 的概念, 我们等到 kernel 的介绍再谈详细的。 
 
md device 是 Linux kernel 1.3.69 後新加入的功能, 
它可以把两个以上的 partition 合成一个大的 md device 
之後, 直接做出 file system 或 swap space, 而且可以 
『交错地』安排 block 位置, 这就像 RAID-0 一样, 所以 
不但可以将一堆小的 partition 合成大的来用, 也可以增 
进速度。 
 
update (bdflush) 这个 daemon 是每隔一段时间 (预设值 
是 5 秒) 就把 'dirty blocks' flush 回 disk 中. 这个 
一定要在跑 fsck 等主要的 I/O 动作前就先挂入的了。 
 
好, 最基本的准备完毕後, 我们就要先来 fsck 了。 
首先是把『根』mount 起来, 而且是 read-only: 
 
        * mount -n -o remount,ro / 
 
其中 -n 的参数是不把 mount 的动作写入 /etc/mtab 中, 
因为现在是把 '/' mount 成 read-only, 根本不能写入。 
然後我们开始 fsck: 
 
        * fsck -A -a 
 
参数 -A 是对 /etc/fstab 中的东西全部 check 一次, -a 
的参数是指 auto-repair. 在检查後如果有东西实在是不能 
修好, 就会执行 sulogin, 然後 reboot.  如果正常, 那就 
把 '/' remount 成 read-write: 
 
        * mount -n -o remount,rw / 
 
因为後面还会 mount -a, 所以这次我们还是用了 -n 参数。 
 
接下来是跑一些『当 '/' 可以 write 了』之後, 立刻要做的 
事: 
 
        * 跑 modules 的设定 
        * 把一些 /etc 及 / 下的档案清除 
        * 更新 psdatabase 
 
□例如下: 
 
----------[/etc/init.d/boot 部份内容]------------------------- 
# Load the appropriate modules. 
if [ -x /etc/init.d/modules ] 
then 
  /etc/init.d/modules 
fi 
 
# Remove /etc/mtab*, /etc/rmtab, /etc/nologin and /fastboot. 
rm -f /etc/mtab* /etc/nologin /fastboot /etc/rmtab 
 
# update /etc/psdatabase 
psupdate 2> /dev/null 
# or 
#ps -U 2> /dev/null 
---------[□例结束]-------------------------------------------- 
 
上面的东西, 我想大家大概都看得懂...... 
 
好, 再来就是把所有的 local partitions 都给它 mount 起来. 
 
        * mount -avt nonfs 
 
那为何是 -t nonfs 呢? 很简单, 因为我们还没开始设定 network. 
然後, 如果我们有一些 swap file 是在 mount -a 後才出现的, 
这时就要再跑一次 swapon: 
 
        * swapon -a 2>/dev/null 
 
才会把 swap file 开来用。 
OK, 然後设定网路 (这时是去叫用一个独立的 script, 
如果这个 script 不存在, 我们就无法设定 network) 
及主机名称, 然後再 mount -a -t nfs 来加挂人家 export 出来的 fs. 
 
------[□例如下]------------------------------------------------ 
if [ -x /etc/init.d/network ] 
then 
  /etc/init.d/network 
fi 
# 然後设定 hostname 
# If there's no /etc/HOSTNAME, fall back on this default: 
if [ ! -r /etc/HOSTNAME ]; then 
   echo "Henry.Dorm10.NCTU.edu.tw" > /etc/HOSTNAME 
fi 
cat /etc/HOSTNAME | cut -f1 -d . > /etc/hostname 
hostname --file /etc/hostname 
 
# Now that TCP/IP is configured, mount the NFS file systems in /etc/fstab. 
echo "Mounting remote file systems..." 
mount -a -t nfs 
------[□例结束]------------------------------------------------ 
 
好, 这时才把所有的 file system(含 nfs) 都 mount 起来了, 
所以现在立刻要做的事, 就是更新 /etc/ld.so.cache 这个档, 
设定 system clock, 然後清除 /tmp, /var/run 及 /var/lock 
下的大部份垃圾: 
 
        * /sbin/ldconfig 
        * clock -s 
        * 清除 /tmp, /var/run, /var/lock 下的垃圾 
 
OK, /tmp, /var/run 及 /var/lock 这些目录下的垃圾都清空了, 
这时才去执行 /etc/rc.boot/ 下的所有 script (其中 run-parts 
是一个工具程式, 它会把你给的参数[目录]下所有的 scripts 都 
给它跑个一次): 
 
        * run-parts /etc/rc.boot 
 
如果没有 run-parts 这个工具, 不妨自己学著用 shell script 
写一个; 或是用笨方法: 还是乖乖地写在这个 /etc/init.d/boot 
script 内吧...... 
 
然後修改 /dev/ttyXX 的属性 (关於 pty256 容後再介绍): 
 
        * chmod 666 /dev/tty[pqrstuvwxyzabcde]* 
        * chown root.tty /dev/tty[pqrstuvwxyzabcde]* 
 
再来就看你还有什麽事打算在这儿就先处理掉的, 也一并在此写入, 
或是写个 script 丢到 /etc/rc.boot/ 下也是一样的。 例如把 
powerd 跑起来、建立 /etc/motd、建立 /etc/issue.net、建立一 
些 links......都是不错的主意。 
 
以下是我的 /etc/init.d/boot 这个 script: 
 
[附件一] 
 

BBS水木清华站∶精华区