在处理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

  1. chroot /mnt/sysp_w_picpath 

  2. 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.

 (五)查看系统性能状况

  1. 查看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