Llinxu 文件系统与日志分析
一:Linux 中的文件
1.1 文件的组成与存储
文件是存储在硬盘上,硬盘的最小存储单位是“扇区(sector)” ,每个扇区存储512 字节
一般连续的 8 个扇区组成一个“块(block)”,一个块大小是4k 。这是文件存取的最小单位
inode(索引节点/ i 节点) ,用于存放文件元数据
文件分为文件名和文件数据,文件名和文件数据分开存放。文件数据包括实际数据与元数据(元数据:描述数据的数据,如文件按创建者,创建日期,文件大小,文件权限等)。
- 文件名存放在目录中,即,上一级的文件数据中。
- 文件实际数据存放在“块” 中
- 存放元数据的区域就做 inode。
1.2 文件的读取
每个inode区域都有一个号码,操作系统用inode 号码来识别。
Linux系统内部不使用文件名,而使用inode号码来识别文件。
对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。

假设,某文件的元数据存放在inode 4 位置,它记录了文件的描述信息,以及对应的 块 block 。实际存储文件数据的 块有 block 1 ,block 6 , block 12 。
系统查找文件 ,找到 inode 4 区域后,调用其 对应的 块 block
1.3 查看文件的inode 信息
stat 文件名
1 [root@promote opt]# stat abc.txt #查看文件abc.txt 的属性 2 文件:"abc.txt" 3 大小:4 块:8 IO 块:4096 普通文件 4 设备:803h/2051d Inode:67355544 硬链接:1 #inode 号 5 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 6 环境:unconfined_u:object_r:usr_t:s0 7 最近访问:2021-06-27 15:58:41.832261630 +0800 8 最近更改:2021-06-27 15:58:50.927505264 +0800 9 最近改动:2021-06-27 15:58:50.927505264 +0800
# ls -i 文件名 也可以快速查看文件的inode 号
1.4 inode 的大小与特殊作用
[root@promote opt]# df -i /dev/sda 查看硬盘/dev/sda 的inodo号总数和使用情况
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 250316 391 249925 1% /dev
特殊作用
- 文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用;
- 移动文件或重命名文件,只是改变文件名,不影响inode号码;
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。
- vim 修改文件数据被修改保存后,会生成一个新的inode号码。
- 重定向方式修改文件数据,不会改变inode 号
1.4.1 通过inode 号删除文件
使用find 命令查找inode 号,然后删除
使用find 命令,三种通过 inode 号删除文件的方法
[root@promote opt]# ls
abc.txt rh
[root@promote opt]# ls -i
67355544 abc.txt 69088815 rh
[root@promote opt]# find /opt/ -inum 67355544 -delete
[root@promote opt]# ls
rh
[root@promote opt]# ls
rh test.txt
[root@promote opt]# ls -i test.txt
67355544 test.txt
[root@promote opt]# find /opt/ -inum 67355544 -exec rm -rf {} \;
[root@promote opt]# ls
rh
[root@promote opt]# ls
123.txt rh
[root@promote opt]# ls -i 123.txt
67355544 123.txt
[root@promote opt]# find /opt/ -inum 67355544 | xargs rm -rf
[root@promote opt]# ls
rh
1.4.2 对文件操作,查看inode 号变化
移动文件,重命名文件,复制文件,vim修改文件数据 ,重定向写入
移动文件和重名名文件,inode 号不变
[root@promote opt]# touch abc.txt
[root@promote opt]# ls -i abc.txt
67355544 abc.txt
[root@promote opt]# mv abc.txt /root/ #移动文件
[root@promote opt]# ls -i /root/abc.txt #查看发现 文件 inode 号没有改变
67355544 /root/abc.txt
[root@promote opt]# mv /root/abc.txt /root/test.txt #重命名文件
[root@promote opt]# ls -i /root/test.txt #查看发现文件 inode 号没有改变
67355544 /root/test.txt
复制文件,vim 写入文件, 新文件的inode 号改变
[root@promote ~]# ls -i test.txt 67355544 test.txt [root@promote ~]# cp test.txt /opt/ #复制文件 [root@promote ~]# ls /opt/test.txt /opt/test.txt [root@promote ~]# ls -i /opt/test.txt #新文件的inode 号改变 68335094 /opt/test.txt [root@promote ~]# ls -i test.txt 67355544 test.txt [root@promote ~]# cat test.txt [root@promote ~]# vim test.txt #vim修改文件内容 abc "test.txt" 1L, 4C 已写入 [root@promote ~]# cat test.txt abc [root@promote ~]# ls -i test.txt #inode 号改变 67355545 test.txt
使用重定向写入的方式修改文件内容,inode 号不变
[root@promote opt]# ls
rh test.txt
[root@promote opt]# ls -i test.txt
68335094 test.txt
[root@promote opt]# cat test.txt
abc
[root@promote opt]# echo "123" >> test.txt #追加重定向的方式改变文件内容
[root@promote opt]# cat test.txt
abc
123
[root@promote opt]# ls -i test.txt #查看inode 号没有改变
68335094 test.txt
[root@promote opt]# echo "hahaha" > test.txt #覆盖重定向的 方式改变文件内容
[root@promote opt]# cat test.txt
hahaha
[root@promote opt]# ls -i test.txt #文件的inode 号没有改变
68335094 test.txt
二: 节点耗尽 与恢复文件
2.1 inode 节点耗尽
在格式化文件系统时,会分配固定的inode号 。在存储文件时,每个文件都会消耗一个inode 号。当inode 号被消耗完,即使磁盘依旧有剩余空间,也无法写入数据
2.1.1 fdisk 创建分区,格式化为 ext 文件系统, 挂载使用
[root@promote opt]# fdisk /dev/sdb
[root@promote opt]# partprobe /dev/sdb1
[root@promote opt]# mkfs.ext4 /dev/sdb1
oot@promote opt]# mkdir /test
[root@promote opt]# mount /dev/sdb1 /test
[root@promote opt]# df -i /dev/sdb1v #查看磁盘 /dev/sdb1 的inode 节点
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb1 2560 11 2549 1% /test
2.1.2 模拟 inode 节点耗尽
[root@promote opt]# for ((i=1;i<=2549;i++)) > do > touch /test/file$i > done #创建2549 个文件,耗尽inode 号 [root@promote opt]# df -i /dev/sdb1 #查看发现可用 inode 为0 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 /dev/sdb1 2560 2560 0 100% /test
[root@promote test]# df -h /dev/sdb1 #查看发现可用空间还剩 7.8 M 文件系统 容量 已用 可用 已用% 挂载点 /dev/sdb1 8.7M 230K 7.8M 3% /test
[root@promote test]# touch a.txt touch: 无法创建"a.txt": 设备上没有空间 #无法写入文件
2.1.3 删除文件后inode 号恢复
[root@promote test]# rm -rf /test/* #删除文件
[root@promote test]# df -i /dev/sdb1 #inode 节点恢复
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb1 2560 10 2550 1% /tes
[root@promote test]# touch a.txt #成功创建新文件
[root@promote test]# ls
a.txt
2.2 恢复 ext文件类型
使用extundelete 工具恢复
(1) 使用fdisk创建分区,格式化为 ext3 文件系统
[root@promote test]# fdisk /dev/sdb
[root@promote test]# partprobe /dev/sdb2
[root@promote test]# mkfs.ext3 /dev/sdb2
[root@promote test]# mkdir /data/
[root@promote test]# mount /dev/sdb2 /data
[root@promote test]# df -hT /dev/sdb2
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb2 ext3 4.8G 11M 4.6G 1% /data
(2)安装extundelete
[root@promote test]# yum -y install e2fsprogs-libs e2fsprogs-devel #安装依赖包 [root@promote opt]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 [root@promote opt]# tar -jxvf extundelete-0.2.4.tar.bz2 [root@promote opt]# cd extundelete-0.2.4/ [root@promote extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete [root@promote extundelete-0.2.4]# make && make install #编译安装 [root@promote extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/ #将源码包的命令都设置软连接到 /usr/bin
(3) 模拟删除并恢复
[root@promote opt]# cd /data/
[root@promote data]# for i in {a,b,c,d}
> do
> echo a>$i
> done
[root@promote data]# ls
a b c d
[root@promote data]# extundelete /dev/sdb2 --inode 2 ##查看文件系统/dev/sdc1下存在哪些文件, i节点是从2开始的, 2代表该文件系统最开始的目录。
#如下图
[root@promote data]# rm -rf a b #删除 文件 a b
[root@promote data]# extundelete /dev/sdb2 --inode 2 #查看 /dev/sdb2 下存在哪些文件
[root@promote data]# cd /opt
[root@promote opt]# umount /data
[root@promote opt]# extundelete /dev/sdb2 --restore-all #恢复文件
#恢复/dev/sdc1文件系统下的所有内容#在当前目录下会出现一个RECOVERED FILES/目录,里面保存了已经恢复的文件
[root@promote opt]# ls
extundelete-0.2.4 extundelete-0.2.4.tar.bz2 RECOVERED_FILES rh
[root@promote opt]# ls RECOVERED_FILES/
a b
2.3 恢复xfs 文件系统
2.3.1 使用fdisk创建分区/dev/sdb1,格式化xfs文件系统
[root@promote opt]# fdisk /dev/sdb
[root@promote opt]# partprobe /dev/sdb
[root@promote opt]# mkfs.xfs /dev/sdb3
[root@promote opt]# mount /dev/sdb3 /data
[root@promote opt]# df -h /data
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb3 5.0G 33M 5.0G 1% /data
[root@promote data]# touch abc.txt
[root@promote data]# mkdir a
2.3.2 使用xfsdump命令备份整个分区
[root@promote data]# rpm -qa | grep xfsdump #查看是否已经安装 xfsdump 软件包
xfsdump-3.1.7-1.el7.x86_64
[root@promote data]# yum -y install xfsdump #如果没有安装则安装
[root@promote data]# xfsdump -f /opt/dump_sdb3 /dev/sdb3 -L dump_sdb3 -M sdb3
#备份 /dev/sdb3 的数据到 /opt/dump_sdb3
2.3.3 删除数据并恢复
[root@promote data]# pwd
/data
[root@promote data]# rm -rf * #删除数据
[root@promote data]# ls
[root@promote data]# xfsrestore -f /opt/dump_sdb3 /data #从/opt/dump_sdb3 中恢复 /data 中的数据
三:日志文件
3.1 日志文件的功能和分类
作用:
- 用于记录系统,程序运行中发生的各种事件
- 通过阅读日志,有助于诊断和解决系统故障
分类:
- 内核及系统日志
- 由系统服务 rsyslog 同一管理,日志格式基本相似
- 主配置文件 /etc/rsyslog.conf
- 用户日志
- 记录系统用户登录及退出系统的相关信息
- 程序日志
- 由各种应用程序独立管理的日志文件,记录格式不统一
3.2 主要日志文件介绍及保存位置
保存位置:
默认位于 /var/log 目录下
主要日志文件介绍
内核及公共消息日志 | /var/log/messages |
计划任务日志 | /var/log/cron |
系统引导日志 | /var/log/dmesg |
邮件系统日志 | /var/log/maillog |
用户登录日志 |
/var/log/lastlog /var/log/secure /var/log/wtime /var/log/btime |
3.3 日志的格式与分析
[root@promote ~]# less /var/log/messages

3.3.2 分析工具
who,users ,w,last,lastb
查看当前系统登录情况
[root@localhost ~]# who root pts/0 2021-06-28 08:12 (192.168.23.1) [root@localhost ~]# users root [root@localhost ~]# w 08:12:48 up 4 min, 1 user, load average: 0.00, 0.03, 0.02 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.23.1 08:12 0.00s 0.02s 0.00s w [root@localhost ~]#
查看登录成功与失败情况
[root@localhost ~]# last #查看成功登录的情况 root pts/3 192.168.23.10 Mon Jun 28 08:16 still logged in root pts/2 192.168.23.1 Mon Jun 28 08:14 still logged in root pts/1 192.168.23.1 Mon Jun 28 08:13 still logged in root pts/0 192.168.23.1 Mon Jun 28 08:12 still logged i [root@localhost ~]# lastb #查看失败登录的情况 root ssh:notty 192.168.23.10 Mon Jun 28 08:16 - 08:16 (00:00) root ssh:notty 192.168.23.10 Mon Jun 28 08:16 - 08:16 (00:00) root pts/0 Fri Jun 25 10:46 - 10:46 (00:00) lisi :1 :1 Fri Jun 25 08:45 - 08:45 (00:00) lisi :1 :1 Fri Jun 25 08:45 - 08:45 (00:00) root pts/0 Thu Jun 24 14:59 - 14:59 (00:00) root :0 :0 Thu Jun 24 11:18 - 11:18 (00:00) root :0 :0 Sun Jun 20 16:26 - 16:26 (00:00)
3.4 日志的管理策略
- 日志中可能会包含各类敏感信息,如账户、口令等
- 将服务器的日志文件发到统一的日志文件服务器
- 便于日志信息的统一收集、整理和分析
- 杜绝日志信息的意外丢关、恶意篡改或删除
编写计划任务,将每天的日志备份。并且删除超过30 天的日志
[root@promote httpd]# crontab -e
30 2 * * * cp -a /var/log/messages /root/messages-log/log-$(date +%F)
#每天2点30将 /var/log/messages 的日志备份到 /root/messages-log/目录下
30 3 * * * fine /root/messages-log/ -mtime +30 -delete
# 每天3点30/root/messages-log/目录下的日志, mtime 超过30 天的日志删除 (mtime,修改时间) ~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现