Linux文件系统与日志分析
1 inode 表结构
每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data)
元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个
文件的元数据信息。
每一个inode表记录对应的保存了以下信息:
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
如何查看inode号
ls -i
stat
有3个时间:
最近访问atime:查看文件的时间
最近更改mtime:最近更改文件内容的时间,注意:更改完内容之后,ctime也会改变
最近改动ctime:最近更改文件元信息的时间,比如改变权限等
-
文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。
-
一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。4k一读,8个扇区一读
-
文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode表。 因此,一个文件必须占用一个inode,并且至少占用一个block。du 显示
-
inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。
-
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名。
唯一 同一文件系统() 不同的文件
-
所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码:通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。
硬盘上最小的存储单位为扇区(512字节)
文件存储的最小单位为块8个扇区组成为4k
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
目录
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系
文件引用一个是 inode号
是通过文件名来引用一个文件
一个目录是目录下的文件名和文件inode号之间的映射
文件是如何找到实际数据的
linux 通过文件夹中会有一张 文件名和inode一一对应关系的表 (名字) 去找inode号 inode指向对应的实际数据
cp 和 inode
cp 命令:
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
rm 命令:
- 硬链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv和inode
-
如果mv命令的目标和源在同一设备,
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
删除旧的目录对应关系新建目录对应关系
三种时间戳
当新创建一个文件时,这个文件的最后访问时间、最后内容修改时间、最后状态更新时间都是一致的。
修改一个文件的权限状态信息,只会更新这个文件的最后状态修改时间
对比事例2,这里最后状态时间、最后内容改变时间都被更新了。 当修改一个文件时,文件的Modify、Change会被更新
当查看文件时,文件的 Access time 会更新。
当需要了解这个文件有没有被修改过 - Modify Time 当需要了解这个文件最后被查看的时间 - Access Time 当需要了解这个文件权限最后变动的时间 - Change Time
有3个时间:
最近访问atime:查看文件的时间
最近更改mtime:最近更改文件内容的时间,注意:更改完内容之后,ctime也会改变
最近改动ctime:最近更改文件元信息的时间,比如改变权限等
文件:"1.txt"
大小:4 块:8(扇区数) IO 块:4096(一块4096) 普通文件
设备:fd00h/64768d Inode:68962769 硬链接:1
权限:(0777/-rwxrwxrwx) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2022-03-12 16:10:53.910127740 +0800
最近更改:2022-03-12 16:24:10.406251486 +0800
最近改动:2022-03-12 16:24:32.306090597 +0800
创建时间:-
删除文件空间不释放
[root@localhost opt]#cp /dev/zero /boot/bigfile
cp: 写入"/boot/bigfile" 出错: 设备上没有空间
cp: 扩展"/boot/bigfile" 失败: 设备上没有空间
[root@localhost opt]#ls -S /boot
[root@localhost opt]#w
02:28:24 up 1:18, 6 users, load average: 0.13, 0.06, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.91.1 069月21 183days 0.07s 0.07s -bash
root pts/1 192.168.91.1 079月21 183days 0.08s 0.08s -bash
root pts/2 192.168.91.1 149月21 175days 0.07s 0.07s -bash
root pts/3 192.168.91.1 01:20 1:04m 0.07s 0.07s -bash
root pts/4 192.168.91.1 02:26 8.00s 2.52s 2.47s vim /boot/bigfile
root pts/5 192.168.91.1 01:44 0.00s 0.54s 0.01s w
[root@localhost opt]#lsof |grep delete
..............................................
80 /boot/bigfile (deleted)
[root@localhost opt]#echo " " > /boot/bigfile
1.1 硬链接与软连接
硬连接 同一个文件取不同的名或者叫多个名字(比如 苏轼 字子瞻 号东坡居士 苏二 谥号文忠 )不支持文件夹,创建一个连接数加一,多路径访问。
软连接 类似于windows里快捷方式,软连接,符号连接
ln(link)
ln [-s] 源文件或目录… 链接文件或目标位置
加s是软连接 符号连接
| 对比项 | 硬连接 | 软连接 |
|---|---|---|
| 本质 | 本质是同一个文件 | 本质不是同一个文件 |
| inode | 相同 | 不同 |
| 连接数 | 创建新的硬链接,链接数会增加,删除硬链接,链接数减少 | 删除新建不会改变 |
| 文件夹 | 不支持 | 支持 |
| 删除源文件 | 只是链接数减一,但链接文件的访问不受影响 | 无法访问连接文件 |
| 文件类型 | 和源文件相同 | 链接文件,和源文件无关 |
| 文件大小 | 和源文件相同 | 源文件的路径的长度 |
2 文件恢复extundelete
删除一个文件,实际上并不清除 inode 节点和 block 的数据,只是在这个文件的父目录 里面的 block 中,删除这个文件的名字。Linux 是通过 Link 的数量来控制文件删除的,只有 当一个文件不存在任何 Link 的时候,这个文件才会被删除。在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情 况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收 站”找回的情况,比如使用“rm -rf”来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复 工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一个开源的 Linux 数据 恢复工具,支持 ext3 文件系统。
2.1使用 extundelete 工具如何恢复误删除的文件
在编译安装 extundelete 之前需要先安装两个依赖包 e2fsprogs-libs 和 e2fsprogs-devel,
这两个包在系统安装光盘的/Package 目录下就有,使用 rpm 或 yum 命令将其安装。
e2fsprogs-devel 安装依赖于 libcom_err-devel 包
[root@localhost ~]#yum -y install e2fsprogs-devel e2fsprogs-libs
#安装依赖软件
[root@localhost ~]# tar -jxvf extundelete-0.2.4.tar.bz2 -C /opt
#解压软件
[root@localhost ~]# cd /opt/extundelete-0.2.4
#切换到目录下
[root@localhost extundelete-0.2.4]# ./configure
#编译安装
[root@localhost extundelete-0.2.4]#make
[root@localhost extundelete-0.2.4]#make install
[root@localhost extundelete-0.2.4]#cd /usr/local/bin/
[root@localhost bin]#ls
extundelete you-get
#验证恢复,目前使用版本只对ext3 有效,分区略
[root@localhost ~]# mkfs.ext3 /dev/sdb1
[root@localhost ~]# mkdir /test/
[root@localhost ~]# mount /dev/sdb1 /test/
[root@localhost ~]# cd /test/
[root@localhost test]# echo a>a
[root@localhost test]# echo a>b
[root@localhost test]# echo a>c
[root@localhost test]# echo a>d
2.2模拟删除并恢复
可以使用extundelete /dev/sdb1 --inode 2
查看文件系统/dev/sdb1 下存在哪些文件,
具体的使用情况。其中--inode 2 代表从 i 节点为 2 的文件开始查看,一般文件系统格式化挂
载之后,i 节点是从 2 开始的,2 代表该文件系统最开始的目录。
在恢复前需要先解挂载
[root@localhost test]# rm -rf a b
#模拟删除
[root@localhost test]# ls c d lost+foun
[root@localhost test]# cd
[root@localhost ~]# umount /test/
#解挂载
[root@localhost ~]#extundelete /dev/sdb1 --inode 2
# 命令 查看的分区 从2节点开始
#查看该分区下的存在哪些文件
[root@localhost ~]# extundelete /dev/sdb1 --restore-all
# 命令 需要恢复的分区设备 恢复选项,全都要
#使用恢复
3 xfs类型备份和恢复
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 后面不能直接跟路径
使用 xfsdump 时,需要注意以下的几个限制:
- 不支持没有挂载的文件系统备份,所以只能备份已挂载的;
- 必须使用 root 的权限才能操作;
- 只能备份 XFS 文件系统;
- 备份下来的数据只能让 xfsrestore 解析;
- 不能备份两个具有相同 UUID 的文件系统(可使用blkid查看)。
具体过程
##########前期准备
[root@localhost opt]#mkfs.xfs -f /dev/sdb1
#-f强制格式化
[root@localhost ~]# fdisk /dev/sdb
#分区略
[root@localhost data]#partprobe /dev/sdb
#刷新分区
[root@localhost ~]# mkfs.xfs /dev/sdb1
#格式化
[root@localhost ~]# mkdir /date
[root@localhost ~]# mount /dev/sdb1 /date/
#挂载
[root@localhost ~]# cd /date
[root@localhost date]# cp /etc/passwd ./
#将passwd文件拷入
[root@localhost date]# mkdir test
[root@localhost date]# touch test/a
############备份
[root@localhost data]#rpm -qa |grep xfsdump
#查看是否已安装
xfsdump-3.1.4-1.el7.x86_64
[root@localhost data]#yum install xfsdump -y
#未安装可以使用yum安装
[root@localhost ~]# xfsdump -f /opt/dump_sdb2 /dev/sdb2 [-L dump_sdb1 -M sdb1]
# 命令 指定备份目录路径 分区 打上标记 现在不打后面也要输入
#使用 xfsdump 命令备份整个分区 并打上标记
[root@localhost ~]#xfsdump -f /opt/dump_sdb2 /dev/sdb2
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control
============================= dump label dialog ==============================
please enter label for this dump session (timeout in 300 sec)
-> dump_sdb2 (文件标签)
please enter label for media in drive 0 (timeout in 300 sec)
-> sdb2(设备标签)
media label entered: "sdb2"
4 日志
内核及系统日志由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf
Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下
4.1常见的一些日志文件:
| 日志文件位置 | 日志文件说明 |
|---|---|
| /var/log/messages内核和公共日志 | 它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。I/O 错误、网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为 root,已及用户自定义安装软件的日志,也会在这里列出。 |
| /var/log/cron 计划任务日志 | 记录与系统定时任务相关的曰志 |
| /var/log/dmesg 系统引导日志 | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 |
| /var/log/maillog 邮件日志 | 记录邮件信息的曰志 |
| 用户日志 | |
| /var/log/lastlog | 记录系统中所有用户最后一次的登录时间的曰志。这个文件也是二进制文件.不能直接用Vi 查看。而要使用lastlog命令查看 |
| /var/log/secure | 记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
| /var/log/wtmp | 永久记录所有用户的登陆、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看 |
| /var/tun/ulmp | 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用Vi查看,而要使用w、who、users等命令查看 |
日志文件的格式:
日志文件的格式包含以下 4 列:
- 事件产生的时间。
- 产生事件的服务器的主机名。
- 产生事件的服务名或程序名。
- 事件的具体信息。
4.2 内核和公共日志
日志的配置文件 位置在 /etc/rsyslog.conf
[root@localhost ~]#vim /etc/rsyslog.conf
#查看rsyslog.conf 配置文件
*.info;mail.none;authpriv.none;cron.none /var/log/messages
#表示所有info等级以上的所有等级的信息都写到对应的日志文件里
mail.none
#表示某事件的信息不写到日志文件里(这里比如是邮件)
信息的优先级别重要程度
在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同 的优先级别(数字等级越小,优先级越高,消息越重要)。
0 EMERG(紧急):会导致主机系统不可用的情况。
1 ALERT(警告):必须马上采取措施解决的问题。
2 CRIT(严重):比较严重的情况。
3 ERR(错误):运行出现错误。
4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。
5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。
6 INFO(信息):一般信息。
7 DEBUG(调试):程序或系统调试信息等
内核和公共消息日志存储位置
内核及大多数系统消息被记录到公共日志文件/var/log/messages 中,而其他一些程序
消息被记录到各自独立的日志文件中,此外日志消息还能够记录到特定的存储设备中,或者
直接发送给指定用户。
对于 rsyslog 服务统一管理的大部分日志文件,使用的日志记录格式基本上是相同的。
以公共日志/var/log/messages 文件的记录格式为例,其中每一行表示一条日志消息,每
一条消息均包括以下四个字段。
- 时间标签:消息发出的日期和时间。
- 主机名:生成消息的计算机的名称。
- 子系统名称:发出消息的应用程序的名称。
- 消息:消息的具体内容。
4.2用户日志
在 wtmp、btmp、
lastlog 等日志文件中,保存了系统用户登录、退出等相关的事件消息。
但是这些文件都是二进制的数据文件,不能直接使用 tail、less 等文本查看工具进行浏览,
需要使用 who、w、users、last 和 lastb 等用户查询命令来获取日志信息
4.2.1查询当前登录的用户情况
users
users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数
[root@localhost log]#users
root
who
who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可
以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用
户名、终端类型、登录日期及远程主机
[root@localhost log]#who
root pts/0 2021-09-20 20:12 (192.168.91.1)
root pts/3 2021-09-20 13:09 (192.168.91.1)
zhangsan :0 2021-09-20 20:12 (:0
w
w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。
[root@localhost log]#w
20:16:08 up 7:16, 3 users, load average: 0.07, 0.06, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.91.1 20:12 4:00 0.06s 0.02s bash
root pts/3 192.168.91.1 13:09 0.00s 0.96s 0.02s w
zhangsan :0 :0 20:12 ?xdm? 1:39 0.17s /usr/libexec/gnome-session-binary -
4.2.2查询用户登录的历史记录
last
last 命令用于查询成功登录到系统的用户记录,
最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。
[root@localhost ~]# last
root pts/0 192.168.58.1 Wed Mar 30 21:04 still logged in
root :0 :0 Wed Mar 30 21:03 still logged in
reboot system boot 3.10.0-693.el7.x Wed Mar 30 21:02 - 22:58 (01:55)
root pts/2 192.168.58.1 Wed Mar 30 16:48 - crash (04:13)
root pts/1 192.168.58.1 Wed Mar 30 16:25 - crash (04:36)
root pts/0 :0 Wed Mar 30 16:24 - crash (04:38)
root pts/0 :0 Thu Mar 17 20:20 - 20:32 (00:11)
root pts/0 :0 Thu Mar 17 06:22 - 06:22 (00:00)
root :0 :0 Thu Mar 17 06:21 - crash (13+14:40)
reboot system boot 3.10.0-693.el7.x Thu Mar 17 06:21 - 22:58 (13+16:37)
wtmp begins Thu Mar 17 06:21:02 2022
lastb
lastb 命令用于查询登录失败的用户记录,
如登录的用户名错误、密码不正确等情况都 将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除 了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。
[root@localhost ~]# lastb
btmp begins Wed Mar 30 21:02:19 2022