• 冒险村物语
  • 英雄无敌3塔防
  • 驾考家园手游

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

2012-09-08

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

回顾一下RHEL6的开机流程

1.加载BIOS的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备; win2003故障
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[!--empirenews.page--]副标题[/!--empirenews.page--]因为我们知道删除了/boot/grub这个目录,所以,我们就来创建这个目录。如果说,我们不知道原因的话,最好到/boot/这个目录中看看,是不是少了什么?如何来建立这目录里面的内容呢?看下面的步骤: 

首先chroot 

chroot


这个时候,我们就在系统的环境中工作了,否则我们是在光盘的环境中工作。 
我们看看我们的系统磁盘情况

fdisk

 

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

 

grub-install

 

查看安装好的文件

 

编写自己的grub.conf文件

建立grub.conf这个文件,并输入下面的内容(参考中关于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的多窗口功能,如果不知道怎么用(参考多窗口功能)        
到命令行模式下 
: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

 

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

这里随便也说一下,在救援模式下chroot后,光盘名不是cdrom了,而是scd0

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

 

rpm

 

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

 

rpm2

 

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

 

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

4、initramfs故障的解决[!--empirenews.page--]副标题[/!--empirenews.page--]我们前面的内容中提到过initramfs这玩意,他的目的和initrd一样的,就是在于提供开机过程中所需要的最重要内核模块,以让系统开机过程可以顺利完成。因为内核模块放在/lib/modules/$(uname -r)/kernel/ 当中, 这些模块必须在根目录(/)被挂载时才能够被读取。如果内核本身不具备磁盘的驱动程序时, 当然无法挂载根目录,也就没有办法取得驱动程序,那么就造成开不了机了。当然这里只是举了个简单的例子,像一些特殊的功能,如LVM,RAID等这些,如果没有这些模块的话,你的系统肯定是不能启动的了。 

虽然一般情况下,没有这个文件,系统同样的启动,但遇到一些特殊应用的时候,系统就启动不了了。 
initramfs和initrd的区别请参考(RHEL6由initrd走向initramfs 
) 
但是奇怪的是:在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文件了。 

重新启动系统吧!

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命会出错 

创建目录

 

mkdir rcx.d


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

 

 

chkconfig_help

 

我们来增加一个network服务 

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

增加后,我们再来看看/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),恢复相应的文件 

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)

人气推荐

知识阅读

精彩推荐

  • 游戏
  • 软件
查看更多>>