Linux文件系统与日志分析详解

199 阅读10分钟

一、 inode(索引节点/i节点)与block(块)

1.inode与block的概念

1.1 什么是block?

文件储存在硬盘上的,硬盘最小的存储单位叫“扇区”,每个扇区存储512个字节

一般连续8个扇区会组成一个“块”(block),一个块是4K大小,是文件存取的最小单位

文件名存储在目录文件当中

文件数据包含实际数据与元信息(类似于文件属性),文件数据是存储在“块”当中

1.2 什么是inode?

存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域叫做inode(除文件名以外的所有文件属性和信息) 。因此,一个文件必须占用一个inode,并且至少占用一个块。

inode不包括文件名,文件名是存放在目录当中的,Linux系统中一切皆文件,因此目录也是一种文件。

每个inode都有一个号码,操作系统是用inode号来识别不同的文件。Linux系统内部不使用文件名来识别文件,而是使用inode号来识别文件。对于系统来说,文件名只是inode号便于识别的别称,文件名与inode号使一一对应关系,每个inode号对应一个文件名。

1.3 如何查看inode号

查看文件对应的inode号有以下两种方式:

  1. ls -i

image.png 2. stat +[指定文件]

image.png

2. inode的内容

2.1 Linux系统文件的三个主要时间属性

1.ctime(change time)

最后一次改变文件或目录(属性)的时间

2.atime(access time)

最后一次访问文件或目录的时间

3.mtime(modify time)

最后一次修改文件或目录(内容)的时间

举例:

image.png

image.png

PS:修改文件的内容会影响文件的大小,文件大小属于文件属性内容,所以mtime,ctime均会改变。

2.2 inode与文件/目录对应关系

  • 目录文件的结构

    • 目录也是一种文件
    • 目录文件的结构
  • 每个inode都有一个号码,操作系统用inode号码来识别不同的文件

  • Linux系统内部不适用文件名,而使用inode号来识别文件

  • 对于用户、文件名只是inode号码便于识别的别称

2.3 系统访问文件的过程

image.png

  • 用户通过文件名打开文件时,系统内部的过程

    1. 系统找到这个文件名对应的inode号码
    2. 通过inode号码,获取inode信息
    3. 根据inode信息的权限,查看用户是否具有访问文件的权限,有权限则找到文件数据所在的block,读出数据;没有权限则拒绝访问

2.4 如何删除inode号?

由于inode号与文件名分离,导致Linux系统具备以下几种特有的现象:

  1. 文件名包含特殊字符,可能无法正常删除。这时直接删除inode号,能够起到删除文件的作用
  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码
  3. 打开一个文件以后,系统就以inode号来识别这个文件,不再考虑文件名
  4. 使用vi编辑器修改文件数据保存后,会生成一个新的inode号

rm命令只能通过文件名删除,无法通过inode号码删除,遇到含有特殊字符的文件,只能通过inode号进行删除,如果想通过inode号删除有以下三种方法:

image.png

补充:vim编辑器修改文件内容,实际上是将一个新的文件与原文件进行替换操作

我们在一个端口打开我们创建的123.txt文件:

image.png 然后我们观察另一个端口文件所在目录:

image.png 从上图我们可以看到,vim编辑文件时会创建一个隐藏文件,编辑保存后,会将该文件与原文件进行替换操作,所以inode号会有所改变,使用echo直接修改文件内的内容不会改变文件inode号。

2.5 inode号实验

实验:模拟inode号已经被使用耗尽,存在可用空间却无法创建新文件的情况

实验条件:拥有额外的两块硬盘

image.png

image.png 如上图,我们为什么要创建ext4类型的文件系统没有使用xfs的常用格式,是因为xfs类型的文件系统统计空间时并不没有ext4格式那么准确,本身的可创建数量可能偏高于给出的可用数量 image.png

image.png 接下来我们要创建相对应数量的文件(2549个):

image.png

image.png

image.png 从上面操作,我们可以看到虽然我们分区仍然有可用空间,但是我们的inode号已经使用完了,因此无法创建文件。

3. 实验:如何恢复EXT类型的文件

首先我们需要使用到一个名为extundelete的数据恢复工具,这款开源的Linux数据恢复工具,仅支持ext3、ext4文件系统类型的磁盘恢复数据,其中(ext4的文件类型只能在centos6版本中恢复),所以我们这次实验仅使用ext3的文件类型作为恢复用的磁盘文件类型。

3.1 实验准备

建立一个文件系统类型为ext3的磁盘分区:

image.png

image.png

image.png image.png

3.2 Linux系统中下载文件

命令1:
wget http://...   [-o]      #wget后面跟指定路径 -o指定下载目录
命令2:
curl -L http://... [-o]     #curl -L选项指定下载的路径 -o指定下载的目录 

以上两种方式如果不加-o选项,那么下载的内容将保存在当前路径

3.3 编译安装extundelete

  • 安装依赖包
    • e2fsgprogs-libs-1.41.12-18.el6.x86_64rpm
    • e2fsgprogs-devel-1.41.12-18.el6.x86_64rpm
  • 配置、编译及安装
    • extundelete-0.2.4.tar.bz2

image.png

image.png

配置configure配置文件

image.png

image.png

image.png

image.png

image.png

3.4 演示误删除操作

image.png

extundelete /dev/sdc1 --inode 2    #仍然使用该命令查看inode号以2开始的文件

image.png

3.5 进行文件的恢复

在我们进行文件的恢复之前,一定要进行解挂载的操作,因为在我们工作环境中,数据是会不断进行写入到磁盘空间中的,为了防止之前被删除文件的内容被其他新的文件所替换,我们第一时间先进行解挂载,然后再进行恢复工作

image.png

所以在我们删除文件时,最好情况下是做一个备份文件,在经过一定时间之后,文件仍不被需要,我们再进行删除操作。

二、如何进行文件的备份

2.1 xfs类型文件备份与恢复

  • Centos 7 系统默认采用xfs类型的文件,xfs类型的文件可以使用xfsdump与xfsrestore工具进行备份恢复。
  • xfsdump的备份级别有两种:0表示完全备份;1-9表示增量备份。sfsdump的备份级别默认为0。
  • 完全备份效率较低,占用磁盘空间高,存在每次的备份都有重复数据备份的情况;增量备份只会去备份上次备份结束后新增加的文件数据。

2.2 xfsdump命令

1. xfsdump命令格式

xfsdump -f          #指定备份文件存放的位置  选项后加上需要备份的目录

2. 如何进行备份

① 准备工作

准备一个xfs文件类型系统的磁盘,挂载后,将系统文件复制到磁盘中

image.png

② 备份磁盘内容

image.png 可以在命令后使用-L选项加上指定标签 -M选项加上指定设备标签进行免交互的备份操作

③ 模拟删除磁盘里的文件并使用备份恢复

image.png

三、linux日志分析

3.1 日志的功能

  • 用于记录系统、程序运行中发生的各种事件
  • 通过阅读日志,有助于诊断和解决系统故障

3.2 日志文件的分类

  • 内核及系统日志

    • 由系统服务rsyslog统一进行管理,日志格式基本相似
    • 主配置文件/etc/rsyslog.conf
  • 用户日志

    • 记录系统用户登录及退出系统的相关信息
  • 程序日志

    • 由各种应用程序独立管理的日志文件,记录格式不统一

3.3 日志保存位置

  • 默认位于/var/log目录下,常用的日志文件如下所示:
日志文件及所处位置功能
内核及公共消息日志(/var/log/message)主要记录Linux内核消息及各种应用程序的公共日志信息,包括启动、I/O错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以在该日志文件中获得相关的时间记录信息
计划任务日志(/var/log/cron)记录crond计划任务产生的时间信息
系统引导日志(/var/log/dmesg)记录Linux系统在引导过程中的各种事件信息
邮件系统日志(/var/log/maillog)记录进入或发出系统的电子邮件活动
用户登录日志(/var/log/)(secure;lastlog;wtmp;btmp)secure记录用户认证相关的安全事件信息; lastlog记录每个用户最近的登陆事件(二进制格式); wtmp记录每个用户登录、注销及系统启动和停机事件(二进制格式); btmp记录失败的、错误的登录尝试及验证事件(二进制格式)

3.4 日志配置文件详情

系统日志由系统服务rsyslog统一管理

主要程序:/sbin/rsyslogd

配置文件:/etc/rsyslog.conf

1. 日志配置文件字段相关含义

首先,进入/etc/rsyslog.conf配置文件中查看配置内容

image.png

*.info     #表示info等级及以上的所有等级的信息都写道对应的日志文件中
cron.none  #表示某事件的信息不写入日志文件中(比如计划任务所产生的时间信息)
  • 设备字段说明: 字段 | 含义 | | ------------- | ------------------------------ | | auth | 用户认证时产生的日志 | | authpriv | ssh、ftp等登录信息的验证信息 | | daemon | 一些守护进程产生的日志 | | ftp | ftp产生的日志 | | lpr | 打印相关活动 | | mark | rsyslog服务内部的信息,时间标识 | | news | 网络新闻传输协议(nntp)产生的消息 | | syslog | 系统日志 | | uucp | Unix-to-Unix Copy两个unix之间的相关通信 | | console | 针对系统控制台的消息 | | cron | 系统执行定时任务产生的日志 | | kern | 系统内核日志 | | local0~local7 | 自定义程序使用 | | mail | 邮件日志 | | user | 用户进程|

2. 日志消息优先级

  • Linux系统内核日志消息的优先级别(数字越小,优先级越高,消息越重要)
数字优先级
0(EMERG)紧急:会导致主机系统不可用的情况。比如系统崩溃
1(ALERT)警告:必须马上才需措施解决的问题。比如数据库被破坏
2(CRIT)严重:比较严重的情况。比如硬盘错误,可能会阻碍程序的部分功能。
3(ERR)错误:运行出现错误。并不是需要尽快修复,非常紧急的
4(WARNING)提醒:可能影响系统功能,需要提醒用户的重要事件。不属于错误,比如磁盘空间使用过多。
5(NOTICE)注意:不会影响正常功能,但是需要注意的事件,无需处理。
6(INFO)信息:一般信息,正常的系统信息。
7(DEBUG)程序或系统调试信息等。包含详细开发的信息,调试程序时使用。
none(相当于除去前面的日志)没有优先级,不记录任何日志消息。

举例:

mail.info /var/log/maillog    #比指定级别更高的日志级别,包括指定级别自身,保存到/var/1og/maillog中
mail.=info /var/log/maillog   #明确指定日志级别为info,保存至/var/log/maillog
mail.!info /var/1og/maillog   #除了指定的日志级别(info)所有日志级别信息,保存至/var/1og/maillog中
*.info /var/1og/maillog       #所有文件info级别以上的日志,保存至/var/1og/maillog
mail.* /var/1og/maillog       #mail的所有日志级别信息,都保存至/var/1og/maillog
mail.notice;news.info /var/log/maillog #表示mail的notice级别以上的日志和news的info级别以上的日志都保存至/var/log/maillog