一天一点学习Linux之RHEL6开机故障排除

2011年01月05日 Linux基础 评论 6 条 阅读 19,510 views 次

在前面,我们学习过RHEL6的开机流程。今天我们就来看看这个开机过程中,各种环节出现问题后的解决办法。

回顾一下RHEL6的开机流程

1.加载BIOS的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备;
2.读取并执行第一个开机设备内MBR的boot Loader(grub等程序);
3.依据boot loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序;
4.内核启动init
5.系统初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit)
6.init找到/etc/inittab文件,确定默认的运行级别(X) (/etc/init/rcS.conf exec telinit $runlevel)
7.触发相应的runlevel事件(/etc/init/rc.conf exec /etc/rc.d/rc $RUNLEVEL)
8.开始运行/etc/rc.d/rc,传入参数X
9./etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本
10./etc/rcX.d/中的脚本按事先设定的优先级依次启动
11.最后执行/etc/rc.d/rc.local
12.加载终端或X-Window接口

我们就根据上面的流程来制造问题,然后解决故障!

 

1、硬件故障解决

不用说,系统启动的时候就会报错,自检过不了,那么下面的所有步骤都是空谈。这个问题的解决办法就是找到硬件问题,然后排除。

2、GRUB故障解决

在破坏GRUB之前,我们先来看看/boot这个目录里面的文件是什么?
[root@yufei boot]# ls
config-2.6.32-71.el6.i686         initrd-2.6.32-71.el6.i686.img
efi                               symvers-2.6.32-71.el6.i686.gz
grub                              System.map-2.6.32-71.el6.i686
initramfs-2.6.32-71.el6.i686.img  vmlinuz-2.6.32-71.el6.i686
[root@yufei boot]# rpm -qf config-2.6.32-71.el6.i686 initramfs-2.6.32-71.el6.i686.img symvers-2.6.32-71.el6.i686.gz System.map-2.6.32-71.el6.i686 vmlinuz-2.6.32-71.el6.i686
kernel-2.6.32-71.el6.i686
kernel-2.6.32-71.el6.i686
kernel-2.6.32-71.el6.i686
kernel-2.6.32-71.el6.i686
kernel-2.6.32-71.el6.i686

我们看到,/boot这个目录里面,除了efi和grub目录以及initrd-2.6.32-71.el6.i686.img文件不是kernel-2.6.32-71.el6.i686这个软件包安装的,其它的都是。

[root@yufei boot]# rpm -qf efi/EFI/redhat/grub.efi
grub-0.97-68.el6.i686
[root@yufei boot]# rpm -qdf grub
/usr/share/doc/grub-0.97/AUTHORS
/usr/share/doc/grub-0.97/COPYING
/usr/share/doc/grub-0.97/ChangeLog
/usr/share/doc/grub-0.97/NEWS
/usr/share/doc/grub-0.97/README
/usr/share/doc/grub-0.97/TODO
/usr/share/doc/grub-0.97/menu.lst
/usr/share/info/grub.info.gz
/usr/share/info/multiboot.info.gz
/usr/share/man/man1/mbchk.1.gz
/usr/share/man/man8/grub-install.8.gz
/usr/share/man/man8/grub-md5-crypt.8.gz
/usr/share/man/man8/grub-terminfo.8.gz
/usr/share/man/man8/grub.8.gz

上面的这两个和grub-0.97-68.el6.i686这个文件有关了。哈哈,关于上面的命令,我们已经学习过man,如果有兴趣的朋友,可以打开来看看,学习一下。我只是提一下,rpm是RPM格式的软件包管理程序。

至于这个文件是怎么来的,我们后面再继续。
OK,我们知道上面的内容了,下面我们就来破坏GRUB,直接用rm -fr /boot/grub这个命令
[root@yufei boot]# rm -fr /boot/grub/
[root@yufei boot]# ls
config-2.6.32-71.el6.i686         symvers-2.6.32-71.el6.i686.gz
efi                               System.map-2.6.32-71.el6.i686
initramfs-2.6.32-71.el6.i686.img  vmlinuz-2.6.32-71.el6.i686
initrd-2.6.32-71.el6.i686.img
[root@yufei boot]# reboot

看到如下的提示,就进入不了系统了
grub1

下面就来看看如何解决这个问题
首先拿出你的系统光盘,放入光驱,设置从光盘启动,进入救援模式(如图)

1

2

3

4

5

6

7

8

9

因为我们知道删除了/boot/grub这个目录,所以,我们就来创建这个目录。如果说,我们不知道原因的话,最好到/boot/这个目录中看看,是不是少了什么?如何来建立这目录里面的内容呢?看下面的步骤:
首先chroot
chroot
这个时候,我们就在系统的环境中工作了,否则我们是在光盘的环境中工作。
我们看看我们的系统磁盘情况fdisk

下面就开始重新安装我们的GRUB了

grub-install

查看安装好的文件

grub

编写自己的grub.conf文件

建立grub.conf这个文件,并输入下面的内容(参考http://www.opsers.org/2011_01_1529.html中关于grub.conf的格式)
default=0
timeout=5
title Red Hat Enterprise Linux (New GRUB)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-71.el6.i686 ro root=/dev/sda1
        initrd /boot/initramfs-2.6.32-71.el6.i686.img

grub.conf

当然,你可能说,不知道文件名啊,写错了怎么办,一种办法,自己用笔记下,另外一种办法,就是用VIM的多窗口功能,如果不知道怎么用(参考http://www.opsers.org/2010_12_1499.html多窗口功能)       
到命令行模式下
:sp /boot

vim_sp

最后两个exit后就跳到重新启动菜单
reboot

重新启动后,要记得选择最后一个Boot from local drive(如果说,你在BIOS中设置从硬盘启动,就无所谓了)。这时候会有个关于SELinux的检测过程,时间稍长,随后再重新启动就能登陆系统了。
SELinux
这里顺便也演示了hiddenmenu这个的作用(没有的话,就会有个菜单选项)
hiddenmeu

哈哈,第一个故障成功排除!
yufei

3、boot的故障解决

这里boot的故障指的是/boot目录里面的文件被误删除或者是其它的破坏行为。
我们也知道/boot这个目录里面,除了efi和grub目录以及initrd-2.6.32-71.el6.i686.img文件不是kernel-2.6.32-71.el6.i686这个软件包安装的,其它的都是。那么我们就来把其它的全部删除,看看故障情况吧。

[root@yufei ~]# cd /boot
[root@yufei boot]# rm -f config-2.6.32-71.el6.i686 initramfs-2.6.32-71.el6.i686.img symvers-2.6.32-71.el6.i686.gz System.map-2.6.32-71.el6.i686 vmlinuz-2.6.32-71.el6.i686
[root@yufei boot]# ls
efi  grub  initrd-2.6.32-71.el6.i686.img

哈哈,只有两个目录和一个文件了。那你们重新启动机子reboot

error

还是一样,用光盘进入救援模式(参考第2个故障)。
当然,我们还是需要chroot /mnt/sysimage
因为我们要安装内核的相关文件,所以,我们要把光盘里面的kernel-2.6.32-71.el6.i686这个文件安装在系统上,那如何安装呢?
先挂载光盘
mount /dev/scd0 /mnt/hgfs
mount
这里随便也说一下,在救援模式下chroot后,光盘名不是cdrom了,而是scd0

挂载上光盘后,我们进行kernel的重新安装

rpm

注意,一定要在后面加上个--force参数(强制)

rpm2

安装好后,再看/boot目录,是不是已经有了我们想要的东东了

finish

最后两个exit后就跳到重新启动菜单,两次重新启动后,就能正常登陆了。
注意:安装后,会在grub.conf中增加新的启动选项,如果不需要可以自己删除。哈哈……
这里你会不会有什么启发呢?对了,就是上面的grub.conf文件如果你不会写的话,尝试一下用安装内核的办法增加内容,也是个不错的选择,但需要自己先创建这个文件,然后才能写。

4、initramfs故障的解决

我们前面的内容中提到过initramfs这玩意,他的目的和initrd一样的,就是在于提供开机过程中所需要的最重要内核模块,以让系统开机过程可以顺利完成。因为内核模块放在/lib/modules/$(uname -r)/kernel/ 当中, 这些模块必须在根目录(/)被挂载时才能够被读取。如果内核本身不具备磁盘的驱动程序时, 当然无法挂载根目录,也就没有办法取得驱动程序,那么就造成开不了机了。当然这里只是举了个简单的例子,像一些特殊的功能,如LVM,RAID等这些,如果没有这些模块的话,你的系统肯定是不能启动的了。
虽然一般情况下,没有这个文件,系统同样的启动,但遇到一些特殊应用的时候,系统就启动不了了。
initramfs和initrd的区别请参考(RHEL6由initrd走向initramfs
http://www.opsers.org/2011_01_1532.html)
但是奇怪的是:在RHEL6中,还是用mkinitrd这个命令来创建initramfs,不知道为什么会这样?(如果有明白的朋友,可以留言交流)

现在我们来删除这个文件(建议备份)。
要想重新创建这个文件其实很简单就是用mkinitrd这个命令来创建,下面就来看看这个的用法。
[root@yufei ~]# mkinitrd --help
usage: mkinitrd [--version] [--help] [-v] [-f] [--preload <module>]
       [--image-version] [--with=<module>]
       <initrd-image> <kernel-version>

       (ex: mkinitrd /boot/initramfs-2.6.32-71.el6.i686.img 2.6.32-71.el6.i686)

通过上面的帮助,我们可以看到他给的例子就是用mkinitrd创建initramfs的。那么OK,我们也来创建一个。
[root@yufei ~]# mkdir back
[root@yufei ~]# mv /boot/initramfs-2.6.32-71.el6.i686.img ./back
[root@yufei ~]# reboot

我们发现启动后就黑屏了,没有反应。同样还是进入救援模式,然后chroot 。
执行下面的命令,如果要查看具体的创建过程,我们可以加上-v参数。
command

执行上面的命令要稍等一会,

再来看看/boot目录下面,是不是有了这个initramfs-2.6.32-71.el6.i686.img文件了。
contrast

重新启动系统吧!

5、运行级别的故障解决

我们知道,系统运行级别的实际相关文件都在/etc/rc.d这个目录下,所以我们删除这个目录里面的全部文件。
[root@yufei ~]# mkdir /root/back
[root@yufei ~]# mv /etc/rc.d/rc?.d /root/back

重新启动系统错误提示如下
error0
只能硬启动了
在运行级别5下,启动时候的错误提示如下
error

同样,还是进入救援模式
chroot后,
只需要把运行级别inittab文件里面的5改成3或者是2就能登陆系统了,如果是改成1的话,会在Entering non-interactive startkup处卡住。

注1:如果你的默认运行级别是5的话,系统是启动不了的。但如果你的默认运行级别是2、3的话,系统能启动,只是少了很多有服务而已。
注2:在RHEL6中,如果没有inittab这个文件系统同样能启动,但启动的级别是3。
注3:如果想让整个服务和系统安装时候的一样,那么就只能自己动手来增加了(参考其他的系统来配置相应的服务),我相信通过前面的学习,你已经知道如何来增加了吧!(不同的运行级别,只是启动的服务不同,而且都是连接文件+启动的优先级别)因为这个涉及到的操作很多,有兴趣的朋友就自行研究用ln命令来操作。下面我们演示的是通过chkconfig这个命令来增加。

接上面
我们把运行级别调整到3后,进入系统(当然不换到3运行级别也行,直接在救援模式下操作)
首先创建我们的rc?.d这7个目录,不然执行chkconfig命会出错
chkconfig

创建目录

mkdir rcx.d
我们知道,在不同的运行级别中服务,调用的其实都是/etc/init.d这个目录中的脚本,所以我们想增加什么服务,就可以参考这个目录。
我们以network这个服务为例
如果不知道如何使用chkconfig命令,就可以用帮助

chkconfig_help

我们来增加一个network服务
chkconfig_on

我们也可以不用他默认的,根据自己的情况来增加
以sshd为例
chkconfig_on1

增加后,我们再来看看/etc/rc.d/rcN.d中的变化

chkconfig_over
关于其它的服务,自己来看着增加吧。这里只是给大家指引个思路

6、其他启动相关的文件故障
如/etc/rc.d/rc、/etc/init/rcS.conf、/etc/rc.d/rc.sysinit等等,这些文件都是由initscripts这个软件提供的,我们可以提取这个软件包中的文件,进行恢复。
这里只做个简单的介绍
进入救援模式,挂载光盘,拷贝initscripts-$(uname -r).rpm到某个地方,提取文件(rpm2cpio initscripts-$(uname -r).rpm |grep cpio -imd),恢复相应的文件

同时感谢群中小默的写的故障排除文章

本文关键字:一天一点,学习Linux,RHEL6,开机故障,故障排除

6 条留言  访客:3 条  博主:3 条

  1. avatar dickcow888

    真的好详细啊,谢谢,上次培训的时候听的模糊谢

  2. 羽飞大哥,在6月初我参加的一个广东省linux技术大赛上,很不幸的挂掉了。
    尤其杯具的是挂在第一题。
    当时第一题是系统故障修复,凭记忆,故障提示大概是:No Boot Device Available
    在rescue模式下,无法挂载硬盘系统到/mnt/sysimage。
    羽飞大哥,请问可能出现什么原因会导致无法挂载?
    系统是RHEL-5的

  3. 楼主你好:
    我按照你的FA方法修改grub.conf 出现错误。
    erro15: file not find
    我修该grub.conf
    kernel /boot/vmlinuz-2.6.32-71.el6.i686 ro root=/dev/sda1
    initrd /boot/initramfs-2.6.32-71.el6.i686.img
    变成kernel /vmlinuz-2.6.32-71.el6.i686 ro root=/dev/sda1
    initrd /initramfs-2.6.32-71.el6.i686.img

    也不行 还是出错 提示:Can’t mount root filesystem, boot has failed, sleeping forever

    希望楼主解答 谢谢
    grub问题: find /boot/grub/stage1 说找不到,这个文件明明是有的,用ls,vi,cat都可以看到,为什么报没有呢

给我留言

Copyright © 羽飞博客 保留所有权利.   Ality主题 皖ICP备14013844号-1

用户登录