今天写这篇文章,是因为别人提出一个问题,自己搞错了,感觉不好意思,就查了一下资料,并实际测试了二个故障,同时也借鉴其他博主资料,不为别的,主要方便以后学习和查阅。

一:系统启动的流程图

linux系统启动流程及启动故障排错_linux

二:启动顺序

1,BIOS自检,检测硬件,决定启动介质

 BIOS为写入到主板上的EEPROM的程序,它可以在开机的时候执行,并通过BIOS程序去加载CMOS的信息,并通过CMOS内的设置取得主机的各项硬件配置(CMOS:CMOS的主要功能就是记录主板上面的重要参数,包括系统时间,CPU电压与频率,各项设备的I/O地址与IRQ等),BIOS程序也可以修改CMOS当中的参数,一般常见的使用Del按键进入BIOS设置界面.

2,从硬盘启动,读硬盘的第一个扇区MBR,然后将启动引导工作交给boot loader引导

MBR引导记录位于物理硬盘的第一块扇区(第一块扇区512个字节,其中MBR占446字节,分区表占64字节,结束标志占2字节),该扇区又称为主引导扇区(MBR扇区)。

3,boot loader去找 grub,grub读取配置文件grub.conf来决定默认启动项,找到内核(kernel)和驱动(initrd)

1).Boot loader:它的主要功能是认识操作系统的文件格式并加载内核到内存中去执行,由于不同的操作系统的文件格式不一致,因此每种操作系统都有自己的bootloader,bootloader分为两个阶段:        

执行boot loader加载文件系统驱动    

加载真正的配置文件: grub.conf  

2). grub.conf里面有内核和驱动的信息。

4,内核会主动调用init进程,读取配置文件 /etc/inittab,决定启动级别,运行初始化脚本/etc/rc.d/rc.sysinit,运行相应的启动级别下的脚本 /etc/rc.d/rcN.d/

1).vim /etc/inittab
id:5:initdefault:             //默认的runlevel设置,此处为5            
si::sysinit:/etc/rc.d/rc.sysinit     //准备系统软件执行的环境的脚本执行文件
l0:0:wait:/etc/rc.d/rc 0         //0 - 关机(千万不要把initdefault 设置为0 )
l1:1:wait:/etc/rc.d/rc 1        //1 - 单用户模式
l2:2:wait:/etc/rc.d/rc 2        //2 - 多用户,但是没有 NFS服务
l3:3:wait:/etc/rc.d/rc 3        //3 - 完全多用户模式
l4:4:wait:/etc/rc.d/rc 4        //4 - 没有用到(系统保留功能)
l5:5:wait:/etc/rc.d/rc 5       //5 - X11(与 3类似,但是加载使用X    Window)
l6:6:wait:/etc/rc.d/rc 6       //6 - 重新启动 (千万不要把initdefault 设置为6 )
ca::ctrlaltdel:/sbin/shutdown -t3 -r now     //是否允许按【ctrl】【alt】【del】就重新启动的选项

#不断电系统的pf,pr两种机制,一个是没电时的关机,一个是复电的处理
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
#tty1~tty6是由这六行决定的
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
#启动X window是由这里决定的
x:5:respawn:/etc/X11/prefdm -nodaemon

2)./etc/rc.d/rc.sysinit作用

1.取得网路环境和主机类型
2.测试与挂载内存设备/proc及USB设备 /sys
3.决定是否启动SELinux
4.启动系统的随机数生成器
5.用户自定义模块
6.加载内核的相关设置
7.初始化软件磁盘阵列,lvm
8.启动相关信息加载/var/log/dmesg文件中

5.依据/etc/inittab 执行/etc/rc.d/rc0~6.d
   找到/etc/rc.d/rcN.d/K??*开头的文件,并进行  /etc/rcN.d/K??*     stop 的动作
   找到/etc/rc.d/rcN.d/S??* 开头的文件,并进行  /etc/rcN.d/S??*    start 的动作
   如果默认启动是文本开启6个文本控制台 [ALT+F1~F6]
   如果默认启动项是图形则开启图形界面以及6个文本控制台
   用户自定义的开机启动程序/etc/rc.d/rc.local

6.加载X Window界面,等待用户输入用户名和密码
1). 通过/etc/passwd、/etc/shadow
验证,如果用户名和密码输入正确
读取4个初始化文件:
/etc/profile、/etc/bashrc、~/.bashrc、~/.bash_profile
文本界面直接开启shell
图形界面开启桌面,进入X Window,通过开启终端打开shell
2).系统还会自定义设备与模块对应文件为/etc/modprobe.conf

三. 介绍一下grub.conf这个文件
#vim /etc/grub.conf
default=0   # 默认的启动项,也就是启动那个title,从0开始计数。
timeout=5   #timout=5,就是默认在启动选择界面停留的时间,等待5秒自动进入默认操作系统
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
#splashp_w_picpath是grub启动背景画面,这个可以不要
#hiddenmenu 是隐藏菜单只有按上下键才会出现

title  Red Hat Enterprise Linux Server (2.6.18-308.el5)

#title后面就是系统在启动时候显示的名字

root (hd0,0)
#root    指定你内核所在分区。hd0表示第一块硬盘设备。 0表示第一个分区,也是/boot所在的分区
kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
#kernel 内核在哪里;ro 只读;root=LABEL=/ 根分区是谁;rhgb (图形化显示启动过程) ;quiet (静默式启动,不显示dmesg信息)
initrd /initrd-2.6.18-53.el5.img
#initrd内核镜象的名字
#rhgb:表示redhat graphics boot,就是用图片来代替启动过程中显示的文本信息,这些信息在启动后用dmesg可以看到
#quiet:表示在启动过程中只显示要信息,类似硬件自检的消息不回显示

四.几个故障修复的例子

案例一:

1.我们把title下面的三行删掉,然后重启系统,

linux系统启动流程及启动故障排错_linux_02

2,重启系统后,会卡在这里,因为修改了grub.conf这个文件,

linux系统启动流程及启动故障排错_linux_03

3,这里就需要吧grub.conf里的那三行手动添加进去了,需要指定/boot所在的分区,linux内核,和initrd文件,然后boot启动

linux系统启动流程及启动故障排错_linux_04

4,看到红色的Red Hat就证明你的内核加载成功了

linux系统启动流程及启动故障排错_linux_05

5,启动成功后再把/etc/grub.conf文件的那三行加回去

linux系统启动流程及启动故障排错_linux_06


案例二:

1.把/boot/grub/grub.conf删掉,会产生怎样后果?
  可以把这个文件备份到其他地方,这样启动后可以把文件恢复回去,运行find /vmlinuz-2.6.18-53el5(可以使用TAB补全),可以搜索vmlinuz所在分区

linux系统启动流程及启动故障排错_linux_07

2. 内核成功被加载

linux系统启动流程及启动故障排错_linux_08

3.把之前备份好的grub文件还原回去。


案例三:

MBR损坏
# dd  if=/dev/zero of=/dev/hda bs=446 count=1     //模拟Boot loader 损坏
#reboot
1.从光盘启动,在这之前要把镜像挂载上

linux系统启动流程及启动故障排错_linux_09

2.输入linux rescue进入救援模式

linux系统启动流程及启动故障排错_linux_10

3.选择语言

linux系统启动流程及启动故障排错_linux_11

4.选择美式键盘

linux系统启动流程及启动故障排错_linux_12

5.这里我们不启动网络接口,选择NO

linux系统启动流程及启动故障排错_linux_13

6.这里是系统自动帮你挂载以前的系统,选择Continue

linux系统启动流程及启动故障排错_linux_14

linux系统启动流程及启动故障排错_linux_15

7. 真正进入救援模式的操作
#chroot /mnt/sysp_w_picpathroot虚拟家目录
#grub-install /dev/hda
# reboot

linux系统启动流程及启动故障排错_linux_16

linux系统启动流程及启动故障排错_linux_17


案例四:

把/boot/下的内容删了再试一下

linux系统启动流程及启动故障排错_linux_18

1. 同样是同光盘启动,进入linux rescue模式,看一下/boot下什么都没有了
linux系统启动流程及启动故障排错_linux_19
2.把光盘挂上,然后安装kernel

linux系统启动流程及启动故障排错_linux_20

3.内核安装完,还需要安装grub

linux系统启动流程及启动故障排错_linux_21

4.  安装grub    

linux系统启动流程及启动故障排错_linux_22

5.没有grub.conf文件,手动添加进去,然后重启

linux系统启动流程及启动故障排错_linux_23

linux系统启动流程及启动故障排错_linux_24

6.内核加载成功

linux系统启动流程及启动故障排错_linux_25


案例五:

如果boot分区删了(前提是df可以看到/dev/hda1是boot分区记录),也可以恢复。

linux系统启动流程及启动故障排错_linux_26

linux系统启动流程及启动故障排错_linux_27

从光盘进入到救援模式后,把那个boot分区添加回去,按照上面安装内核和grub就可以启动系统了,添加grub.conf文件
注:如果重启后出现fsck.ext3: Unable to resolve 'LABEL=boot',重新进入救援模式
解决方法:# e2label /dev/hda1 /boot   #e2label可以给分区加上label