分析和排查系统故障
分析和排查系统故障
1. 分析日志文件
1.1主要日志文件
v日志的功能
■ 用于记录系统、程序运行中发生的各种事件
■ 通过阅读日志,有助于诊断和解决系统故障
v日志文件的分类
■ 内核及系统日志
● 由系统服务syslog统一进行管理,日志格式基本相似
■ 用户日志
● 记录系统用户登录及退出系统的相关信息
■ 程序日志
● 由各种应用程序独立管理的日志文件,记录格式不统一
#日志文件是用于记录Linux系统中各种运行消息的文件,相当于Linux主机的“日记”
#日志文件对于诊断和解决系统中的问题很有帮助,系统一旦出现问题时及时分析日志就会“有据可查”。此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹
#不同的日志文件记载了不同类型的信息,例如Linux内核消息、用户登录记录、程序错误等等
v日志保存位置
■ 默认位于:/var/log 目录下
v主要日志文件介绍
➣ /var/log/messages:记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。
➣ /var/log/cron:记录crond计划任务产生的事件信息。
➣ /var/log/dmesg:记录Linux系统在引导过程中的各种事件信息。
➣ /var/log/maillog:记录进入或发出系统的电子邮件活动。
➣ /var/log/lastlog:记录每个用户最近的登录事件。
➣ /var/log/rpmpkgs:记录系统中安装的各rpm包列表信息。
➣ /var/log/secure:记录用户认证相关的安全事件信息。
➣ /var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。
➣ /var/run/btmp:记录失政的、错误的登录尝试及验证事件。
1.2 日志文件分析
内核及系统日
v由系统服务 syslogd 统一管理
■ 软件包:sysklogd-1.4.1-39.2
■ 主要程序:/sbin/klogd、/sbin/syslogd
■ 配置文件:/etc/syslog.conf
[root@localhost ~] # grep -v "^#" /etc/syslog.conf | grep -v ^$ *.info;mail.none;authpriv.none;cron.none /var/log/messages authpriv.* /var/log/secure mail.* -/var/log/maillog cron.* /var/log/cron …… |
由sysklogd软件包提供了klogd、syslogd两个程序,分别用于记录系统内核的消息和各种应用程序的消息
在 /etc/syslog.conf 配置文件中,配置记录的格式如下(具体参考 man syslog.conf):
设备类别.日志级别 日志消息发送位置
如果需要在同一行中设置多个“设备.级别”组合,每组之间用分号隔开。
发送位置可以是本机的用户名; “-/var/log/maillog” 中前面的”-“号表示每次记录日志时并不马上进行数据同步
v日志消息的级别(数字等级越小,优先级越高,消息越重要)
➣ 0 EMERG(紧急):会导致主机系统不可用的情况
➣ 1 ALERT(警告):必须马上采取措施解决的问题
➣ 2 CRIT(严重):比较严重的情况
➣ 3 ERR(错误):运行出现错误
➣ 4 WARNING(提醒):可能会影响系统功能的事件
➣ 5 NOTICE(注意):不会影响系统但值得注意
➣ 6 INFO(信息):一般信息
➣ 7 DEBUG(调试):程序或系统调试信息等
v日志记录的一般格式
[root@localhost ~] # tail -5 /var/log/messages Sep 14 11:22:44 localhost kernel: sdb: cache data unavailable Sep 14 11:22:44 localhost kernel: sdb: assuming drive cac he: write through Sep 14 11:22:44 localhost kernel: sdb: sdb1 Sep 14 11:23:37 localhost kernel: VFS: Can't find ext3 filesystem on dev sdb1. Sep 14 16:54:48 localhost NetworkManager: <information> starting... |
#内核及系统日志文件中的每一行表示一条消息,每个消息由4个字段的固定格式组成:
➣ 时间标签:消息发出的日期和时间
➣ 主机名:生成消息的计算机的名字
➣ 子系统名称:发出消息的应用程序名称
➣ 消息:消息的具体内容
用户日志分析
v保存了用户登录、退出系统等相关信息
■ /var/log/lastlog:最近的用户登录事件
■ /var/log/wtmp:用户登录、注销及系统开、关机事件
■ /var/run/utmp:当前登录的每个用户的详细信息
■ /var/log/secure:与用户验证相关的安全性事件
v分析工具
■ users 、who、w、last、lastb
#除了 /var/log/secure 文件以外,其他三个用户日志文件都是二进制的数据文件,无法直接使用tail、less等文本查看工具浏览。因此,分析用户登录相关信息通常需要借助专门的命令工具
user命令简单输出当前登录的用户名称和会话数
[root@sky ~] # users xiaoqi root root root <==root用户打开了3个终端 who命令显示当前登录到系统的每个用户信息,包括用户名、终端类型、登录日期及远程主机
[root@sky ~] # who root pts/0 2015-05-26 09:27 (172.16.1.22) root tty1 2015-05-26 10:49 (:0) W命令显示当前系统中每个用户及其所运行的进程信息
|
[root@sky ~]
# w
10:51:02 up 1:25, 2 users, load average: 0.32, 0.18, 0.07
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 172.16.1.22 09:27 0.00s 0.33s 0.09s w
root tty1 :0 10:49 ? 1.94s 1.94s /usr/bin/Xorg :0
-nr
-verbose
-audit
4
-auth
/var/run/gdm/auth
-for
-gdm
-M8zl8n/database
-noli
last查询成功登陆到系统的用户记录,最近登录的显示在最前面
[root@sky ~] # last root tty1 :0 Tue May 26 10:49 still logged in root pts/0 172.16.1.22 Tue May 26 09:27 still logged in reboot system boot 2.6.32-358.el6.x Tue May 26 09:25 - 10:54 (01:28) root pts/0 172.16.1.22 Mon May 25 15:16 - 20:51 (05:34) reboot system boot 2.6.32-358.el6.x Mon May 25 15:16 - 10:54 (19:37) root pts/0 172.16.1.22 Mon May 25 10:01 - down (05:14) reboot system boot 2.6.32-358.el6.x Mon May 25 10:01 - 15:16 (05:14) lastb命令查询登录失败的用户记录,比如用户名、密码错误等情况
|
[root@sky ~] # lastb root ssh:notty 172.16.1.22 Fri May 22 17:26 - 17:26 (00:00) btmp begins Fri May 22 17:26:31 2015 |
程序日志分析
v由相应的应用程序独立进行管理
■ Web服务:/var/log/httpd/
● access_log、error_log
■ 代理服务:/var/log/squid/
● access.log、cache.log、squid.out、store.log
■ FTP服务:/var/log/xferlog
v分析工具
■ 文本查看、grep过滤检索、Webmin管理套件中查看
■ awk、sed等文本过滤、格式化编辑工具
■ Webalizer、Awstats等专用日志分析工具
日志管理策略
v及时作好备份和归档
v延长日志保存期限
v控制日志访问权限
■ 日志中可能会包含各类敏感信息,如账户、口令等
v集中管理日志
■ 便于日志信息的统一收集、整理和分析
■ 杜绝日志信息的意外丢失、恶意篡改或删除
v应用示例:
■ 调整syslogd服务设置,建立集中管理的日志服务器
■ 将客户机B中crond服务产生的日志消息,自动发送到服务器A的/var/log/cron文件中

注意在主机A、B中所配置的是不同的文件:—— 在A中是 “/etc/sysconfig/syslog” ,在B中是 “/etc/syslog.conf”
A、B中都需要重新加载系统服务syslog,例如执行:service syslog reload
服务器A关于SYSLOGD_OPTIONS参数设置的解释(可以通过man syslogd 查看手册页):
“-r”选项 表示允许接收其他主机发送过来的日志记录
“-x”选项 表示不进行DNS域名解析
“-m”选项 表示记录日志时的时间标记间隔(设为0禁用该功能)
2.排除系统启动类故障
2.1 MBR扇区故障
MBR引导记录位于物理硬盘的第1个扇区(512B),该扇区又称为主引导扇区(MBR扇区),除了包含系统引导程序的部分数据以外,还包含了整个硬盘的分区表记录,当主引导扇区发生故障时,将可能无法进入引导菜单,或者因无法找到正确的分区位置而无法加载系统,通过该硬盘引导主机时很可能进入黑屏状态,下面将通过示例介绍MBR扇区进行备份、模拟破坏,修复的过程。
修复MBR扇区故障
v故障原因
■ 病毒、木马等造成的破坏
■ 不正确的分区操作、磁盘读写误操作
v故障现象
■ 找不到引导程序,启动中断
■ 无法加载操作系统,开机后黑屏
v解决思路
■ 应提前作好备份文件
■ 以RHEL5安装光盘引导进入急救模式
■ 从备份文件中恢复
常见的系统启动类故障包括:MBR扇区故障、GRUB引导故障、丢失系统文件、遗忘root密码……
MBR即Master Boot Record,主引导记录,位于硬盘的第一个扇区(512字节),其中包含了系统引导程序、硬盘分区表信息
如果没有MBR的备份文件,恢复难度会比较大,可能需要使用“诺顿磁盘医生(Norton Disk Doctor)”之类能够按分区位置查找修复的磁盘工具
应用示例
1.备份MBR扇区数据
由于MBR扇区中包含整个硬盘的分区表记录,因此该扇区的备份文件必须存放到其他的存储设备中,否则在恢复时将无法读取到备份文件。例如执行以下操作可以将第1块硬盘(sda)的MBR扇区备份到第2块硬盘的sdb5分区中(挂载到/backup目录)。
[root@sky ~] # mkdir /backup [root@sky ~] # mount /dev/sdb5 /backup/ [root@sky ~] # dd if=/dev/sda of=/backup/sda.mbr.bak bs=512 count=1 |
2.模拟MBR被破坏的故障
这里仍然使用dd命令,人为地将MBR扇区的记录覆盖,以便模拟出MBR扇区被破坏的故障情况(切记要先做好备份,而且将备份文件存放到其他硬盘)。列如执行以下操作可以从设备文件zero中读取512字节的数据,将其覆盖到第1块硬盘(sda),从而破坏MBR扇区中的数据。
[root@sky ~] # dd if=/dev/zero of=/dev/sda bs=512 count=1 [root@sky ~] # reboot |
完成上述操作后重启系统,将会出现“Operating system not found"的提示信息,表示无法找到可用的操作系统,因此无法启动主机。

3.RHEL5光盘引导,进入急救模式
由于MBR扇区被破坏以后,已经无法再从该硬盘启动系统,所以需要使用其他硬盘中的操作系统进行引导,或者直接使用RHEL5系统的安装光盘进行引导。不管使用哪种方式,目的都是相同的——获得一个可以执行命令的Shell环境以便从备份文件中恢复MBR扇区中的数据。
以使用RHEL5安装光盘引导为例,当出现安装向导的”boot:“提示符时,在后边输入"linux rescue"并回车将以"急救模式"引导光盘中的Linux系统,之后依次按回车键接收默认的语言,键盘格式,提示是否配置网卡时一般选择”No“,然后系统会自动查找硬盘中的Linux分区并尝试将其挂载到”/mnt/sysimage"目录(选择''Continue"确认并继续)。接下来会出现是否初始化磁盘的警告窗口,建议选择“NO”,避免对硬盘数据造成不必要的损坏。
最后选择“0K”确认后将进入到带“sh-4.1#"提示符的Bash Shell环境,只要执行相应的命令挂载保存有备份文件的硬盘分区(sdb5)并将数据恢复到硬盘"/dev/sda"中即可。需要注意的是,当前使用的系统环境是光盘中的Linux目录结构。
4.从备份文件中恢复MBR扇区

完成操作后,执行”exit“命令退出临时Shell环境,然后重启系统。
MBR扇区的备份文件应保存在不同的磁盘中,否则在恢复时将无法读取备份文件
在恢复之前,需要将包含备份文件的分区挂载到一个临时目录,以便能够读取到备份文件
在dd命令工具的强大功能的同时,注意强调要慎重使用,稍有操作失误则可能导致对硬盘数据的灾难性破坏
2.2 GRUB引导故障
修复GRUB引导故障
v故障原因
■ MBR中的GRUB引导程序遭到破坏
■ grub.conf文件丢失、引导配置有误
v故障现象
■ 系统引导停滞,显示“grub>”提示符
v解决思路
■ 尝试手动输入引导命令
■ 进入急救模式,从备份中恢复 grub.conf
■ 向MBR扇区中重建grub程序
GRUB是大多数Linux系统默认使用的引导程序,可以通过启动菜单的方式选择进入不同的操作系统(如果有的话) 当配置文件/boot/grub/grub.conf丢失,或者关键配置出现错误,或者MBR记录中的引导程序遭到破坏时,Linux主机启动后可能只出现“grub”的提示符,无法完成进一步的系统启动过程,如图所示。

如果在该提示符后可以进行编辑,则通过输入对应的引导命令(可参考其他相同版本RHEL系统中/boot/grub/grub.conf文件的引导语句),然后再执行“boot”命令即可正常引导Linux系统。
这是CentOS6.4系统中正常的grub.conf引导文件
[root@sky ~]
# grep -v "^#" /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-358.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_sky-lv_root rd_LVM_LV=vg_sky/lv_root rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=vg_sky/lv_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-358.el6.x86_64.img
v应用示例1:
■ 在“grub>”提示符后,手动输入引导命令
■ 成功进入系统后,恢复或重建 grub.conf 配置文件
grub> root (hd0,0) grub> kernel /vmlinuz-2.6.18-8.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet grub> initrd /initrd-2.6.18-8.el5.img grub> boot |
[root@localhost ~] # cd /boot/grub/ [root@localhost ~] # cp grub.conf.bak grub.conf <==从备份文件恢复 |
此例子适用于丢失 grub.conf 配置文件的情况,可以在正常系统中将 grub.conf 文件改名,然后重启主机后进行演示
上述手动引导系统的grub命令,可以参考正常系统中的 grub.conf 配置文件,其中:
root (hd0,0) 指定包含内核等引导文件的分区(即/boot分区),(hd0,0) 对应为 /dev/sda1
kernel …… 指定内核文件所在的路径、根分区所在的设备位置
initrd …… 指定引导过程中使用的缓存盘镜像文件位置
boot 用于启动进入系统
v应用示例2:
■ 进入急救模式,从备份文件中恢复 grub.conf 文件
■ 向MBR扇区中重建GRUB程序
sh-3.1 # chroot /mnt/sysimage sh-3.1 # cd /boot/grub/ sh-3.1 # cp grub.conf.bak grub.conf sh-3.1 # grub-install /dev/sda |
/mnt/sysimage 为临时挂载的待修复的Linux系统根目录
“grub-install /dev/sda”操作适用于GRUB程序已被破坏的情况(例如重装Windows系统后),如果正常则不用修复
2.3 /etc/inittab文件丢失
v故障原因
■ inittab文件被误删除,或者存在配置错误
v故障现象
■ 启动中提示 “... INIT: No inittab file found”
■ 系统停滞,无法完成初始化
v解决思路
■ 进入急救模式,从备份文件中恢复
■ 或者,在急救模式中重新安装 initscripts 软件包
● rpm -ivh --replacepkgs initscripts-8.45.14.EL.i386.rpm
#rpm命令的 --replacepkgs 选项表示进行替换(覆盖)安装,即使系统中已经安装了这个包
2.4 遗忘root用户密码
v故障原因
■ 遗忘root用户的密码
v故障现象
■ 无法进行需要root权限的管理操作
■ 若没有其他可用帐号,将无法登录系统
v解决思路
■ 引导进入单用户模式,然后重设密码
● grub > kernel ... single 或 s 或 1
■ 或进入急救模式,然后重设密码
通过单用户模式重设root账号的密码
(1)重新启动主机,在出现GRUB菜单时按↑,↓箭头键取消倒计时,并定位到要进入的操作系统选择项(如“RedHat Enterprise Linux Server”),按e键进入编辑模式。
(2)定位到以kernel开头的一行并按e键,在行尾添加”single“的启动参数,“single”也可以换成字母“s”或者数字"1",也可以表示进入到单用户模式。
(3)回车确认后,按b键将系统引导进入单用户模式,直接进入Shell环境(不需要任何密码验证) 。
(4)在单用户模式的Shell环境中,可以执行“passwd root”命令重新设置root用户的密码。
通过急救模戈重设root账号的密码
若使用RHEL5的安装光盘进入急救模式的Shell环境,则只需切换到待修复Linux系统的根目录环境,直接执行”passwd root“命令重设密码即可。
sh-4.1
# chroot /mnt/sysimage
sh-4.1
# passwd root
3. 排除文件系统类故障
3.1修复文件系统
v故障原因
■ 非正常关机、突然断电、设备读写失误等
■ 文件系统的超级块(super-block)信息被破坏
v故障现象
■ 无法向分区中读取或写入数据
■ 启动后提示“Give root password for maintenance”
v解决思路
■ 根据提示输入root口令,进入修复状态
■ 使用fsck命令进行修复
v应用示例:
■ 模拟对/dev/sdb1分区的破坏操作
● dd if=/dev/zero of=/dev/sdb1 bs=512 count=4
■ 检查是否能挂载该分区
● 报错:mount: you must specify the filesystem type
■ 对/dev/sdb1分区进行修复
● fsck –y -t ext3 /dev/sdb1
■ 再次挂载该分区
Linux系统开机后,当提示“Give root password for maintenance”时,只需输入root用户的密码,即可进入到一个临时的Shell环境,用户可以对出现错误的文件系统进行修复
必要时可以执行“dd if=/dev/zero of=/dev/sdb7 bs=512 count=4”命令模拟文件系统故障,然后演示修复过程
fsck命令的 “-y”选项可以在出现交互提问时,自动按“yes”处理
3.2 磁盘资源耗尽故障
v故障原因
■ 磁盘空间已被大量的数据占满,空间耗尽
■ 虽然还有可用空间,但文件数i节点耗尽
v故障现象
■ 无法写入新的文件,提示“… : 设备上没有空间”
■ 部分程序无法运行,甚至系统无法启动
v解决思路
■ 清理磁盘空间,删除无用、冗余的文件
■ 转移或删除占用大量i节点的琐碎文件
■ 进入单用户模式、急救模式进行修复
■ 为用户设置磁盘配额
检测磁盘坏道
v故障原因
■ 磁盘设备中存在坏道(逻辑的或物理的)
v故障现象
■ 读取磁盘中的数据时,磁盘设备发出异常声响。
■ 访问磁盘中的某个文件时,反复读取且出错,提示文件损坏。
■ 对于新建立的分区无法完成格式化。
■ 系统使用该磁盘时频繁死机
逻辑坏道主要由于软件操作不当造成,可以使用软件修复
物理坏道是物理性损坏,只能通过更改磁盘分区或扇区的占用位置来进行改善,排除掉包含有坏块的磁盘空间
注意是mkfs命令而不是fsck命令,检查坏道之前,应尽量先卸载该分区,退出正在访问设备的其他程序
v解决思路
■ 检测硬盘中是否存在坏道
■ 修复硬盘,或更换新的硬盘
root@localhost ~] # badblocks -sv /dev/sdb Checking blocks 0 to 20971520 Checking for bad blocks (read -only test): 5192832/ 20971520 Pass completed, 0 bad blocks found. |