Linux开机流程
- LeiYue - PT Ubuntu Blog1.读完BIOS 之后,会先去读取第一個开机硬盘的第一個扇区(就是master boot record, MBR 囉. 2. 读取MBR 的Kernel Loader …ex lilo, grub, spfdisk... 1. 开机的核心都在/boot 底下,kernel 名称通常就是/boot/vmlinuz-xxxx 的格式.
对于任何系统, 开机不仅仅是接通电源这么简单的事情, 在这短短的几秒或几十秒内将会发生许多事情, 了解这个完整的流程将是解决任何开机问题或提高开机速度的前提. 接下来, 我们就详细了解一下Linux的开机流程:
1. 加载 BIOS 的硬件信息并进行自我测试,并依据取得第一个可开机的装置;drwxrwxr-x 10 freeman freeman 4096 10月 18 14:50 ./ drwxrwxrwt 16 root root 4096 10月 18 14:47 ../ drwxr-xr-x 2 freeman freeman 4096 10月 18 14:50 bin/ drwxr-xr-x 3 freeman freeman 4096 10月 18 14:50 conf/ drwxr-xr-x 7 freeman freeman 4096 10月 18 14:50 etc/ -rwxr-xr-x 1 freeman freeman 7237 10月 18 14:50 init* -rw-r--r-- 1 freeman freeman 51981312 10月 18 14:46 initrd drwxr-xr-x 7 freeman freeman 4096 10月 18 14:50 lib/ drwxr-xr-x 2 freeman freeman 4096 10月 18 14:50 lib64/ drwxr-xr-x 2 freeman freeman 4096 10月 18 14:50 run/ drwxr-xr-x 2 freeman freeman 4096 10月 18 14:50 sbin/ drwxr-xr-x 7 freeman freeman 4096 10月 18 14:50 scripts/是不是很像Linux文件系统的目录结构(^-^)
下面我们看看/etc/inittab文件的内容:
freeman@freeman-H55M-S2:~$ cat /etc/inittab id:3:initdefault: #设置默认运行等级.init 首先读取这一行来确定运行级别. si::sysinit:/etc/rc.d/init.d/rc sysinit #执行/etc/rc.d/init.d/rc.sysinit脚本, 用于设置主机名, 挂在文件系统, 启动交换分区等. 0:0:wait:/etc/rc.d/init.d/rc 0 1:S1:wait:/etc/rc.d/init.d/rc 1 2:2:wait:/etc/rc.d/init.d/rc 2 3:3:wait:/etc/rc.d/init.d/rc 3 4:4:wait:/etc/rc.d/init.d/rc 4 5:5:wait:/etc/rc.d/init.d/rc 5 6:6:wait:/etc/rc.d/init.d/rc 6 #对应于/etc/rc.d/rc[0-6].d中的脚本. #配置行的排列语法为: # id:runlevels:action:process [argument] #id为标志字段,一般为2至4个字符. #runlevel定义本行适用的运行等级.一般如下 #--------------------------------------------------------------------- #运行等级 | 说明 #---------|------------------------------------------------------------ # 0 | Halt,关闭系统. # 1 | 单用户,在grub启动时加上为kernel加上参数single即可进入此运行等级 # 2 | 无网络多用户模式. # 3 | 有网络多用户模式. # 4 | 有网络多用户模式. # 5 | X模式 # 6 | reboot重启系统 # S/s | 同运行等级1 # a,b,c | 自定义等级,通常不使用. #--------------------------------------------------------------------- #action定义采取的行动. #--------------------------------------------------------------------- # 行动 | 说明 #--------------------------------------------------------------------- # respawn |只要进程一停止,该进程就重新启动. # wait |进程只运行一次,init将一直等待它结束,再执行其它命令. # once |进程只运行一次. # boot |系统引导进程中,进程运行,init将忽略运行等级这段. # bootwait |系统引导过程中,进程运行,init将等待进程结束. # off |不采取任何行动,功能相当于将这行用#注释掉. # ondemand |只要init调用a,b,c中的任何一种运行等级时,进程便运行. #initdefault|系统设置默认运行级别.process字段被忽略. # sysinit |只要系统引导,该进程便运行,优先于boot与bootwait. # powerwait |当init接收到SIGPWR信号时进程开始运行,一般为电源故障时运行. # powerfail |与powerwait相同,但init不会等待进程完成. #powerokwait|当电源故障修复时运行. # ctrialdel |当init收到SIGNT信号时(按下ctrl+alt+del)时,进程运行. # kbrequest |当init收到键盘处理KeyboardSignal信号时,进程运行. #---------------------------------------------------------------------- ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now #在1-5运行等级中按下ctrl+alt+del时便重新启动系统. su:S016:once:/sbin/sulogin #在S,0,1,6等级下会运行sulogin. #一般而言,如果在用grub或lilo启动时,如果为kernel加上single参数时,会直接进入单用户模式,而无需密码.造成一定安全隐患.加上这一行即可解决问题. 1:2345:respawn:/sbin/agetty -I '\033(K' tty1 9600 2:2345:respawn:/sbin/agetty -I '\033(K' tty2 9600 3:2345:respawn:/sbin/agetty -I '\033(K' tty3 9600 4:2345:respawn:/sbin/agetty -I '\033(K' tty4 9600 5:2345:respawn:/sbin/agetty -I '\033(K' tty5 9600 6:2345:respawn:/sbin/agetty -I '\033(K' tty6 9600 #设置tty控制台数量,一般为tty[1-6],X窗口系统一般运行在tty7
0:0:wait:/etc/rc.d/init.d/rc 0 1:S1:wait:/etc/rc.d/init.d/rc 1 2:2:wait:/etc/rc.d/init.d/rc 2 3:3:wait:/etc/rc.d/init.d/rc 3 4:4:wait:/etc/rc.d/init.d/rc 4 5:5:wait:/etc/rc.d/init.d/rc 5 6:6:wait:/etc/rc.d/init.d/rc 6
至此, 我们以run-level为5简单看一下对应的脚本文件内容:
freeman@freeman-H55M-S2:/etc/rc5.d$ ls -l lrwxrwxrwx 1 root root 20 9月 20 18:00 S20kerneloops -> ../init.d/kerneloops lrwxrwxrwx 1 root root 15 9月 20 18:00 S20rsync -> ../init.d/rsync lrwxrwxrwx 1 root root 27 9月 20 18:00 S20speech-dispatcher -> ../init.d/speech-dispatcher lrwxrwxrwx 1 root root 15 9月 20 18:00 S50saned -> ../init.d/saned lrwxrwxrwx 1 root root 19 9月 20 18:00 S70dns-clean -> ../init.d/dns-clean lrwxrwxrwx 1 root root 18 9月 20 18:00 S70pppd-dns -> ../init.d/pppd-dns lrwxrwxrwx 1 root root 21 9月 20 18:00 S99grub-common -> ../init.d/grub-common lrwxrwxrwx 1 root root 18 9月 20 18:00 S99ondemand -> ../init.d/ondemand lrwxrwxrwx 1 root root 18 9月 20 18:00 S99rc.local -> ../init.d/rc.local简单说明一下这个文件的命名含义: S表示Start, K表示Kill, 后面的数字表示运行的顺序, 再后面的单词就是运行的程序名.