RHCE 排错技巧
有些时候你可能会成为 Red Hat Enterprise Linux 管理员,甚至对于 Red Hat考试,你可能遇到一个系统无法启动。
这需要你确定出现问题的原因并修复。有些时候,可能是硬件的问题:系统供电电源有问题或硬盘崩溃。
通常情况,一个失败的系统,开机可以追溯到行动的用户:你的系统管理员!当你编辑系统配置文件,书写错误会导致系统无法启动。
任何时候你对系统做出更改或更改关键配置文件,首先要备份它们。配置完成后,你需要重启系统以验证更改,不要假设下次重启时能正常启动。
最好是在你遇到问题能记得你所有做过的更改。最好是,你能将配置文件恢复到原工作状态。
在前面章节提到的,最主要的工具就是第一章光盘提供的 linux rescue 环境。考试指导中指出,
你需要知道如何“diagnose and correct boot failures arising from bootloader, module, and filesystem errors”;
它分解成3个部分。此外,一些 “diagnose and correct problems with network services”关键工具,
前些章节提到的会在这里汇总。一些关键工具运行你 “add, remove, and resize logical volumes”。最后使用 Setroubleshoot 浏览器
(在第15章有描述),诊断并更正 SELinux 下的网络服务问题。
启动加载排错
RHEL5 的启动加载程序是 GRUB。在第3章有更广泛的讨论。它可以帮助你:
*确认/boot 目录下的根分区定义
*开机进入指定的非默认运行级别
*进入 GRUB 命令行
*测试不同 GRUB 命令
*使用命令查找内核和启动 RAM 磁盘
你不需要知道所有的技巧,他们仅帮你快速的诊断考试中的问题。
练习 16-6:启动加载排错
这个练习你需要一个搭档。让搭档更改你的系统。让他在你系统上单独工作,直到系统重新启动。不要看实验直到你解决你的搭档制造的问题为止。
使用 RHEL 系统的 VMware 快照是相当有用的。练习中的问题类似于管理员搞砸了他的系统。你同样需要 RHEL 第一张安装盘。
1、备份启动加载程序相关文件,/boot/grub/grub.conf。确定将文件备份到其他位置,保证你的搭档在更改任何文件前做了备份。
2、用文本编辑器编辑 /boot/grub/grub.conf。关注内核命令行,类似下面所示:
kernel /vmlinuz-2.6.18-8.el5 ro root=/dev/VolGroup00/LogVol00
或
kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/
3、在内核命令的根分区制造一个书写错误。
4、重启你的系统,让你的搭档回到电脑前。告诉他错误消息。将 RHEL5 第一张安装盘给你的搭档。
5、告诉你的搭档,在更改任何文件前,将其备份到家目录下。
6、当你的搭档完成实验,无论发生什么,恢复原配置文件 /boot/grub/grub.conf。(另外,你可以从 VMware快照中恢复配置。)
模块错误
大多内核是有加载模块编译的。当前的发行版 Linux, 包括 RHEL,在开始的 RAM 上配置模块,将其编译为 /boot 目录下的 initrd-* 文件。
你可以查看 GRUB的配置文件,在最后一行有与 RAM 相关的配置。如在第8章描述的,你可以使用 mkinitrd 命令建立一个起始 RAM 配置文件。
当然也可能会出现一些问题,见下面的练习。
练习 16-7:启动加载模块的派错
这个练习你需要一个搭档。让搭档更改你的系统。让他在你系统上单独工作,直到系统重新启动。
不要看实验直到你解决你的搭档制造的问题为止。
使用 RHEL 系统的 VMware 快照是相当有用的。练习中的问题类似于管理员搞砸了他的系统。你同样需要 RHEL 第一张安装盘。
1、备份启动加载程序相关文件,/boot/grub/grub.conf。确定将文件备份到其他位置,保证你的搭档在更改任何文件前做了备份。
2、用文本编辑器编辑 /boot/grub/grub.conf。关注 initrd 命令行,类似下面所示:
initrd /initrd-2.6.18-8.el5.img
3、将 initrd 改写(随便写)。
4、重启你的系统,让你的搭档回到电脑前。告诉他错误消息。将 RHEL5 第一张安装盘给你的搭档。
5、告诉你的搭档,在更改任何文件前,将其备份到家目录下。
6、当你的搭档完成实验,无论发生什么,恢复原配置文件 /boot/grub/grub.conf。(另外,你可以从 VMware快照中恢复配置。)
文件系统错误及检查
虽然有很多问题会导致系统无法启动,但这些问题大多由硬件错误或软件和配置错误产生的。最常见的硬件错误是磁盘损坏;
像移动某些器件,它们的寿命是有限的,这可能导致错误。幸运的是,Red Hat 考试不会要求你处理硬件错误。
另外,需要知道如何挂载磁盘分区,编辑文件和处理文件,同时你要掌握一些命令以在救援模式或单用户模式下修复错误。
最有用的模式是 df,fdisk和fsck 命令。要诊断问题,你至少要知道这些命令的最低工作水平。
df
df 命令在第4章有介绍。当你使用 df命令,你可以看到挂载的目录,每个分区的容量以及分区的利用率。显示结果如下:
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda7 9920592 4096804 5311720 44% /
/dev/sda6 18868344 8838344 9056064 50% /all
/dev/sda5 4956284 2774720 1925732 60% /home
/dev/sda3 29753588 17951924 10265852 64% /data
/dev/sda2 9920624 7349992 2058564 79% /install
/dev/sda1 101086 11653 84214 13% /boot
显示结果以字节为单位,这里有一些变量,你可以看到以 M 和节点为单位的输出:
# df -m
# df -i
fdisk 和 parted
fdisk 和 parted 工具在第4章也有描述。你使用 fdisk 或 parted,你可以找到你的可用分区。
例如,使用 fdisk -l /dev/hda (或 parted /dev/hda print)命令会列出第一块硬盘的分区列表:
# fdisk -l /dev/hdaDisk /dev/hda: 15.0GB, 15020457984 bytes
240 heads, 63 sectors/track, 1940 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 949 7174408+ b Win95 FAT32
/dev/hda2 950 963 105840 83 Linux
/dev/hda3 964 1871 6864480 83 Linux
/dev/hda4 1872 1940 521640 f Win95 Ext'd (LBA)
/dev/hda5 1872 1940 521608+ 82 Linux swap
通过 fdisk 的输出结果,你可以很容易确定分区为 Linux的分区有:/dev/hda,/dev/hda3和/dev/hda5。
鉴于分区的容量, /dev/hda2 与 /boot 相关联, /dev/hda3 与 / 相关联。 parted 输出与上面类似:
# parted /dev/sda printModel: ATA HDS728080PLA380 (scsi)
Disk /dev/sda: 82.3GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 32.3kB 197MB 197MB primary ext3 boot
2 197MB 15.2GB 15.0GB primary ext3
3 15.2GB 16.2GB 1003MB primary linux-swap
4 16.2GB 82.3GB 66.1GB extended
5 16.2GB 16.3GB 107MB logical ext3
6 16.3GB 26.8GB 10.5GB logical ext3
7 26.8GB 41.8GB 15.0GB logical fat32 lba
8 41.8GB 51.8GB 10.0GB logical ext3
9 51.8GB 82.3GB 30.5GB logical ext3
Information: Don't forget to update /etc/fstab, if necessary.
在这个例子中,可以轻易的确定 Linux的交换分区。/boot 分区通常很小,而且配置于第一块硬盘(通常标签为 boot),同常是 /dev/sda1。
对于简单的分区方案是很容易的。当你有很多分区时就会变的很复杂。你应该总是有一些文件可以清楚地识别文件系统的分区表:
# fdisk -l /dev/hdaDisk /dev/hda: 26.8 GB, 26843545600
255 heads, 63 sectors/track, 3263 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 268 2048287+ b Win95 FAT32
/dev/hda3 269 396 1028160 83 Linux
/dev/hda4 397 3263 23029177+ f Win95 Ext'd (LBA)
/dev/hda5 397 1097 5630751 83 Linux
/dev/hda6 1098 1734 5116671 83 Linux
/dev/hda7 1735 1989 2048256 83 Linux
/dev/hda8 1990 2244 2048256 83 Linux
/dev/hda9 2245 2372 1028218+ 83 Linux
/dev/hda10 2373 2499 1020096 82 Linux swap
/dev/hda11 2500 2626 1020096 83 Linux
/dev/hda12 2627 2753 1020096 83 Linux
/dev/hda13 2754 2880 1020096 83 Linux
/dev/hda14 2881 3007 1020096 83 Linux
/dev/hda15 3008 3134 1020096 83 Linux
/dev/hda16 3135 3236 1020096 83 Linux
在这个例子中,可以轻易的确定 Linux的交换分区。/boot 分区通常很小,而且配置于第一块硬盘(通常标签为 boot),同常是 /dev/hda1。
然而,这只是猜测;有时一些实验可能需要这样。例如,将 /dev/hda2 挂载到一个空目录,你可以检查其文件内容是否与 /boot 下内容相符。
e2label
基于前面 fdisk -l 的输出结果,你可能还需要一点帮助来确定与各个分区相关的文件系统。 e2label 能够帮助你。
当你建立一新的文件系统时,为将分区添加一个标签。例如,下面的命令回告诉你 /usr 文件系统挂载在 /dev/hda5 上。
# e2labelUsage: e2label device [newlabel]
# e2label /dev/hda5
/usr
dumpe2fs
你可以使用 dumpe2fs 获得更多分区的信息,如下:
[root@dyq ~]# dumpe2fs /dev/sda1 |more
dumpe2fs 1.40.2 (12-Jul-2007)
Filesystem volume name: /boot1
Last mounted on: <not available>
Filesystem UUID: 6aa23bab-c3c2-4536-b274-a45594ffd3b5
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype n
eeds_recovery sparse_super
Filesystem flags: signed directory hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 26104
Block count: 104388
Reserved block count: 5219
Free blocks: 89433
Free inodes: 26072
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 256
Blocks per group: 8192
Fragments per group: 8192
--More--
dumpe2fs 不仅完成了 e2label的工作,还能告诉你分区的格式,是否有日志以及块的大小。进一步通过输出,你可以找到备份超级块的位置,
这能帮助你使用 fsck 或 e2fsck 命令为 Linux选择合适的超级块。
在工作中
fsck 是 e2fsck 的前端程序,用来检查分区格式化的ext2和ext3文件系统。
文件系统检测
你同样要知道如何使用 fsck 命令。这条命令是 Linux 下大多数文件系统格式的前端处理程序,如:ext2、ext3、reiserfs、vfat等等。
这条命令用了检测分区上文件系统的一致性。要想高效的使用 fsck 命令,你需要知道文件系统是如何在分区上设置的。
当你在 Linux 下使用 mkfs 命令格式化磁盘分区时,它分配一定的空间来存储 inodes(节点),这是数据的结果,包括磁盘上数据所在位置的块地址。
mkfs 命令同样将文件系统大小、标签和节点数量存储在分区开始的一个特殊地方,叫做 superblock(超级块)。如果超级块被损坏,
则磁盘上保存的信息将不可读。因为超级块对磁盘数据的完整性是至关重要的,mkfs 命令制作两个超级块的副本,放在分区上固定间隔的地方,
你可以用前面提到的 dumpe2fs 命令找到它们。
fsck 命令能够通过一致性检查修复文件系统的错误,即查找如虽然闲置但被表明在使用的磁盘块,不具备相应目录选项的节点,
错误连接数的节点和其他问题。fsck 命令同样可以修复超级块的错误。如果 fsck 因修复超级块失败,
你可以使用 -b 参数指定另外一个超级块。例如,下面的命令利用存储在 8193 位置的超级块来检查 /dev/hda5 分区的一致性:
# fsck -b 8193 /dev/hda5
考试预览
了解磁盘和分区检测的关键命令和相关参数,如fdisk,e2label,dumpe2fs和 fsck。在你的测试电脑让,
使用这些命令检查你的分区(有些命令会损坏数据)。
文件损坏
你可能会发现一些关键的命令或文件被损坏,如 bash 或 init。如果是这样,一个解决办法是重新安装原 RPM 包。
例如,如果 init命令损坏或别移除,你可以重新安装 SysVinit RPM。
当你启动系统进入 linux rescue 环境时,你可能需要联系到网络以获得要安装的 RPM。
那么你需要根据前面描述的在进入 linux rescue 环境时设置启动网络。假设 /bin/bash 命令被损坏或丢失需要重置。这样的话,
参考下面的步骤:
1、运行 df 命令。你应该能看到 linux rescue 环境挂载了你的分区。
2、如果可以,挂载网络资源。如果在 server.example.com 系统上的 /inst 目录提供 NFS 共享,你可以使用下面的命令将其挂载到 /mnt 目录下。
# mount -t nfs server.example.com:/inst /mnt/source
3、从 /mnt 目录下复制 bash RPM。这不是必须的,但可以帮助你应付网络连接丢失。使用下面命令:
# cp /mnt/source/Server/bash-*.rpm .
4、安装 bash RPM,注意安装到当前的文件:
# rpm -Uvh --force --root=/mnt/sysimage bash-*.rpm
5、运行 chroot 命令,进入标准目录树:
# chroot /mnt/sysimage
6、检查 bash命令状态。
# rpm -Vf /bin/bash
如果你没有看到输出,那么这可能不是 bash 命令的问题了。(你可以在启动时使用这个命令以确定是否存在问题。)在文件解决后,
你现在应该使用 exit 命令两次来重启你的计算机。
网络服务问题
Red Hat考试指南中提到,你要在 RHCE 考试的排错和系统维护部分能够“diagnose and correct problems with network services”。
有一些服务你需要在安装与配置部分进行配置。例如下面的案例与解决方案。不用说,解决方案还远远没有完成,
例如:防火墙和网络配置的问题可能阻止对任何网络服务的访问。
案例<---------->解决方案
1、连接本地 Web服务器,返回 404 文件没有找到错误。
确定在 DocumentRoot目录下有合适的 index.html,以及 index.html的 SELinux权限与 ls -Z/var/www/html命令输出一致。
2、你无法在远程系统上连接到 Samba的家目录。
检查 /etc/samba/smb.conf 文件中的 [homes] 共享设置。使用 testparm 来检查配置文件的错误。
3、你不能连接到远程 NFS 共享。
确定 /etc/exports 中有相应目录,并用 showmount -e hostname 命令检查相应服务是否运行。
4、你不能用匿名用户登录远程 FTP 服务器。
确定 /etc/vsftpd/vsftpd.conf 中匿名用户访问启用。
5、你无法联系到 Web代理服务器。
确定 /etc/squid/squid.conf 中允许对正确网络的相应访问。
6、无法通过本地网络服务器想外发送 e-mail。
确定送出的邮件服务器(sendmail 或 Postfix)被激活和适当配置。
7、你无法通过本地网络接收 POP3 e-mail。
确定 Dovecot 服务配置文件 /etc/dovecot.conf 被适当配置。如果你使用了其他的服务,配置相应的文件。
8、你想限制指定用户对 SSH 访问。
在 /etc/ssh/sshd_config 中使用 AllowUsers 选项。
添加、移除和调整逻辑卷大小
首先使用 lvdisplay,pvdisplay和vgdisplay 命令检查当前 LVs(逻辑卷),PVs(物理卷)和VGs(卷组)的当前状态。
这些命令利用 mount 命令和 /etc/fstab 文件内容以确定当前挂载的 LVs(逻辑卷)的配置。
添加逻辑卷
如果你要添加一个 LV,但你的 PV/VGs 没有相应的空余空间,你需要使用 fdisk 或 parted 命令建立新的分区并配置相应的分区格式。
这一节检测了添加一个 LV的过程。如果你的现有 PVs 或 VGs有空间,你可以略过前面的步骤,快速的添加 LV。
使用 pvcreate 命令在配置好的分区上建立新的 PV。例如,如果你为此建立了 /dev/hda9 和 /dev/hda10,使用下面命令:
# pvcreate /dev/hda9 /dev/hda10
反之,这中情况你可以使用 pvremove 命令完成:
# pvremove /dev/hda9 /dev/hda10
如果你已经将空间分配给了某个 LV,pvcreate 命令会返回错误消息。
使用 vgcreate命令,从一个或多个未使用的 PV上建立一个新的 VG。例如,你想从前面提到的 PVs建立名为 myvg 的 VG,使用下面命令:
# vgcreate myvg /dev/hda9 /dev/hda10
如果命令正常工作,你会在 /dev/myvg 找到 VG 设备。
使用 lvcreate 命令从可用的 VG 上建立一个新的 LV。例如,你要从 myvg VG上建立一个 1000MB 的新 LV,运行下面命令:
# lvcreate -L 1000 myvg
在输出中你会看到新 LV的名字,通常类似与 lvo10。这种情况下,LV 设备为 /dev/myvg/lvol0。
扩展一个逻辑卷
扩展一个 LV的空间需要2个步骤。首先,在空余空间上扩展 LV,可能是你新建立的 PV。然后,用 resize2f 扩展 LV 上的文件系统。
要扩展一个已有的 LV,使用 lvextend 命令。你需要一个拥有可用闲置空间的PV,如 /dev/sda2。
例如,如果你想将前面提到的 LV 大小增加 500MB,使用下面命令:
# lvextend -L +500 /dev/myvg/lvol0 /dev/sda2
你可以用 resize2fs 命令更改 ext2或 ext3格式的文件系统。对于提到的设备,命令为:
# resize2fs /dev/myvg/lvol0
如果你想缩小 LV的大小,那么过程比较复杂。这里没有类似于 resize2fs 命令来减小格式化文件系统。
你需要卸载 LV,并在最后使用 resize2fs 命令更改 LV 设备文件大小。
移除逻辑卷
移除一个逻辑卷很简单;只要 LV的数据被存储,lvremove命令能很好的工作。例如,如果你要已经在相同 VG下建立了第二个LV,使用下面命令:
# lvremove /dev/myvg/lvol1
诊断与 SELinux相关的网络服务错误
对 RHCE 考试的排错和系统维护部分的最后项目,
在Red Hat考试指南描述为“iagnose and correct networking services problems where SELinux contexts are interfering with proper operation”。
在大多数情况下,这比看起来简单。SELinux 将日志信息使用 avc标签存储在 /var/log/messages 中。
更好的是, Setroubleshoot能够确定 SELinux问题,并给出建议。查看它的建议命令,
如用 chcon 更改 SELinux内容和用 sesetbool 设定 SELinux 布尔值。
你所要做的就是在图形界面用 sealert -b 命令打开浏览器,并浏览最近的错误信息。