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

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

Linux启动故障排除_第1张图片


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

linux系统的启动过程:

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

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

Linux启动故障排除_第2张图片


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

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

grub 菜单的配置:

Linux启动故障排除_第3张图片


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

Linux启动故障排除_第4张图片


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

Linux启动故障排除_第5张图片


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

Linux启动故障排除_第6张图片


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


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

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


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

Linux启动故障排除_第8张图片


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

Linux启动故障排除_第9张图片


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

Linux启动故障排除_第10张图片

Linux启动故障排除_第11张图片

Linux启动故障排除_第12张图片

Linux启动故障排除_第13张图片

Linux启动故障排除_第14张图片

点击ok,出现如下界面:

Linux启动故障排除_第15张图片


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

Linux启动故障排除_第16张图片


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

Linux启动故障排除_第17张图片


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

Linux启动故障排除_第18张图片


第二阶段的故障模拟:

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

结果出现了以下界面

Linux启动故障排除_第19张图片

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


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

Linux启动故障排除_第20张图片


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

Linux启动故障排除_第21张图片


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

Linux启动故障排除_第22张图片


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

Linux启动故障排除_第23张图片


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

Linux启动故障排除_第24张图片


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

Linux启动故障排除_第25张图片


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

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

Linux启动故障排除_第26张图片


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

Linux启动故障排除_第27张图片


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

Linux启动故障排除_第28张图片


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

Linux启动故障排除_第29张图片

Linux启动故障排除_第30张图片

Linux启动故障排除_第31张图片

Linux启动故障排除_第32张图片

Linux启动故障排除_第33张图片

点击ok,出现如下界面:

Linux启动故障排除_第34张图片


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

Linux启动故障排除_第35张图片


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

Linux启动故障排除_第36张图片


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

Linux启动故障排除_第37张图片

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


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

Linux启动故障排除_第38张图片


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

Linux启动故障排除_第39张图片


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

Linux启动故障排除_第40张图片


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

Linux启动故障排除_第41张图片


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

Linux启动故障排除_第42张图片


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

Linux启动故障排除_第43张图片