Bootstrap

Linux第十一章文件系统与日志分析

一.深入立即Linux文件系统

        在处理 Linux 系统出现的各种故障时,故障的症状是最易发现的,而导致这一故障的原
因才是最终排除故障的关键。熟悉 Linux 系统中常见的日志文件,了解一般故障的分析与解
决办法,将有助于管理员快速定位故障点、 对症下药 、并及时解决各种系统问题。另外,
Linux 系统中通过分区、格式化来创建文件系统,而文件系统的运行又与 block inode
关。
       下面来深入地了解 Linux 系统的文件系统和日志文件分析,并通过一些实例介绍常见系
统故障的分析与排除过程。由于故障现象的不确定性,在进行一些模拟故障的操作之前,一
定要提前做好数据备份。

1.inode与block详解

       操作系统的文件数据除了实际内容之外,通常含有非常多的属性,例如 Linux 操作系统
的文件权限( rwx )与文件属性(所有者、群组、时间参数等)。文件系统通常会将这两部
分内容分别存放在 inode block 中。


(1)inode block 概述

①block:文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区sector),每个扇区存储 512 字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续 读取多个扇区,即一次性读取一个""block)。这种由多个扇区组成的"",是文件存取 的最小单位。""的大小,最常见的是 4KB,即连续八个 sector 组成一个 block

②inode:文件数据存储在“中,那么还必须找到一个地方存储文件的元信息,比如文件的创建 者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做 inode,中文译 名为“索引节点,也叫 i 节点。因此,一个文件必须占用一个 inode,但至少占用一个 block, 如图所示。

元信息(元数据)(Meta Date)关于数据的数据或者叫做用来描述数据的数据或者叫做信息的信息。这些定义都很是抽象,我们可以把元数据简单的理解成,最小的数据单位。元数据可以为数据说明其元素或属性(名称、大小、数据类型、等),或其结构(长度、字段、数据列),或其相关数据(位于何处、如何联系、拥有者)。比如,有一条学生信息记录,其中包括字段姓名(name)、年龄(age)、性别(male)、班级(class)等,那么name、age、male、class就是元数据。通过它们的描述,一条关于学生信息的数据记录就产生。
④常用的Linux文件系统的indoe占用的字节数,字节数不是固定的,可调节
xfs文件系统:512字节
ext4文件系统:256字节
⑤block在不同模块中的大小
xfs文件系统:4096字节
磁盘:1024字节
扇区:512字节

(2)inode的内容

使用 stat 命令即可查看某个文件的 inode 信息。
如图所示 inode 包含很多的文件元信息,但不包含文件名,例如:
 文件的字节数
 文件拥有者的 UserID
 文件的 GroupID
 文件的读、写、执行权限
 文件的时间戳
......
          Linux 系统文件有三个主要的时间属性,分别是 ctime(change time), atime(access time),
mtime(modify time)。​​​​​​​
 最近改动: ctime(change time) 是最后一次改变文件或目录(属性)的时间,例如执行 chmod , chown 等命令;
 最近访问: atime(access time) 是最后一次访问文件或目录的时间;
 最近修改: mtime(modify time) 是最后一次修改文件或目录(内容)的时间。
       刚才提到 inode 中并不包括文件名,其实文件名是存放在目录当中的。 Linux 系统中一
切皆文件,因此目录也是一种文件,目录文件的结构如图所示。
        每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件, Linux 系统内部
不使用文件名,而使用 inode 号码来识别文件。对于用户来说,文件名只是 inode 号码便于
识别的别称。

(3)inode的号码

       用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成
以下三步:
 系统找到这个文件名对应的 inode 号码;
 通过 inode 号码,获取 inode 信息;
 根据 inode 信息,找到文件数据所在的 block ,并读出数据。

常见的查看 inode
号码的方式有两种:
ls -i 命令:直接查看文件名所对应的 inode 号码;
stat 命令:通过查看文件 inode 信息而查看到 inode 号码。
       所以,当用户在 Linux 系统中试图访问一个文件时,系统会先根据文件名去查找它对应
inode ,看该用户是否具有访问这个文件的权限。如果有,就指向相对应的数据 block
如果没有,就返回 Permission denied 。而一块硬盘分区后的结构则是如图 所示。

(4)inode的大小

       inode 也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一
个是数据区,存放文件数据;另一个是 inode 区,存放 inode 所包含的信息。每个 inode
大小,一般是 128 字节或 256 字节。通常情况下不需要关注单个 inode 的大小,而是需要
重点关注 inode 总数。 inode 的总数在格式化时就给定了,执行 “df -i” 命令即可查看每个硬盘
分区对应的的 inode 总数和已经使用的 inode 数量。
由于 inode 号码与文件名分离,导致一些 Unix/Linux 系统具备以下几种特有的现象。
 文件名包含特殊字符,可能无法正常删除。这时直接删除 inode ,能够起到删除文
件的作用;
 移动文件或重命名文件,只是改变文件名,不影响 inode 号码;
 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。
       
       这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。
因为系统通过 inode 号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同
样的文件名,生成一个新的 inode ,不会影响到运行中的文件。等到下一次运行这个软件的
时候,文件名就自动指向新版文件,旧版文件的 inode 则被回收。

(5)修改 inode,block的大小及查询详细信息


        注意,修改只能重新格式化磁盘才可进行,如在挂载中需要取消挂载,如磁盘里有文件内容,需要提前做好备份。

(1)修改 inode 的大小
 
根据格式化使用的文件系统再次进行格式化指定 indoe的大小如下图。
命令格式:mkfs+【-t】+文件类型+【-I】+要修改的字节+磁盘分区


XFS系统,注意使用xfs系统重新格式化需加-f 强制执行,-i  这里是小写

注意:如要修改inode的大小,尽量要比默认的大。

(2)修改 block的大小

和修改 indeo的做法一样,如下图。
命令格式:
mkfs+【-t】+文件类型+【-b】+要修改的字节+磁盘分区

XFS系统。

(3)查询修改后的详细信息

如下图,可通过此命令进行查询修改后的信息


 
(4)修改inode在磁盘占比的大小


XFS文件系统

exit4 文件系统,需要指定inode的数量进行格式化修改

2.硬链接和软连接

        在 Linux 系统下的链接文件有两种,一种类似于 Windows 的快捷方式功能的文件,可
以快速连接到目标文件或目录,称之为软链接;另一种则是通过文件系统的 inode 链接来产
生的新文件名,而不是产生新文件,称之为硬链接。

(1)硬链接

       一般情况下,文件名和 inode 号码是一一对应关系,每个 inode 号码对应一个文件名。
但是 Linux 系统允许多个文件名指向同一个 inode 号码。这意味着,可以用不同的文件名访
问同样的内容。 ln 命令可以创建硬链接。
       命令的基本格式为:ln+源文件名称+目标
       
       运行该命令以后,源文件与目标文件的 inode 号码相同,都指向同一个 inode inode
信息中的 链接数 这时就会增加 1
        当一个文件拥有多个硬链接时,对文件内容修改,会影响到所有文件名;但是删除一个
文件名,不影响另一个文件名的访问。删除一个文件名,只会使得 inode 中的 " 链接数 " 1
需要注意的是不能对目录做硬链接。
       通过 mkdir 命令创建一个新目录/app/kgc,其硬链接数应该有 2 个,因为常见的目录本
身为 1 个硬链接,而目录 kgc 下面的隐藏目录 . (点号)是该目录的又一个硬链接,也算是
1 个连接数。
总结:
硬链接:(一个文件不同的名字)(只针对文件,目录无法创建硬链接)
1.硬链接共享一个inode索引号,一个文件的多个硬链接不占用系统空间
2.硬链接不能跨分区建立
3.删除源文件不影响其他硬链接的使用。

(2)软连接

       软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件
的文件名。例如,文件 A 和文件 B inode 号码虽然不一样,但是文件 A 的,内容是文件
B 的路径。读取文件 A 时,系统会自动将访问者导向文件 B 。这时,文件 A 就称为文件 B
软链接 soft link )或者 符号链接( symbolic link )。
       这意味着,文件 A 依赖于文件 B 而存在,如果删除了文件 B ,打开文件 A 就会报错。
这是软链接与硬链接最大的不同:文件 A 指向文件 B 的文件名,而不是文件 B inode
码,文件 B inode“ 链接数 不会因此发生变化。
软链接的创建命令的基本格式为:ln+【-s】+  源文件或目录+目标文件或目录
总结:
软连接:(建立一个全新的文件)(和wendows的快捷方式一个道理)
1.你每创建一个软连接就会有一个新的inode索引号产生,消耗一份磁盘空间。
2.建立软连接必须要以绝对路径建立。
3.删除源文件,软连接将无法使用。
4.可以跨分区建立
5.删除掉原文件,创建一个新的原名文件,软连接可以恢复使用。

3.EXT类型文件修复

        删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录
里面的 block 中,删除这个文件的名字。 Linux 是通过 Link 的数量来控制文件删除的,只有
当一个文件不存在任何 Link 的时候,这个文件才会被删除。
        在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情
况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过 回收
找回的情况,比如使用 “rm -rf” 来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复
工具有 debugfs ext3grep extundelete 等。 其中 extundelete 是一个开源的 Linux 数据
恢复工具,支持 ext3 ext4 文件系统。
       在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的
数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原
因很简单,因为将文件删除后,仅仅是将文件的 inode 节点中的扇区指针清零,实际文件还
存储在磁盘上,如果磁盘继续以读写模式挂载,这些已删除的文件的数据块就可能被操作系
统重新分配出去,在这些数据库被新的数据覆盖后,这些数据就真的丢失了,恢复工具也回
天无力。所以以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数

据成功的比例。
 

1.编译安装 extundelete(只针对ext3及以下的文件系统)

        在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs e2fsprogs-devel
这两个包在系统安装光盘的 /Package 目录下就有,使用 rpm yum 命令将其安装。 e2fsprogs-devel 安装依赖于 libcom_err-devel 包。
        安装完依赖包之后,即可将提前上传的
extundelete 软件包解压、配置、编译、安装。

2.模拟删除并执行恢复操作

1 )使用 fdisk 命令创建新分区,将其挂载到 /tmp 目录下,往该目录下新建一些文件或目录。



执行完命令 extundelete /dev/sdb1 后输入 ”y“ 即可查看该文件系统的使用情况。
 
       也可以使用 “extundelete /dev/sdb1 --inode 2” 查看文件系统 /dev/sdb1 下存在哪些文件,
具体的使用情况。其中 --inode 2 代表从 i 节点为 2 的文件开始查看,一般文件系统格式化挂
载之后, i 节点是从 2 开始的, 2 代表该文件系统最开始的目录。

2 )模拟误操作并恢复
 
       使用 "rm -rf a b" 命令删除 /tmp/ 下的 a 文件和 b 文件,当出现误操作时,立刻卸载该文件系统,然后使用“ extundelete /dev/sdb1 --restore-all" 恢复/dev/sdb1 文件系统下的所有内容。
       执行完恢复的命令后,在当前目录下会出现一个 /RECOVERED_FILES/ 目录,里面保存了已经恢复的文件。
当然 extundelete 的用法还有很多,可以通过 help 查看详细用法。
 
4.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 后面不能直接跟路径。
       下面通过一个案例来备份恢复 xfs 类型的文件。首先添加一款新硬盘并格式化为 xfs 类型的文件系统,然后挂在到/date 目录下。



使用 xfsdump 命令备份整个分区。




删除之前创建的内容,模拟数据丢失。
       使用 xfsrestore 命令恢复文件。 xfsrestore 命令的语法为: xfsrestore -f 恢复文件的位置存放恢复后文件的路径。
使用 xfsdump 时,需要注意以下的几个限制:
xfsdump 不支持没有挂载的文件系统备份,所以只能备份已挂载的;
xfsdump 必须使用 root 的权限才能操作 ( 涉及文件系统的关系 )
xfsdump 只能备份 XFS 文件系统;
xfsdump 备份下来的数据 ( 档案或储存媒体 ) 只能让 xfsrestore 解析;
xfsdump 是透过文件系统的 UUID 来分辨各个备份档的,因此不能备份两个具有相同
UUID 的文件系统。

二.分析日志文件

        日志文件是用于记录 Linux 操作系统中各种运行消息的文件,相当于 Linux 主机的
。不同的日志文件记载了不同类型的信息,如 Linux 内核消息、用户登录事件、程序错
误等。​​​​​​​
       日志文件对于诊断和解决系统中的问题很有帮助,因为在 Linux 操作系统中运行的程序
通常会把系统消息和错误消息写入相应的日志文件,这样系统一旦出现问题就会 有据可查
此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。本节将对 Linux
作系统中的主要日志文件及分析方法进行介绍。
 

1.主要日志文件

       本小节将简单介绍日志数据的种类及常见日志文件的用途。在 Linux 操作系统中,日志
数据主要包括以下三种类型。
 内核及系统日志:这种日志数据由系统服务 rsyslog 统一管理,根据其主配置文件
/etc/rsyslog.conf 中的设置决定将内核消息及各种系统程序消息记录到什么位置。
系统中有相当一部分程序会把自己的日志文件交由 rsyslog 管理,因而这些程序使
用的日志记录也具有相似的格式。

 用户日志:这种日志数据用于记录 Linux 操作系统用户登录及退出系统的相关信息,
包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。

 程序日志:有些应用程序会选择由自己独立管理一份日志文件(而不是交给 rsyslog
服务管理),用于记录本程序运行过程中的各种事件信息。由于这些程序只负责管
理自己的日志文件,因此不同程序所使用的日志记录格式可能会存在较大的差异。​​​​​​​

        Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录 /var/log/ 下。一部
分程序共用一个日志文件,一部分程序使用单个日志文件,而有些大型服务器程序由于日志
文件不止一个,所以会在 /var/log/ 目录中建立相应的子目录来存放日志文件,这样既保证了
日志文件目录的结构清晰,又可以快速定位日志文件。有相当一部分日志文件只有 root
户才有权限读取,这保证了相关日志信息的安全性。​​​​​​​
        对于 Linux 操作系统中的日志文件,有必要了解其各自的用途,这样才能在需要的时候
更快地找到问题所在,及时解决各种故障。下面介绍常见的一些日志文件。
 
/var/log/messages :记录 Linux 内核消息及各种应用程序的公共日志信息,包括启动、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 :记录失败的、错误的登录尝试及验证事件。

2.日志文件分析

        熟悉了系统中的主要日志文件以后,下面将介绍针对日志文件的分析方法。分析日志文
件的目的在于通过浏览日志查找关键信息、对系统服务进行调试,以及判断发生故障的原因
等。本小节主要介绍三类日志文件的基本格式和分析方法。​​​​​​​
        对于大多数文本格式的日志文件(如内核及系统日志、大多数的程序日志),只要使用
tail more less cat 等文本处理工具就可以查看日志内容。而对于一些二进制格式的日志
文件(如用户日志),则需要使用特定的查询命令。

1.内核及系统日志

       内核及系统日志功能主要由默认安装的 rsyslog-7.4.7-16.el7.x86_64.rpm 软件包提供。
rsyslog 服务所使用的配置文件为 /etc/rsyslog.conf 。通过查看 /etc/rsyslog.conf 文件中的内
容,可以了解到系统默认的日志设置,具体操作如下:


        从配置文件 /etc/rsyslog.conf 中可以看到,受 rsyslogd 服务管理的日志文件都是 Linux
操作系统中主要的日志文件,它们记录了 Linux 操作系统中内核、用户认证、电子邮件、计
划任务等基本的系统消息。在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同
的优先级别(数字等级越小,优先级越高,消息越重要)。
0 emerge (紧急):会导致主机系统不可用的情况。
1 alert (警告):必须马上采取措施解决的问题。
2 critical (严重):比较严重的情况。
3 error (错误):运行出现错误。
4 warning (提醒):可能影响系统功能,需要提醒用户的重要事件。
5 notice (注意):不会影响正常功能,但是需要注意的事件。
6 info (信息):一般信息。
7debug(调试):程序或系统调试信息等。​​​​​​​
       内核及大多数系统消息被记录到公共日志文件 /var/log/messages 中,而其他一些程序
消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者
直接发送给指定用户。查看 /var/log/messages 文件的内容如下:

       对于 rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。
以公共日志 /var/log/messages 文件的记录格式为例,其中每一行表示一条日志消息,每
一条消息均包括以下四个字段。
 时间标签:消息发出的日期和时间。
 主机名:生成消息的计算机的名称。
 子系统名称:发出消息的应用程序的名称。
 消息:消息的具体内容。​​​​​​​
       在有些情况下,可以设置 rsyslog ,使其在把日志信息记录到文件的同时将日志信息发
送到打印机进行打印,这样无论网络入侵者怎样修改日志都不能清除入侵的痕迹。 rsyslog
日志服务是一个常会被攻击的显著目标,破坏了它将使管理员难以发现入侵及入侵的痕迹,
因此要特别注意监控其守护进程及配置文件。
 

2.用户日志

wtmp btmp, lastlog 等日志文件中,保存了系统用户登录、退出等相关的事件消息。
但是这些文件都是二进制的数据文件,不能直接使用 tail less 等文本查看工具进行浏览,
需要使用 who w users last lastb 等用户查询命令来获取日志信息。
1 )查询当前登录的用户情况 ——users who w 命令
       users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。
如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。 user 命令的具
体操作如下:
       who 命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可
以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。 who 的默认输出包括用
户名、终端类型、登录日期及远程主机。 who 命令的具体操作如下:
       w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users who 命令的输出内容要丰富一些。w 命令的具体操作如下:
2 )查询用户登录的历史记录 ——last lastb 命令
        last 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过
last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前
主机可能已被入侵。last 命令的具体操作如下:
       lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都
将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除
了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。

或者
从上述查询结果可以看到, teacher 用户在 tty3 终端上出现了失败登录。
 

3.程序日志

       在 Linux 操作系统中,还有相当一部分应用程序没有使用 rsyslog 服务来管理日志,而
是由程序自己维护日志记录。例如, httpd 网站服务程序使用两个日志文件 access_log
error_log 分别记录客户访问事件和错误事件。不同应用程序的日志记录格式差别较大,且
没有严格使用统一的格式,这里不再详细介绍。
 
       总的来说,作为一名合格的系统管理人员,应该提高警惕,随时注意各种可疑状况,定
期并随机检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志及用户
登录日志记录等。在检查这些日志时,要注意是否有不合常理的时间或操作记录。例如,出
现以下现象就应多加注意。​​​​​​​

 用户在非常规的时间登录,或者用户登录系统的 IP 地址和以往的不一样。
 用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录。
 非法使用或不正当使用超级用户权限。
 无故或者非法重新启动各项网络服务的记录。
 不正常的日志记录,如日志残缺不全,或者是诸如 wtmp 这样的日志文件无故缺少
了中间的记录文件。
 
       另外,需要提醒管理人员注意的是,日志并不是完全可靠的,高明的黑客在入侵系统后
经常会打扫现场。所以管理人员需要综合运用以上的系统命令,全面、综合地进行审查和检
测,切忌断章取义,否则将可能做出错误的判断。

4.将多个主机的日志同步到一个主机上

系统

主机名

IP地址

软件

centos7.9

master

192.168.10.101

rsyslog

centos7.9

node1

192.168.10.102

rsyslog

centos7.9

node2

192.168.10.103

rsyslog

实施步骤

1.检查软件包


2.master端设置

3.两台node节点的设置

4.测试

5.自定义日志

1.自定义ssh服务的日志


2.日志切割

        在linux下的日志会定期进行滚动增加,我们可以在线对正在进行回滚的日志进行指定大小的切割(动态),如果这个日志是静态的。比如没有应用向里面写内容。那么我们也可以用split工具进行切割;其中Logrotate支持按时间和大小来自动切分,以防止日志内容将包含/var/log的文件系统填满。




;