Linux 开机程序之研讨( 二 )


## 成 swap 的 device 全部启动 .

/sbin/swapon -a


## 喔 ! 下面这个指令 update 就很重要了 , 它负责每隔一段固定的时间 , 就将
## buffer 中的资料 , 利用 sync 写回磁碟机上 , 并将 superblock 做 update
## 的动作 . 使用 ps 这个指令看看有那些 process , 就可看到 update 还有一个
## bdflush , 这两个 process 都是必然要存在的 , 可不要随便砍掉 , 要不然 ,
## 万一系统 crash 了 , 那磁碟机里面的资料就不是最新的了 ......

/sbin/update &


## 利用 echo -n >> 制造一个档案 , 并用 rm -f 这个档案来测试 root partition
## 是不是 read-only 或者是可读写

READWRITE=no
if echo -n >> "Testing filesystem status"; then
rm -f "Testing filesystem status"
READWRITE=yes
fi


## 假如 root partition 是 read-only 就作 fsck 的动作 , 假如不是 read-only
## 而是 read-write 的话 , 就做下面 else 之後的动作

if [ ! $READWRITE = yes ]; then
## 利用 fsck 做检查及修复档案系统的工作 , 後面接的两个参数 -A , -a .
## -A 的意思是 : fsck 会依据 /etc/fstab 中的记录 , 去检查所有的档案
## 系统 ; 而 -a 就是 auto 的意思 , 当 fsck 有修复的动作时 , 它不会问
## 你问题 , 而直接修复 .

/sbin/fsck -A -a


## 假如 fsck 有 error , [ $? -gt 1 ] 括号里面的意思是 : 若上个命令的
## 传回值大於 1 , 而上个命令就是 fsck . 让我们看看 fsck 的传回值 :
##0;- No errors
##1;- File system errors corrected
##2;- File system errors corrected, system should
##; be rebooted if file system was mounted
##4;- File system errors left uncorrected
##8;- Operational error
##16- Usage or syntax error
##128; - Shared library error
## 很明显的 , 若有任何错误产生的话 , 那 fsck 的传回值都大於 1 . 其实
## 就我的观点认为 , 应该写成 if [ $? -ge 1 ] 比较好 . 既然有错呢 , 系统
## 应该就要跳至单人模式 , 在单人模式中主要就是 /etc/rc.d/rc.K
## 中的两件事 : 关掉 swap 及 卸下所有的档案系统 , 而最後重新 login .
## 一般正常的情况下 ,; if 下面这一大段是不会执行的 , 而会跳至下面
## 标有 *************************; Normal 1; ************************* 处

if [ $? -gt 1 ] ; then
echo
echo
echo "**************************************"
echo "fsck returned error code - REBOOT NOW!"
echo "**************************************"
echo
echo
/bin/login
fi

## ******************************; Normal 1; **************************
## 当 fsck 检查没有错误之後 , 就把 root partition 重新 mount 上来
## 下面指令的参数有三个 , -w 代表mount 成可读写 , -n 代表把一个 file-
## system mount 上来 , 但不会把记录写到 /etc/mtab 中 , 在上次对 /etc/mtab
## 介绍时有提到 , 当我们使用 mount 这个指令把一个 filesystem mount 上来
## 的时候 , /etc/mtab 就会记录 ! 利用 -n 这个 option 可使得做 mount 的动
## 作 , 却不会记录 . -o 後面可以接许多的选项 , 在这里 , 我们给它的选项是
## remount . remount 的意思是 : 重新 mount 一个已经被 mount 的 filesystem
## 这个选项通常被用来改变该 filesystem 的读写旗号 ,尤其是把 filesystem
## 从 read-only 的状态 , 改变成 read-write 的状态 .

echo "Remounting root device with read-write enabled."
/sbin/mount -w -n -o remount /


## 在前面的情况中 , 都是 root partition 为 read-only 的状态下 , 所做的一些
## 工作 , 到了最後一个指令 /sbin/mount -w -n -o remount / , 才把 root
## partition mount 成 read-write . 各位有没有看到前面那行 :
## if [ ! $READWRITE = yes ]; then ..... 下面这个 else 就是与这个 if 对应
## 也就是说 , 前面那个 if 的区块中 , 所作的工作都是在 root partition 为
## read-only 的条件成立下所作的事 , 那很明显的 , 下面这个 else 就是 root

推荐阅读