#++++++++++++++++++++++++++++++++++++++
# 课题:linux系统管理技术之troubleshooting
# 作者:胡昌文
# 日期:2008-8-4
# MSN:[email]hucw_rhce@hotmail.com[/email]
#
#++++++++++++++++++++++++++++++++++++++

RHCE的课已经过了一半,昨天搞了一天的troubleshooting,还是很有感触,现在把我的一点点经验写出来于朋友们共享。

linux系统的troubleshooting一般分为两部分,一个是关于系统的,常见的是系统启动故障,另一个是网络服务方面的,常见的是服务运行异常,或者更本不能启动,如DNS配置正确却不能正常解析,postfix发不出去邮件等等,这类的troubleshooting要视情况而定,也比较复杂,如果有兴趣,可以MSN联系,共同探讨,这里我主要讲系统方面的。

在讲系统方面的troubleshooting之前,有一个知识必须非常了解,就是linux系统的启动详细过程,这里我描述下:

硬件加电自检----->BIOS检查----->判断系统启动设备------>加载MBR------>搜索系统引导分区------>选择加载内核------>加载初始化映像文件------>启动init进程------->判断系统启动级别------>启动相关级别的相关服务------>运行/etc/rc.local------->运行/etc/bash_profile------->运行/etc/bashrc------->启动migetty,等待用户登录

熟悉这个启动过程后,我们就可以根据故障现象判断出现故障的原因,从而对症下药,进而解决问题,同时,我们也可以根据启动过程中的错误提示,判断故障原因,下面我列举几个故障现象(下面的系统是通过网络上的一台NFS服务器安装的,在安装完成后执行了一段脚本,所以出现了以下故障),及其解决办法:

1.
故障现象阐述: 刚刚重新安装的系统,安装过程中一切正常,没有任何错误提示,安装完成后,提示重新引导系统,重新引导后,发现没有出现bootloader的界面,屏幕上没有任何错误提示,只有一个光标在不停闪动,硬盘读写指示灯没有闪烁。

故障判断及其解决方法:
根据linux系统的启动过程,我们大致可以判断硬件完好,BIOS检查通过,检查发现第一引导设备是硬盘,这也正常,所以接下来应该出现bootloader的界面,让我们选择需要引导的系统,而故障中没有出现,所以我们判断应该是bootloader有误。接下来解决问题,从光盘引导系统进入rescue模式,发现无法使用命令chroot /mnt/sysp_w_picpaths切换到硬盘上的Linux系统,没办法,只好进入目录cd /mnt/sysp_w_picpaths,查看下,发现只有三个目录,/boot,/sys,/proc,其他目录都没有,修复bootloader的最后方法就是重新安装grub(现在默认的bootloader都是grub),而/etc/grub.conf文件是链接到/boot/grub/grub.conf,所以进入/boot/grub目录,发现配置文件都正常,说明grub的rpm包应该安装了,下面我们来安装grub到mbr.依次运行下面三个命令:grub---->root (hd0,0)------>setup (hd0)------>quit,然后重新启动系统,从硬盘启动,出现了bootloader(grub)的选择界面,说明我们的判断和解决方法都正确。高兴中......

2.
故障现象阐述:
原以为经过上面的一番折腾,我的linux系统可以正常启动了,可以启动过程中却有出问题了。系统引导到initrd文件加载完成,系统init进程启动之前,系统引导出错,无法继续启动,系统提示有些问题文件系统无法挂载,有些文件系统不存在等等。

故障判断及其解决方法:
根据linux启动过程和系统提示,我们发现系统当时应该是在挂载硬盘分区到系统出现了错误,而这个过程是通过文件/etc/fstab来控制,所以我怀疑是这个文件被改动了,而且配置不正确,并且这个也和在rescue模式下系统中只有三个目录的现象吻合。下面就来解决问题了,依然是从光盘启动引导系统进入rescue模式。现在出现了一个新问题,fstab文件在etc目录下,但是当前系统根本就没有etc这个目录,我们到哪里去修改fstab这个文件呢?思考中......对了,既然系统不能自动挂载,那我就手动挂载,首先,使用命令fdisk -l来查看当前硬盘分了那些分区,各个分区都有什么内容,应该被挂载到哪里。查看发现,硬盘分了三个区,100M的那个应该是boot分区,文件系统类型为swap的那个应该是交换分区,还有一个是lvm,进入LVM那个分区看下cd /dev/vol0/,发现两个逻辑分区,分别命名为root和home,初步怀疑root那个逻辑分区是根分区,然后在/mnt下建立一个目录叫testdir(mkdir /mnt/testdir),然后使用命令将根分区挂在到testdir目录(mount /dev/vol0/root /mnt/testdir),进入testdir目录,ls看下,所有目录都有,果然是根分区,接下来进入正题,修改fstab,vi /etc/fstab,发现这个文件已经被改的面目全非了,没办法重新写一个吧,如下:

#=================================================
/dev/Vol0/root           /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
/dev/Vol0/home          /home                   ext3    defaults        1 2
/dev/sda3                swap                    swap    defaults        0 0
#=================================================

OK,保存退出了,重新引导系统从硬盘启动,这下应该万事大吉了吧......

3.
故障现象阐述:
经过上面那些艰难的操作,系统总算是慢慢启动了,期待中......挂载文件系统也正常了,解下来该启动init进程了,下面确定系统启动级别,然后启动相关服务吧,不对呀,我的系统怎么自动重启了,再次启动也是这样,郁闷了。

故障判断及其解决方法:
根据上述现象,系统的所有相关服务应该都没有开始启动,而且系统重启的系统级别是6,这样inittab这个文件就有很大的嫌疑了,老办法了,进入rescue模式,这次chroot /mnt/sysp_w_picpaths这个命令运行正常,没有任何错误提示,而且系统的所以目录都有了,这就说明我的上一步操作是正确的。vi /etc/inittab,发现有一段脚本错误:

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 6
l4:4:wait:/etc/rc.d/rc 6
l5:5:wait:/etc/rc.d/rc 6
l6:6:wait:/etc/rc.d/rc 6

有了这段脚本,我现在可以确定我的判断是正确的,每当启动到3或者5的级别时,就自动运行了6级别的脚本,这样不重启才怪呢,二话不说,修改成这样:

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

OK,保存退出!reboot......

4.
故障现象阐述:
系统终于正常启动了,多么熟悉的[ ok ],多么熟悉的登录窗口呀,准备登录咯......对了,密码是多少呀?去问老师,结果老师说了一句“你觉得我会告诉你密码吗?”,那个郁闷呀......

故障判断及其解决方法:
没办法了,怪不得我了,破解root密码吧,这个可是我的强项,方法嘛,太简单了,这里就不说了!就改成redhat吧。

5.
故障现象阐述:
进入图形化界面,然后打开一个终端看看我都做了些什么,奇怪,为什么我的终端打不开呀,一开就弹出个对话框,具体内容不大记得了,反正就是说我的terminal不能使用,可是我明明已经解决了所有的故障呀,难道有人对我特别照顾,加了一个?

故障判断及其解决方法:
我认真的思考,冷静的思考,仔细的思考,回忆以上出的四个问题,我敢肯定其中的三个问题我都处理的正确,只有那个挂载文件系统的那个我有点不太肯定,到不是写错了什么,而是怀疑我写漏了什么,vi /etc/fstab,

#=================================================
/dev/Vol0/root           /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
/dev/Vol0/home          /home                   ext3    defaults        1 2
/dev/sda3                swap                    swap    defaults        0 0
#=================================================

总感觉好像缺点什么,对了,我好像忘了挂载三个虚拟文件系统,分别是devpts,proc,sys,加上后如下:

#=================================================
/dev/Vol0/root          /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
/dev/Vol0/home          /home                   ext3    defaults        1 2
proc                    /proc                   proc    defaults        0 0
sysfs                   /sys                    sysfs   defaults        0 0
/dev/sda3                swap                    swap    defaults        0 0
#==================================================

OK,保存退出!reboot......再打开terminal,Ok,一切正常!太有成就了!呵呵!

总结:
其实troubleshooting是个比较复杂的过程,以上的几个简单的例子只是troubleshooting的一个简单缩影,希望可以起到抛砖引玉的作用,