不光对于linux对于其他的操作系统一样,我们要想对系统启动故障进行排除,就必须了解系统的构造,以及启动过程所牵涉到文件及程序。

1.Linux操作系统的构成(大致分为三个层次):

Linux启动故障排除_操作系统


内核能够完成的任务:管理内存、调度任务、驱动硬件、网络功能、安全、文件系统

linux系统的启动过程:

加电-->cmos-->post(上电自测试)-->grub

2.系统启动引导的过程(如下图):

Linux启动故障排除_linux_02


如果系统采用硬盘引导的话,那么每块硬盘的前端的第一个扇区就是MBR(512Byte),MBR分为三个部分:前446Byte为bootloader(引导加载器),中间64Byte分区表,后2Byte magic

MBR中的bootloader引导了系统启动的第一阶段,grub菜单引导了系统启动的第二阶段(grub的配置)。

grub 菜单的配置:

Linux启动故障排除_linux_03


当第二阶段引导完成会grub菜单会提示我们选择操作系统,

Linux启动故障排除_操作系统_04

Linux启动故障排除_操作系统_05


选择完操作系统后,系统就会加载内核,

Linux启动故障排除_操作系统_06


内核加载完成后就开始运行系统中第一个进程—INIT,在linux操作系统中init是一切进程的前提。

Linux启动故障排除_操作系统_07


运行init进程会调用/etc/inittab配置文件,指明系统进入的默认级别,无论进入任何的级别,系统都会调用/etc/rc.d/rc.sysinit脚本对系统进行初始化,当系统进入某一级别时,执行/etc/rc.d/rc系统会进入相应级别的目录{etc/rc0.d/ etc/rc1.d/ etc/rc2.d/  etc/rc3.d/  etc/rc4.d/ etc/rc5.d/  etc/rc6.d/},执行到最后时,系统会执行/etc/rc.d/rc.local(又称为开机脚本),最后根据提供的终端进行登录。

Linux启动故障排除_配置文件_08

至此,系统引导到开机的整个过程就完成了。


故障排除:在linux系统中故障一般发生在系统引导的第一阶段或者第二阶段。第一阶段发生故障的原因是MBR中446Byte的bootloader出现问题,如果出现问题就看不到后面的grub菜单;第二阶段是grub菜单的配置文件和说明文件出现问题,就没有办法选择操作系统。


下面我们模拟第一阶段的故障:

首先,使用dd if=/dev/zero of=/dev/sda bs=446 count=1命令重写硬盘的前446字节,把MBR中的446字节的bootloader盖掉。Linux启动故障排除_操作系统_09


重启之后,发现系统引导失败

Linux启动故障排除_linux_10


此时,我们可以通过引导光盘进行引导系统,进入急救模式(rescue)

Linux启动故障排除_操作系统_11


进入急救模式后,出现下面的画面,选择相应的操作:

Linux启动故障排除_linux_12

Linux启动故障排除_配置文件_13

Linux启动故障排除_linux_14

Linux启动故障排除_linux_15

Linux启动故障排除_linux_16

点击ok,出现如下界面:

Linux启动故障排除_操作系统_17


此时,我们需要重建第一阶段,首先执行grub进入下图模式

Linux启动故障排除_linux_18


然后,用root(hd0,0)来指明某一盘的引导分区,接着使用setup(hd0)重建硬盘的第一阶段。

Linux启动故障排除_操作系统_19


接着,使用crtl+c组合键退出grub模式,连续执行两次exit,系统会自动引导,若引导成功会出现如下的登陆界面。

Linux启动故障排除_配置文件_20


第二阶段的故障模拟:

第二阶段主要在/boot/grub/生成很多的配置和说明文件,如果/boot/grub/下的grub.conf文件丢失了,会出现什么情况呢?现在我们把该目录下的grub.conf文件删除,然后重启系统。

结果出现了以下界面

Linux启动故障排除_配置文件_21

进入了grub模式,说明我们第一阶段的引导正常,问题出现在了第二阶段。


现在,我们就需要用命令来引导系统的启动了:

Linux启动故障排除_操作系统_22


然后,使用boot来启动引导,接着出现下面的登陆界面:

Linux启动故障排除_操作系统_23


我们进入系统,使用grub-install --root-directory=/  /dev/sda 来重建二阶段。

Linux启动故障排除_配置文件_24


由于第二阶段相关的文件都在/boot/grub/目录下,我们进入该目录下,查看是否文件缺失

Linux启动故障排除_linux_25


结果发现链接所指的文件不存在,那么我们就需要创建该文件(grub.conf)内容如下:

Linux启动故障排除_配置文件_26


然后重新启动,若正常出现如下的界面,说明引导正常:

Linux启动故障排除_linux_27


现在来模拟更严重的第二阶段的引导,如果我的/boot/grub/下的文件全部丢失了,现在会出现什么情况呢?我们该怎么办?

首先,我把/boot/grub/目录下的文件全部删除掉,然后重新启动系统出现如下界面:

Linux启动故障排除_配置文件_28


此时,我们需要进入cmos模式,把引导项修改为光盘引导:

Linux启动故障排除_操作系统_29


按F10保存修改,会进入如下界面:

Linux启动故障排除_操作系统_30


然后,进入rescue急救模式,出现如下操作:

Linux启动故障排除_操作系统_31

Linux启动故障排除_配置文件_32

Linux启动故障排除_操作系统_33

Linux启动故障排除_linux_34

Linux启动故障排除_linux_35

点击ok,出现如下界面:

Linux启动故障排除_配置文件_36


然后,使用chroot改变根目录为/mnt/sysp_w_picpath,使用ls 来查看/boot/grub/目录下的内容发现内容为空,然后使用grub-install 重建第二阶段:

Linux启动故障排除_操作系统_37


再次,查看/boot/grub/目录:

Linux启动故障排除_配置文件_38


此时,由于我们在cmos中设置了光盘引导,所以要使用硬盘引导的话,就必须去掉光盘,这里我们取出光盘,连续执行两次exit,系统会自动引导,接着出现如下界面:

Linux启动故障排除_linux_39

进入了grub模式,说明我们第一阶段的引导正常,问题出现在了第二阶段。


现在,我们就需要用命令来引导系统的启动了:

Linux启动故障排除_配置文件_40


然后,使用boot来启动引导,接着出现下面的登陆界面:

Linux启动故障排除_配置文件_41


我们进入系统,使用grub-install --root-directory=/  /dev/sda 来重建二阶段。

Linux启动故障排除_操作系统_42


由于第二阶段相关的文件都在/boot/grub/目录下,我们进入该目录下,查看是否文件缺失

Linux启动故障排除_配置文件_43


结果发现链接所指的文件不存在,那么我们就需要创建该文件(grub.conf)内容如下:

Linux启动故障排除_linux_44


然后重新启动,若正常出现如下的界面,说明引导正常:

Linux启动故障排除_配置文件_45