深入理解 Linux 文件系统 与日志分析
在处理 Linux 系统出现的各种故障时,故障的症状是最易发现的,而导致这一故障的原
因才是最终排除故障的关键。熟悉 Linux 系统中常见的日志文件,了解一般故障的分析与解
决办法,将有助于管理员快速定位故障点、“对症下药”、并及时解决各种系统问题。另外,
Linux 系统中通过分区、格式化来创建文件系统,而文件系统的运行又与 block 和 inode 有
关。
下面来深入地了解 Linux 系统的文件系统和日志文件分析,并通过一些实例介绍常见系
统故障的分析与排除过程。由于故障现象的不确定性,在进行一些模拟故障的操作之前,一
定要提前做好数据备份。
inode 与 block 详解
文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储 512
字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续
读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取
的最小单位。"块"的大小,最常见的是 4KB,即连续八个 sector 组成一个 block。
文件数据存储在“块”中,那么还必须找到一个地方存储文件的元信息,比如文件的创建
者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做 inode,中文译
名为“索引节点”,也叫 i 节点。因此,一个文件必须占用一个 inode,但至少占用一个 block,
如图 11.1 所示。
inode 的内容:
使用 stat 命令即可查看某个文件的 inode 信息。
[root@localhost ~]# stat anaconda-ks.cfgFile: ‘anaconda-ks.cfg’Size: 1424 Blocks: 8 IO Block: 4096 regular fileDevice: fd00h/64768d Inode: 100663363 Links: 1Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2018-11-07 03:28:01.914327950 -0500Modify: 2018-11-07 06:45:44.506987401 -0500Change: 2018-11-07 06:45:44.506987401 -0500Birth: -
注释:
File:显示文件名
Size:显示文件大小
Blocks:文件使用的数据块总数
IO Block:IO块大小
regular file:文件类型(常规文件)
Device:设备编号
Inode:Inode号
Links:链接数
Access:文件的权限
Gid、Uid:文件所有权的Gid和Uid
access time:表示我们最后一次访问(仅仅是访问,没有改动)文件的时间
modify time:表示我们最后一次修改文件的时间
change time:表示我们最后一次对文件属性改变的时间,包括权限,大小,属性等等
Birth time : 文件创建时间,crtime,不过据查此属性linux已废弃,目前状态显示结果均为
Linux系统文件有三个主要的时间属性,分别是ctime(change time), atime(access time),
mtime(modify time)。
ctime(change time) 是最后一次改变文件或目录(属性)的时间,例如执行 chmod,
chown 等命令;
atime(access time)是最后一次访问文件或目录的时间;
mtime(modify time)是最后一次修改文件或目录(内容)的时间。
inode 的号码
每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件,Linux 系统内部
不使用文件名,而使用 inode 号码来识别文件。对于用户来说,文件名只是 inode 号码便于
识别的别称。
用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成
以下三步:
1.系统找到这个文件名对应的 inode 号码;
2.通过inode 号码,获取 inode 信息;
3.根据 inode 信息,找到文件数据所在的 block,并读出数据。
(ls -i 命令:直接查看文件名所对应的 inode 号码;
stat 命令:通过查看文件 inode 信息而查看到 inode 号码。)
[root@localhost ~]# stat anaconda-ks.cfgFile: ‘anaconda-ks.cfg’Size: 1424 Blocks: 8 IO Block: 4096 regular fileDevice: fd00h/64768d Inode: 100663363 Links: 1Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2018-11-07 03:28:01.914327950 -0500Modify: 2018-11-07 06:45:44.506987401 -0500Change: 2018-11-07 06:45:44.506987401 -0500Birth: -
[root@localhost ~]# ls -i anaconda-ks.cfg100663363 anaconda-ks.cfg
inode 的大小
inode 也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一
个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。每个 inode 的
大小,一般是 128 字节或 256 字节。通常情况下不需要关注单个 inode 的大小,而是需要
重点关注 inode 总数。inode 的总数在格式化时就给定了,执行“df -i”命令即可查看每个硬盘
分区对应的的 inode 总数和已经使用的 inode 数量。
[root@localhost ~]# df -iFilesystem Inodes IUsed IFree IUse% Mounted on/dev/mapper/cl-root 26214400 38240 26176160 1% /devtmpfs 230666 422 230244 1% /devtmpfs 233411 1 233410 1% /dev/shmtmpfs 233411 516 232895 1% /runtmpfs 233411 16 233395 1% /sys/fs/cgroup/dev/sda1 524288 330 523958 1% /boot/dev/mapper/cl-home 24637440 7 24637433 1% /hometmpfs 233411 1 233410 1% /run/user/0
硬链接与软链接
1.硬链接
一般情况下,文件名和 inode 号码是一一对应关系,每个 inode 号码对应一个文件名。
但是 Linux 系统允许多个文件名指向同一个 inode 号码。这意味着,可以用不同的文件名访
问同样的内容。ln 命令可以创建硬链接,命令的基本格式为:
使用 stat 命令即可查看某个文件的 inode 信息。
ln 源文件 目标
注意:软链接时,原文件如果和链接文件不在同一个目录,要用绝对路径。硬链接无此要求
2.软链接
软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件
的文件名。例如,文件 A 和文件 B 的 inode 号码虽然不一样,但是文件 A 的,内容是文件
B 的路径。读取文件 A 时,系统会自动将访问者导向文件 B。这时,文件 A 就称为文件 B
的“软链接”(soft link)或者“符号链接(symbolic link)。这意味着,文件 A 依赖于文件 B 而存在,如果删除了文件 B,打开文件 A 就会报错。
ln -s 源文件或目录 目标文件或目录
硬链接只能针对文件,不能针对目录,软链接可以针对文件和目录
硬链接不能跨分区,软链接可以跨分区
EXT文件系统文件恢复
删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录
里面的 block 中,删除这个文件的名字。Linux 是通过 Link 的数量来控制文件删除的,只有
当一个文件不存在任何 Link 的时候,这个文件才会被删除。
在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情
况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收
站”找回的情况,比如使用“rm -rf”来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复
工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一个开源的 Linux 数据
恢复工具,支持 ext3、ext4 文件系统。
在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的
数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原
因很简单,因为将文件删除后,仅仅是将文件的 inode 节点中的扇区指针清零,实际文件还
存储在磁盘上,如果磁盘继续以读写模式挂载,这些已删除的文件的数据块就可能被操作系
统重新分配出去,在这些数据库被新的数据覆盖后,这些数据就真的丢失了,恢复工具也回
天无力。所以以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数
据成功的比例。
下面将介绍使用 extundelete 工具如何恢复误删除的文件。
在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs 和 e2fsprogs-devel,
这两个包在系统安装光盘的/Package 目录下就有,使用 rpm 或 yum 命令将其安装。
e2fsprogs-devel 安装依赖于 libcom_err-devel 包。
安装完依赖包之后,即可将提前上传的 extundelete 软件包解压、配置、编译、安装。
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs wget bzip2 gcc*
[root@localhost~]#wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
[root@localhost ~]# tar -xvf extundelete-0.2.4.tar.bz2
[root@localhost ~]# cd extundelete-0.2.4
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete && make && make install
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/
[root@localhost ~]# cd /data
[root@localhost data]# echo a>a
[root@localhost data]# echo b>b
[root@localhost data]# echo c>c
[root@localhost data]# echo d>d
[root@localhost data]# ls
(2)模拟误操作并恢复
[root@localhost data]# rm -rf a b
[root@localhost data]# ls
c d lost+found
[root@localhost data]# cd
[root@localhost ~]# umount /data
[root@localhost ~]# extundelete /dev/sdb1 --restore-all
注意:恢复的文件会放在当前目录下的RECOVERED_FILES子目录下
xfs 类型文件备份和恢复
extundelete 工具仅可以恢复 EXT 类型的文件,无法恢复 CentOS 7 系统默认采用 xfs
类型的文件。针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数
据备份,以避免数据丢失。
xfs 类型的文件可使用 xfsdump 与 xfsrestore 工具进行备份恢复。若系统中未安装
xfsdump与xfsrestore工具,可以通过yum install -y xfsdump命令安装。
xfsdump 按照inode顺序备份一个 xfs 文件系统。xfsdump 的备份级别有两种:0 表示完全备份;1-9 表示增量备份。xfsdump 的备份级别默认为 0。xfsdump 的命令格式为:xfsdump -f 备份存放位置要备份路径或设备文件。常用的备份参数包括以下几种:
-f:指定备份文件目录;
-L:指定标签 session label;
-M:指定设备标签 media label;
-s:备份单个文件,-s 后面不能直接跟路径。
1:安装xfsdump工具
[root@localhost ~]# yum install -y xfsdump
2:将分区格式化为xfs
[root@localhost ~]# mkfs.xfs -f /dev/sdb1
[root@localhost ~]# mount /dev/sdb1 /data
[root@localhost ~]# cd /data
2:创建测试文件
[root@localhost data]# echo a>a
[root@localhost data]# echo b>b
[root@localhost data]# echo c>c
[root@localhost data]# echo d>d
[root@localhost data]# ls
a b c d
3:备份数据(将/data目录中的文件备份到/opt/dump_sdb1文件中)
[root@localhost ~]# xfsdump -f /opt/dump_sdb1 /data
注意:
/data后面不要斜杠,不要写成/data/,同时,也不能用相对路径
需要输入两个标识,第一个是备份会话标签,第二个是指定备份标签
4:模拟删除动作
[root@localhost ~]# rm -rf /data/*
主要日志文件
在 Linux 操作系统中,日志
数据主要包括以下三种类型。
(1)内核及系统日志:这种日志数据由系统服务 rsyslog 统一管理,根据其主配置文件
/etc/rsyslog.conf 中的设置决定将内核消息及各种系统程序消息记录到什么位置。
系统中有相当一部分程序会把自己的日志文件交由 rsyslog 管理,因而这些程序使
用的日志记录也具有相似的格式。
(2)用户日志:这种日志数据用于记录 Linux 操作系统用户登录及退出系统的相关信息,
包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。
(3)程序日志:有些应用程序会选择由自己独立管理一份日志文件(而不是交给 rsyslog
服务管理),用于记录本程序运行过程中的各种事件信息。由于这些程序只负责管
理自己的日志文件,因此不同程序所使用的日志记录格式可能会存在较大的差异。
常见日志文件
/var/log/messages:记录 Linux 内核消息及各种应用程序的公共日志信息,包括启第 17 页 共 23 页
动、I/0 错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服
务,一般都可以从该日志文件中获得相关的事件记录信息。
/var/log/cron:记录 crond 计划任务产生的事件信息。
/var/log/dmesg:记录 Linux 操作系统在引导过程中的各种事件信息。
/var/log/maillog:记录进入或发出系统的电子邮件活动。
/var/log/lastlog:记录每个用户最近的登录事件。
/var/log/secure:记录用户认证相关的安全事件信息。
/var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。
/var/log/btmp:记录失败的、错误的登录尝试及验证事件。
日志文件分析
熟悉了系统中的主要日志文件以后,下面将介绍针对日志文件的分析方法。分析日志文
件的目的在于通过浏览日志查找关键信息、对系统服务进行调试,以及判断发生故障的原因
等。本小节主要介绍三类日志文件的基本格式和分析方法。
对于大多数文本格式的日志文件(如内核及系统日志、大多数的程序日志),只要使用
tail、more、less、cat 等文本处理工具就可以查看日志内容。而对于一些二进制格式的日志
文件(如用户日志),则需要使用特定的查询命令。
1.内核及系统日志
内核及系统日志功能主要由默认安装的 rsyslog-7.4.7-16.el7.x86_64.rpm 软件包提供。
rsyslog 服务所使用的配置文件为/etc/rsyslog.conf。通过查看/etc/rsyslog.conf 文件中的内容,可以了解到系统默认的日志设置受 rsyslogd 服务管理的日志文件都是 Linux操作系统中主要的日志文件,它们记录了 Linux 操作系统中内核、用户认证、电子邮件、计划任务等基本的系统消息。在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同的优先级别(数字等级越小,优先级越高,消息越重要)。
0 EMERG(紧急):会导致主机系统不可用的情况。
1 ALERT(警告):必须马上采取措施解决的问题。
2 CRIT(严重):比较严重的情况。
3 ERR(错误):运行出现错误。
4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。
5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。
6 INFO(信息):一般信息。
7 DEBUG(调试):程序或系统调试信息等。
内核及大多数系统消息被记录到公共日志文件/var/log/messages 中,而其他一些程序
消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者
直接发送给指定用户。
对于 rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。
以公共日志/var/log/messages 文件的记录格式为例,其中每一行表示一条日志消息,每
一条消息均包括以下四个字段。
时间标签:消息发出的日期和时间。
主机名:生成消息的计算机的名称。
子系统名称:发出消息的应用程序的名称。
消息:消息的具体内容。
在有些情况下,可以设置 rsyslog,使其在把日志信息记录到文件的同时将日志信息发
送到打印机进行打印,这样无论网络入侵者怎样修改日志都不能清除入侵的痕迹。rsyslog
日志服务是一个常会被攻击的显著目标,破坏了它将使管理员难以发现入侵及入侵的痕迹,
因此要特别注意监控其守护进程及配置文件
用户日志
在 wtmp、btmp、
lastlog 等日志文件中,保存了系统用户登录、退出等相关的事件消息。
但是这些文件都是二进制的数据文件,不能直接使用 tail、less 等文本查看工具进行浏览,
需要使用 who、w、users、last 和 lastb 等用户查询命令来获取日志信息。
查询当前登录的用户情况——users、who、w 命令
1.users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。
如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。
2.who 命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可
以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用
户名、终端类型、登录日期及远程主机。
3.w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的
输出内容要丰富一些。
查询用户登录的历史记录——last、lastb 命令
1.last 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过
last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前
主机可能已被入侵。
2.lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都
将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除
了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。
程序日志
在 Linux 操作系统中,还有相当一部分应用程序没有使用 rsyslog 服务来管理日志,而
是由程序自己维护日志记录。例如,httpd 网站服务程序使用两个日志文件 access_log 和
error_log 分别记录客户访问事件和错误事件。不同应用程序的日志记录格式差别较大,且
没有严格使用统一的格式,这里不再详细介绍。
总的来说,作为一名合格的系统管理人员,应该提高警惕,随时注意各种可疑状况,定
期并随机检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志及用户
登录日志记录等。在检查这些日志时,要注意是否有不合常理的时间或操作记录。例如,出
现以下现象就应多加注意。
用户在非常规的时间登录,或者用户登录系统的 IP 地址和以往的不一样。
用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录。
非法使用或不正当使用超级用户权限。
无故或者非法重新启动各项网络服务的记录。
不正常的日志记录,如日志残缺不全,或者是诸如 wtmp 这样的日志文件无故缺少
了中间的记录文件。
另外,需要提醒管理人员注意的是,日志并不是完全可靠的,高明的黑客在入侵系统后
经常会打扫现场。所以管理人员需要综合运用以上的系统命令,全面、综合地进行审查和检
测,切忌断章取义,否则将可能做出错误的判断。