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