在处理Linux系统出现的各种故障时,故障的症状是最先发现的,而导致这以故障的原因才是最终排除故障的关键。熟悉Linux系统的日志管理,了解常见故障的分析与解决办法,将有助于管理员快速定位故障点。“对症下药”及时解决各种系统问题。
(一)日志分析及管理
◆ 日志文件是用于记录Linux系统中各种运行消息的文件,对于诊断和解决系统中的问题很有帮助。在Linux系统中,日志文件包括三种类型:
1.内核及系统日志:这种日志数据由系统服务syslog统一管理,根据其主配置文件"/etc/syslog.conf"中的设置决定将内核消息及各种系统程序消息记录到什么位置。系统中有相当一部分程序会把自己的日志文件交由syslog管理,因而这些程序使用的日志记录也具有相似的格式。
2.用户日志:这种日志数据用于记录Linux系统用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。
3.程序日志:有些应用程序运会选择自己来独立管理一份日志文件(而不是交给syslog服务管理),用于记录本程序运行过程中的各种事件信息。由于这些程序只负责管理自己的日志文件,因此不同的程序所使用的日志记录格式可能会存在极大差异。
查看/var/log中的日志文件及目录
[root@localhost ~]# ls /var/log/
anaconda.ifcfg.log anaconda.xlog btmp-20170403 cups maillog messages-20170327 sa spooler wtmp
anaconda.log anaconda.yum.log ConsoleKit dmesg maillog-20170327 messages-20170403 samba spooler-20170327 yum.log
anaconda.program.log audit cron dmesg.old maillog-20170403 ntpstats secure spooler-20170403
anaconda.storage.log boot.log cron-20170327 dracut.log mcelog prelink secure-20170327 sssd
anaconda.syslog btmp cron-20170403 lastlog messages running.today secure-20170403 tallylog
◆日志文件分析
1.内核及系统日志:
主要由默认安装的syslogd-1.4.1-39.2软件包提供,该软件包安装了klogd、syslogd两个程序,并通过syslog服务进行控制,分别用于记录系统内核的消息和各种应用程序的消息。syslog服务所使用的配置文件为"/etc/syslog.conf"。通常情况下,内核及大多数系统消息都被记录到公共日志文件"/var/log/messages"中,而其他一些程序消息被记录到不同的文件中,日志消息还能够记录到特定的存储设备中,或者直接向用户发送。
在Linux内核中,根据日志消息的重要程度不同,将其分为不同的优先级别(数字等级越小,优先级越高,消息越重要)。
0 EMERG(紧急):会导致主机系统不可用的情况。
1 ALERT(警告):必须马上采取措施解决的问题。
2 CRIT(严重):比较严重的情况。
3 ERR(错误):运行出现错误。
4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。
5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。
6 INFO (信息):一般信息。
7 BEBUG(调试):程序或系统调试信息等。
查看/var/log/messages最后两行
[root@localhost ~]# tail /var/log/messages
Apr 3 17:40:01 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1458" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
2.用户日志:
在wtmp、utmp、lastlog等日志文件中,保存了系统用户登录,退出等相关事件的事件消息。但是这些文件都是二进制的数据文件,不能直接使用tail、less等文本查看工具进程浏览,需要使用who、w、users、last和ac等用户查询命令来获取日志信息。
who、w命令用于查询utmp文件,显示当前登陆的每个用户的详细信息
last、ac命令用于查询wtmp文件,显示每个用户登录、注销及系统启动和停机事件
ac -d 某用户按天数统计
ac -p 统计各用户的总连接时间
[root@localhost ~]# ac -d root
Mar 22 total 5.31
Mar 23 total 16.23
Mar 24 total 20.03
Mar 25 total 52.38
Mar 27 total 9.80
Mar 28 total 2.76
Mar 29 total 7.46
Mar 30 total 30.43
Mar 31 total 7.23
Apr 1 total 45.53
Apr 3 total 7.10
Today total 1.62
[root@localhost ~]# ac -p
root 205.87
total 205.87
3.程序日志:
在Linux系统中,还有相当一部分应用程序并没有使用syslog服务来管理日志。而是由程序自己维护日志记录。
鉴于日志数据资料的重要性,对于系统运行过程中产生的各种日志文件,必须采用有针对性的管理策略,以确保日志数据的准确性、安全性和真实性。一般来说,可以从以下几个方面进行考虑。
1.日志备份和归档:日志文件也是重要的数据资料,同样需要进行备份和归档。
2.延长日志保存期限:在存储空间富裕的情况下,日志数据保留的时间应尽可能长。
3.控制日志访问权限:日志数据中可能会包含各类敏感信息,如:账号、口令等。所以需要严格控制其访问权限。
4.集中管理日志:使用集中的日志服务器管理各服务器发送的日志记录等。其好处在于方便对日志的收集、整理和分析,杜绝意外的丢失、恶意篡改或删除等。
(二)系统启动类故障排除
◆MBR扇区故障
MBR引导记录位于物理硬盘的第一个扇区(512个字节),包含系统引导程序的部分数据和整个硬盘的分区表记录。当主引导扇区发送故障时,将可能无法进入主引导菜单,或者因无法找到正确的分区位置而无法加载系统,通过该硬盘引导主机时很可能进入黑屏状态。
1.备份MBR扇区数据
使用dd命令备份
2.模拟MBR扇区故障
使用dd命令,将MBR扇区的记录覆盖
3.从备份文件中恢复MBR扇区数据
以使用RHEL5安装光盘引导为例,当出现安装向导的:“boot”提示符时,在后边输入“linux rescue‘并回车,将以”急救模式“引导光盘中的Linux系统。之后一次按回车键接受默认的语言、键盘合适,提示是否配置网卡时一般选择”No’,然后系统会自动查看硬盘中的Linux分区并尝试将其挂载到"/mnt/sysp_w_picpath"目录(选择“Continue”确认并继续)。接下需要特别输液椅:当出现是否初始化磁盘的警告窗口时如:
一定要选择"No",以免对硬盘数据造成进一步损坏。
最好选择“OK”确认后进入到带"sh-3.1#"提示符的Bash Shell环境,只要执行相应的命令挂载保存有备份文件的硬盘文件(sdb1),并将数据恢复到硬盘"/dev/sda"中即可。需要注意的是,当前使用的系统环境是光盘中的Linux目录结构。
◆GRUB引导故障
同样使用RHEL5的安装光盘进入急救模式,如果分区表并未被破坏,则急救模式将会找到硬盘中的Linux根分区,并将其挂载到光盘目录结构中的"/mnt/sysp_w_picpath/"文件夹中。
进入"sh-3.1"的Shell环境以后,执行"chroot /mnt/sysp_w_picpath"命令可以将目录结构切换到待修复的Linux系统中。然后重新建立新的grub.conf配置文件即可。
正常主机中的grub.conf文件
[root@localhost ~]# cat /boot/grub/grub.conf
...
default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-573.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-573.el6.x86_64.img
如果是MBR扇区中的引导程序出现损坏,可能在重建grub.conf配置文件后仍然无法成功启动系统,这时候可以在救援模式的Shell环境重新安装grub
- chroot /mnt/sysp_w_picpath
- grub-install /dev/sda
◆/etc/inittab文件丢失
在急救模式的"sh-3.1#"环境中挂载RHEL5光盘设备,并重新安装initscript软件包,结合rpm 命令的"--replacepkgs"选项用于替代现有文件。
◆/etc/fstab文件丢失
在急救模式的Shell环境中扫描逻辑卷组,激活逻辑卷,以便找到根分区设备,然后手动挂载根分区,并重建fstab配置文件。
lvm vgscan 查找逻辑卷
lvm vgchange -ay /dev/VolGroup00 激活找到的逻辑卷
mkdir /tmpdir
mount /dev/VolGroup00/LogVol00 /tmpdir 挂载根分区到/tmpdir目录
vi /tmpdir/etc/fstab 重建fstab配置文件,或直接复制备份的文件
◆遗忘root用户的密码
1.通过单用户模式重设root账号的密码
2.通过急救模式重设root账号的密码
只需切换到待修复Linux系统的根目录环境,直接执行"passwd root"命令重设root用户的密码即可
(三)软件包类故障
◆rpm数据库损坏 rpm --rebuilddb 重建数据库
◆缺少*.so文件
当安装新程序时,如果提示缺少*.so文件,应首先使用find命令查找系统中是否存在对应文件,若不存在则表示提供该链接库的依赖软件并没有安装,需先获取相应的软件包并安装才行。若系统中已经存在对应的*.so文件,则通过修改ld.so.conf文件,添加新的库文件搜索路径,执行ldconfig命令,解决库文件搜索的问题
(四)文件系统、磁盘类故障
◆修复文件系统 fsck -yt
-t 指定文件系统类型,
-y 对发现的问题自动回答"yes"。
比较常见的是超级块(super-block)损坏。超级块是文件系统的核心"档案",他记录了该文件系统的类型、大小、空闲磁盘块等信息。
需要注意的是:如果该文件系统遭受破坏的情况很严重,则修复完毕后可能仍然会丢失一些数据,因此请慎重决定是否进行恢复(必要时也可以先用dd命令将损坏的分区进行备份)。
◆磁盘资源耗尽
1.模拟i节点耗尽故障
编写一个循环创建空文件的脚本程序,运行脚本直至耗尽i节点
2.修复i节点耗尽故障
找出占用大量i节点的细小文件,进行转移或删除
◆无法卸载已挂载的设备
用户或其他程序正在使用该设备的资源
fuser 找出正在使用某个设备或文件的用户
-m 指定相应的文件或目录
-v 显示详细信息
-k 终止该进程
[root@localhost ~]# fuser -mv /media/cdrom/
用户 进程号 权限 命令
/media/cdrom/: root 1 .rce. init
root 2 .rc.. kthreadd
root 3 .rc.. migration/0
root 4 .rc.. ksoftirqd/0
root 5 .rc.. stopper/0
...
◆检测磁盘坏道 badblocks
-s 用于显示进度信息
-v 用于显示详情
[root@localhost ~]# badblocks -sv /dev/sdb1
正在检查从 0 到 2104482的块
Checking for bad blocks (read-only test): 完成
Pass completed, 0 bad blocks found.
(五)查看系统性能状况
- 查看CPU负载
uptime命令
查看/proc/loadavg文件
[root@localhost ~]# uptime
17:56:12 up 52 min, 1 user, load average: 0.00, 0.00, 0.00
[root@localhost ~]# cat /proc/loadavg
0.00 0.00 0.00 1/101 2117
2.查看内存使用情况
vmstat 报告虚拟存储使用情况
free -m 显示物理内存和交换空间的使用情况
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 543912 29088 56084 0 0 26 3 19 16 0 0 99 0 0
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 727 196 531 0 28 54
-/+ buffers/cache: 112 614
Swap: 1471 0 1471
3.磁盘IO性能监控
使用iostat命令查看系统中磁盘的IO性能统计信息,该命令工具由sysstat软件包提供
-d 只输出磁盘数据
-t 输出时间,可以指定刷新信息的时间间隔
[root@localhost ~]# iostat
Linux 2.6.32-573.el6.x86_64 (localhost.localdomain) 2017年04月04日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.06 0.00 0.32 0.27 0.00 99.35
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.01 0.08 0.00 352 0
sda 1.09 40.75 4.99 171400 20994
sdb 0.12 0.71 0.00 2978 0
dm-0 2.44 38.44 4.97 161674 20920
dm-1 0.08 0.63 0.00 2648 0
dm-2 0.02 0.19 0.00 808 0
mpstat命令 用于统计进程负载
[root@localhost ~]# mpstat
Linux 2.6.32-573.el6.x86_64 (localhost.localdomain) 2017年04月04日 _x86_64_ (1 CPU)
18时52分12秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
18时52分12秒 all 0.04 0.00 0.20 0.23 0.00 0.07 0.00 0.00 99.46