在处理Linux操作系统出现的各种故障时,故障的症状是最容易发现的,但导致故障的原因才是最终排除故障的关键。熟悉Linux操作系统中常见的日志文件,了解一般故障的分析与解决办法,将有助于管理员快速定位故障点,“对症下药”,及时解决各种系统问题。

博文大纲:
一、分析日志文件;
二、排除系统启动类故障;
三、排除文件系统类故障;

一、分析日志文件

日志文件是用于记录Linux操作系统中各种运行消息的文件,相当于Linux主机的“日记”。不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。

日志文件对于诊断和解决系统中的问题很有帮助,因为在Linux操作系统中运行的程序通常会把系统消息和错误消息写入相应的日志文件,这样系统一旦出现问题就会“有据可查”,此外,当主机遭受 破坏时,日志文件还可以帮助寻找破坏 者留下别的痕迹。

1.主要日志文件

在Linux操作系统中,日志数据主要包括以下三种类型:

  • 内核及系统日志:这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置。 系统中有相当一部分程序会把自己的日志文件交由rsyslog管理,因而这些程序使用的日志记录也具有相似的格式;
  • 用户日志:这种日志数据用于记录Linux操作系统用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等;
  • 程序日志:有些应用程序会选择由自己独立管理一份日志文件(而不是交给rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。由于这些程序只负责管理自己的日志文件,因此不同程序所使用的日志记录格式可能会存在较大的差异;

Linux操作系统本身和大部分的服务器程序的日志文件都默认放在目录/var/log/下。一部分程序公用一个日志文件,一部分程序使用单个日志文件;而有些大型的服务程序由于日志文件不止一个,所以会在/var/log/目录中建立相应的子目录来存放日志文件,这样既保证了日志文件目录的结构清晰,又可以快速定位日志文件。有相当一部分日志文件只有root用户才有权限读取,这保证了相关信息的安全性。

对于Linux操作系统中的日志文件,有必要了解其各自的用途,这样才能在需要的时候更快地找到问题所在、及时地解决各种故障。

常见的一些日志文件,如图:
保证Linux系统安全之分析和排查系统故障

2.日志文件分析

分析日志文件的目的在于通过浏览日志查找关键信息,对系统服务进行调试,以及判断发生故障的原因等。

对于大多数文本格式的日志文件(如内核及系统日志、大多数的程序日志),可以使用tail、more、cat、less等命令进行查看,对于一些特殊的二进制的日志文件(如用户日志)则需要使用特定的查询命令。

(1)内核及系统日志

rsyslog服务所使用的配置文件为/etc/rsyslog.conf。

[root@localhost ~]# grep -v "^$" /etc/rsyslog.conf 
//过滤空行
# rsyslog configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
#### MODULES ####
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
                      ……………………                       //省略部分内容

从配置文件中可以看出,受rsyslog服务管理的日志文件都是Linux操作系统中主要的日志文件,它们记录了Linux操作系统中内核、用户认证、电子邮件、计划任务等基本的系统消息。在Linux内核中,根据日志消息的重要程度不同,将其分为不同的优先级别(数字越小,优先级越高,消息越重要)。如图:
保证Linux系统安全之分析和排查系统故障
内核及大多数系统消息被记录到公共日志文件/var/log/messages中,而其他一些程序消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者直接发送给指定用户。

对于rsyslog服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。以公共日志/var/log/messages文件的记录格式为例,其中每一行表示一条日志消息,每一条消息均包括以下四个字段:

  • 时间标签:消息发出的日期和时间;
  • 主机名:生成消息的计算机名称;
  • 子系统名称:发出消息的应用程序的名称;
  • 消息:消息的具体内容;

在有些情况下,可以设置rsyslog,使其在把日志信息记录到文件的同时将日志信息发送到打印机进行打印,这样无论网络 非法进入 者怎么修改日志都不能清除***的痕迹。rsyslog日志服务是一个常被 破坏 的的显著目标,破坏了它将管理员难以发现 非法进入 及相关信息,因此要特别注意监控其守护进程及配置文件。

(2)用户日志

在wtmp、btmp、lastlog等日志文件中,保存了系统用户登录、退出等相关的时间消息。但是这些文件都是二进制的数据文件,不能直接使用tail、less等文本查看工具进行浏览,需要使用who、w、users、last和lastb等用户查询命令来获取日志信息。

1)查询当前登录的用户情况——users、who、w命令

user命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那么他的用户名将显示与其相同的次数。操作如下:

[root@localhost ~]# users
(unknown) root root root

who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可以查看当前系统存在哪些不合法的用户,从而对其进行审计和处理。who的默认输出包括用户名、终端类型、登录日期及远程主机。操作如下:

[root@localhost ~]# who
(unknown) :0           2019-09-10 00:01 (:0)
root     tty2         2019-09-10 00:10
root     pts/0        2019-09-09 16:25 (192.168.1.253)
root     tty3         2019-09-09 16:42

w命令用于显示当前系统中的每个用户及其运行的进程信息,比users、who命令的输出内容更丰富一些,操作如下:

[root@localhost ~]# w
 16:49:29 up 48 min,  4 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCU WHAT
root     tty2                      00:10     ?     0.84s  0.84s -bash
root     pts/0    192.168.1.253    16:25    1.00s  0.10s  0.06s w
root     tty3                      16:42     ?     0.08s  0.03s -bash

2)查询用户登录的历史记录——last、lastb命令

last命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。

[root@localhost ~]# last
xiaoli   tty3                          Thu Sep 12 04:49   still logged in   
root     pts/0        192.168.1.253    Thu Sep 12 04:47   still logged in   
root     tty2                          Thu Sep 12 04:46   still logged in   

lastb命令用于查询登录失败的用户记录,如登录的用户名错误,密码不正确等情况都将记录下来。

[root@localhost ~]# lastb
xiaowang tty3                          Thu Sep 12 04:52 - 04:52  (00:00)    
xiaoli   tty3                          Thu Sep 12 04:52 - 04:52  (00:00)    

除了使用lastb命令以外,还可以查看安全日志/var/log/secure。查看日志文件可以使用webalizer、Awstats软件可以通过图形化查看日志,通俗易懂!

3)程序日志

在Linux操作系统中,还有相当一部分应用程序没有使用rsyslog服务来管理日志,而是由程序自己维护日志记录。例如:http网站服务等。不同应用程序i的日志记录格式差别很大,且没有严格使用统一的格式。

作为一名合格的系统管理人员,应该提高警惕,随时注意各种可疑状况,定期并随机检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志及用户登录日志记录等。在检查这些日志时,要注意是否有不和常理的时间或操作记录。

出现以下情况之一,就需要多加注意:

  • 用户在非常规的时间登录,或者用户登录系统的IP地址和往常的不一样;
  • 用户登录失败的日志记录,尤其是那些一再连续尝试进入系统失败的日志记录;
  • 非法使用或不正当使用超级用户权限;
  • 无故或者非法重新启动各项网络服务的记录;
  • 不正常的日志记录,如日志残缺不全,或者比如wtmp这样的日志文件无故缺少了中间的记录文件。

另外,需要管理人员注意的是,日志并不是完全可靠的,聪明的黑 客在进入系统后经过会打扫现场。所以管理人员需要综合运用以上的系统命令,全面、综合地进行审查和检测。切记不要断章取义,否则将会做出错误的判断。

二、排除系统启动类故障

Linux操作系统的启动过程涉及到MBR、GRUB启动菜单、系统初始化配置文件等各方面,其中任何一个环节出现故障都可能导致系统启动失常,因此一定要在注意好相关文件的备份工作。

1.MBR扇区故障

MBR扇区包括三部分:

  • 系统引导程序(GRUB引导菜单占用446字节);
  • 分区表(最多可以有四个主分区,每个分区占用16字节);
  • 扇区的结束标志占用2字节;

MBR位于物理硬盘的第一个扇区(512字节),该扇区又称为主引导扇区(MBR扇区),除了包含系统引导程序的部分数据外部分数据外,还包含整个硬盘的分区表记录。当主引导扇区发生故障时,将很有可能无法进入引导才散,或者无法找到正确的分区位置而无法加载系统,通过该硬盘引导主机时很可能进入黑屏、死机状态。

通过下面示例我们开始对MBR扇区进行备份、模拟破坏、修复的过程:

(1)备份MBR扇区数据

由于MBR扇区中包含了整个硬盘的分区表记录,因此该扇区的备份文件必须存放到其他的存储设备中,否则在恢复时将无法读取到备份文件。例如:

[root@localhost ~]# mkdir /backup
[root@localhost ~]# mount /dev/sdb1 /backup
[root@localhost ~]# dd if=/dev/sda of=/backup/sda.mbr.bak bs=512 count=1
//使用dd命令将第一块硬盘中的MBR扇区数据备份到第二块硬盘sdb1分区中

关于硬盘分区等详细情况可以参考博文:Linux磁盘和文件系统管理(一)

(2)模拟MBR扇区故障

[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1
//使用/dev/zero(无限写零)文件覆盖原本的MBR扇区数据

系统重启,将会出现“Operating system not found”的提示信息,表示无法找到可用的操作系统,因此无法启动主机。

(3)从备份文件中恢复MBR扇区数据

由于MBR扇区被破坏以后,就无法再从硬盘启动系统化,所以需要使用其他硬盘中的操作系统进行引导,或者使用Centos系统的安装光盘进行引导,不管使用什么方式,目的都是相同的——获得一个可以执行命令的Shell环境,以便从备份文件中恢复MBR扇区中的数据。

我们使用系统盘引导为例,操作如图:
保证Linux系统安全之分析和排查系统故障
保证Linux系统安全之分析和排查系统故障
保证Linux系统安全之分析和排查系统故障
完成以上操作后,就会出现一个带“sh-4.2#”提示符的bash环境,如图:
保证Linux系统安全之分析和排查系统故障
完成恢复操作以后,执行“exit”命令退出当前临时shell环境,系统将会自动重启!

2.GRUB引导菜单故障

GRUB是大多数Linux操作系统默认使用的引导程序,可以通过启动菜单的方式选择进入不同的操作系统(如果有别的系统),当配置文件/boot/grub2/grub.cfg 丢失,或者关键配置出现错误,或者MBR中的引导程序遭到破坏时,
提前备份grub配置文件:

[root@localhost ~]# vim /boot/grub2/grub.cfg 
[root@localhost ~]# mv /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
//将原本的grub配置文件改名

重启之后,Linux主机启动后可能会出现“grub>”的提示符,无法完成进一步的系统启动过程。如图:
保证Linux系统安全之分析和排查系统故障
解决方案:
进入急救模式,如图:
保证Linux系统安全之分析和排查系统故障
保证Linux系统安全之分析和排查系统故障
保证Linux系统安全之分析和排查系统故障
完成以上操作后,就会出现一个带“sh-4.2#”提示符的bash环境,具体操作命令如图:
保证Linux系统安全之分析和排查系统故障

当选择启动方式为光盘启动时,建议修改完成之后依然选择硬盘启动,也可以根据光盘启动的提示信息手工选择本地硬盘启动,如图:
保证Linux系统安全之分析和排查系统故障
保证Linux系统安全之分析和排查系统故障

完成以后操作后,系统就可正常启动!

注意:CentOS7因为使用的是grub2,配置文件同grub有不少变化,一定要切记备份grub.cfg以便恢复。

遗忘root密码可以参考博文:遗忘Linux系统root密码所采取的必要措施

无论是MBR扇区故障、GRUB引导菜单还是遗忘root密码相关操作,都可进入急救模式进行修复。

三、排除文件系统类故障

文件系统及磁盘中所存储的数据的价值是无法估量的,管理员的工作职责之一就是必须确保数据的安全。由于磁盘属于易损耗品,无法预估它什么时候会损坏,所以最好的办法就是建立完整的备份机制。当系统出现文件系统或磁盘故障时没一定要慎重处理。

1.修复文件系统

在Linux主机中,可能会因为非正常关机、突然断电、设备数据读写异常等原因导致文件系统破坏。比较常见的是超级快损坏。超级快是文件系统的核心“档案”,它记录了该文件系统的类型、大小、空闲磁盘块等信息。

当文件系统的超级块数据损坏是,Linux将无法识别该文件系统,挂载时会出现错误提示以致不能正常使用。执行下列操作可以破坏文件的超级块数据库。命令如下:

[root@localhost ~]# dd if=/dev/zero of=/dev/sdb1 bs=512 count=4
记录了4+0 的读入
记录了4+0 的写出
2048字节(2.0 kB)已复制,0.000868901 秒,2.4 MB/秒
[root@localhost ~]# mkdir /a
[root@localhost ~]# mount /dev/sdb1 /a
mount: /dev/sdb1 写保护,将以只读方式挂载
mount: 未知的文件系统类型“(null)”
[root@localhost ~]# vim /etc/fstab
                      ……………………                //省略部分内容
/dev/sdb1               /a                      xfs     defaults        0 1
//实现自动挂载

重启系统后,会出现以下错误,如图:
保证Linux系统安全之分析和排查系统故障
保证Linux系统安全之分析和排查系统故障
修复完毕!!!

2.磁盘资源耗尽故障

显而易见,当一个文件系统的磁盘空间耗尽以后,将无法继续在该分区中创建新的文件数据,从而导致故障的出现。

当因为根分区磁盘空间不足,而无法启动进入Linux操作系统时,可以进入急救模式,清理占用大量空间的文件。可以使用命令“dd if=/dev/zer0 of=/a bs=1M count=999999”模拟故障。

除此之外,在每一个文件系统中,能够使用的文件数量(对应i结点的数量)也是有限的,当一个文件系统被格式化后,其i结点数也就固定了,如果用户故意消耗i结点数量,那么,及时该分区有大量的空间,也不可以创建文件。

通过示例了解一下:

(1)模拟i结点耗尽故障

[root@localhost ~]# mkdir /a
[root@localhost ~]# mount /dev/sdb1 /a
[root@localhost ~]# df -i /a
文件系统          Inode 已用(I)  可用(I) 已用(I)% 挂载点
/dev/sdb1      10485248       3 10485245       1% /a

编写一个小脚本,消耗i结点数量,脚本内容如下:

[root@localhost ~]# vim a.sh
#!/bin/bash
i=1
while [ $i -le 310485245 ]
do
touch /a/file$i
let i++
done
[root@localhost ~]# sh a.sh &
[root@localhost ~]# df -i /a
文件系统          Inode 已用(I)  可用(I) 已用(I)% 挂载点
/dev/sdb1      10485248    0   3 10485245       100% /a
[root@localhost ~]# touch /a/newfile
touch: 无法创建“/a/newfile” :设备上没有空间
[root@localhost ~]# df -hT /a
文件系统            类型  容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root xfs    17G  4.5G   13G   26% /

(2)修复i结点故障

[root@localhost ~]# rm -rf /a/file*

3.检测硬盘坏道

磁盘坏道分为逻辑坏道和物理坏道来哪种,前者是由于软件操作不当造成,可以使用软件修复工具进行修复,而后者是物理性损坏,只能通过更改磁盘分区或扇区的占用位置进行进行改善,从而排除包含坏块的磁盘空间,若磁盘出现以下现象,则有可能是磁盘出现坏道,需要检测和修复。

  • 读取磁盘中的数据时,磁盘设备发出异响;
  • 访问磁盘中的某个文件时,反复读取且出错,提示文件损坏;
  • 对于新建立的分区无法格式化;
  • 系统使用该磁盘时,频繁死机;
  • 此案出现坏道后,如果不及时更换或进行技术处理,坏道则会越来越多,且可能造成频繁死机和数据丢失的后果,因此必要时应该对磁盘进行定期检测,检测是否存在坏道。

在Linux系统中,检测磁盘的坏道情况可以使用badblocks命令进行,结合“-s”用于显示进度信息;“-v”选项用于显示详情。

[root@localhost ~]# badblocks -sv /sdb/sdb

在长期使用计算机的过程中,文件系统和磁盘类的故障现象很难完全避免,对于此类故障的修复需要十分谨慎,如果操作不当可能会加重数据破坏的程度。当发现磁盘中存在坏道时,应尽快停止系统中的应用服务、备份相关数据,必要时立即关闭系统一方磁盘坏道进一步扩散,避免导致更大的损失。对于存在坏道的硬盘设备,应使用其他完好的硬盘进行替换。

———————— 本文至此结束,感谢阅读 ————————