各位是否曾经对电脑整个开机的流程感到好奇呢 ? 这一次 , 我们所要讨论的主题 , 就是 linux 从开机的一瞬间到 login 为止 , 到底发生了什么事情 ?
想必各位都知道 , 在刚开机时 , 由于 80x86 的特性 , cs ( code segment ) 【程序编程相关:WebWork 2.1.1发布】【推荐阅读:040902 Z China VS US】
之中扫描 , 看看是否有合法的 rom 存在 ( 比如 scsi 卡上的 rom ) . 【扩展信息:TNS-12560的一次解决】这个寄存器中全部都放着 1 , 而 ip ( instruction pointer ) 这个寄存器中全部都放着 0 , 换句话说 , cs=ffff 而 ip=0000 , 此时 , cpu 就依据cs 及 ip 的值 , 到 ffff0h 去执行那个地方所放的指令 . 这时候 , 由于ffff0h 已经到了高位址的顶端 , 所以 , ffff0h 这个地方 , 总是会放一个jmp 指令 , 跳到比较低的位址 . 接著 , rom bios 就会作一些检查的动作像内存 , 键盘 等...... 并在我们俗称的 umb ( upper memory block ) 假如有 , 就到里面去执行一些东西 , 执行完之后再继续刚才的行程 . 到了最后 , 读取硬盘上的第一个 sector . 在这里 , 我假设各位由硬盘启动 因此 , 就硬盘的构造而言 , 它的第一个 sector 称为 mbr ( master boot record ) . 因为一个 sector 是 512 bytes , 而 mbr 这 512 bytes 可分为两个部份 , 第一个部份为 pre-boot 区 , 占了 446 bytes ; 第二部份是partition table , 占了 66 bytes . pre-boot 区的作用之一 , 就是去看看那个 partition 被标成 active , 然後去读那个 partition 的 boot 区 . 在 linux 的启动方面 , 一般人最常把 lilo 放在 mbr 或 superblock假如你把 lilo 放在 mbr , 那很明显的 , 当读取到 mbr 的时候 , lilo就被执行 , 此时 , 你的屏幕上会出现 boot: 接着 , 就进行 load kernel 的动作 . 在另一方面来说 , 假如你把 lilo 安装在 superblock , 通常你还会有一个管理开机的程序 , 也许是放在 mbr ( 像 osbs ) 或者是放在一个单独的 partition ( 像 os/2 的 boot manager ) . 再由这个管理开机的程式去读取 lilo , 进而做 load kernel 的动作 . 好了 , 到了目前为止 , 我们已经讲到 load kernel 的动作 . kernel 被load 到 memory 中之后 , 接着进行一连串 probe 周边的动作 , 像串口并口 , 软盘 , 声卡 , 硬盘 , 光驱 等 ...... 接着 mount rootpartition . 在这之后 , kernel 会起动 init 这个 process . init 这个 process 的 pid 为 1 , 它是所有 process 的祖先 . 接下来呢 ? 系统就开始执行 /rc.d/rc.s , 在这里 , 我们暂时打住 , 先对大概的 initialization script 执行的顺序作一个浏览 , 请看下面的流程 :init[1] rc.s begin <--- 目前我们已经讲到这里 rc.serial begin rc.serial end rc.s end init[1] enter runlevel 5 rc.m begin rc.inet1 begin rc.inet1 end rc.inet2 begin rc.inet2 end rc.font begin rc.font end rc.local begin rc.local end rc.m end login 上面的流程清楚的指出 , 在 rc.s 这个 shell script 中 , 会去执行 rc.serial接着再执行 rc.m , rc.m 中又包含了 rc.inet1 , rc.inet2 , rc.font , rc.local最后执行 login . 在下面的内容中 , 将为各位介绍这几个 shell script从下面开始 , 凡是每一列之前有一个 # 的 , 为原来 shell script 中的注释有两个 # 的 , 为笔者加上的注释 , 当然啦 , 没有任何 # 的为 shell script的内容 , 而对命令或内容的解释 , 一律都写在命令或内容的前面 . 首先由 rc.s 开始 : ***************************** rc.s********************************#!/bin/sh
# # /etc/rc # # these commands are executed at boot time by init(8). # user customization should go in /etc/rc.local.echo ´======== rc.s is running ! system initializing now !!! ========´
path=/sbin:/usr/sbin:/bin:/usr/bin ## 打开所有 swap ! 下面 /sbin/swapon -a 的意思是 : 使得 /etc/fstab 中被记录 ## 成 swap 的 device 全部启动 ./sbin/swapon -a
?喔 ! 下面这个指令 update 就很重要了 , 它负责每隔一段固定的时间 ,就将buffer 中的资料 , 利用 sync 写回磁盘上 , 并将 superblock做update 的动作 . 使用 ps 这个指令看看有那些 process , 就可看到update 还有一个bdflush , 这两个 process 都是必然要存在的 , 可不要随便砍掉 , 要不然 , 万一系统 crash 了 , 那磁盘里面的资料就不是最新的了 ......
/sbin/update & ?利用 echo -n >> 制造一个文件 , 并用 rm -f 这个档案来测试 root partition
... 下一页