很多人都遇到过这种情况:
rm -f app.log
文件删了。
但执行:
df -h
磁盘空间还是满的。
文件已经不存在,空间却没回来?
如果你不理解 inode,这个问题永远解释不清。
今天这篇文章我们就来讲讲inode。
一、Linux 中,一个文件到底是什么?
在 Linux 里,一个文件由两部分组成:
1️⃣ inode(索引节点,存储元数据)2️⃣ 数据块(真正存储文件内容的磁盘空间)
inode 中保存:
而文件名,并不存储在 inode 中。
二、inode 是什么?
可以这样理解:
inode 是文件的“元数据结构”
每个文件在文件系统中都有一个唯一的 inode 号。
查看 inode 号:
ls -li
示例:
123456-rw-r--r--1 root root 1024 test.txt
解释:
三、文件名和 inode 的关系
在 Linux 中:
目录本身也是一种文件。
目录里存储的是:
文件名 → inode 号 的映射关系
也就是说:
文件名 → inode → 数据块
文件名只是 inode 的“一个入口”。
inode 才是文件真正的身份。
四、rm 删除文件时发生了什么?
当你执行:
rm test.txt
系统做的事情是:
注意一个关键点:
一个 inode 可以有多个文件名(硬链接)。
所以:
删除文件名 ≠ 删除 inode
五、磁盘空间什么时候真正释放?
Linux 只有在以下两个条件同时满足时,才会释放文件的数据块空间:
1️⃣ inode 的硬链接数为 0(没有任何文件名指向它)2️⃣ 没有任何进程仍然打开这个文件(文件描述符引用计数为 0)
如果一个文件:
那么:
数据块不会释放inode 也不会释放
这就是“删了文件但空间不释放”的本质原因。
六、真实运维场景
例如:
- 一个 2GB 的日志文件正在被 Java 程序写入
rm app.log
文件在目录中消失。
但 Java 进程仍然持有文件描述符。
此时:
七、如何排查?
查看被删除但仍被占用的文件:
lsof | grep deleted
示例输出:
java1234 user 5w REG 8,12147483648123456 /var/log/app.log (deleted)
说明:
- 但进程 1234 仍在使用 inode 123456
八、正确解决方式
方法一:重启服务
systemctl restart 服务名
方法二:结束进程
kill -9 进程号
当进程关闭文件后:
九、inode 会不会被用完?
会。
磁盘资源分为两种:
1️⃣ 数据块空间2️⃣ inode 数量
查看 inode 使用情况:
df -i
如果:
IUse%100%
说明 inode 用尽。
此时即使磁盘空间还有剩余,也无法创建新文件。
常见原因:
十、删除大量小文件但 inode 不下降?
如果 df -i 仍然很高,常见原因是:
可以使用:
find / -xdev -type f | wc -l
排查文件数量。
十一、一句话总结(严谨版)
一个 Linux 文件包含:
inode(元数据) + 数据块(内容)
文件名只是 inode 的一个“别名”。
rm 只是删除目录中的文件名映射。
只有当:
磁盘空间才会真正释放。
文 / 零距技术仓记录每一次真实的折腾 (#^.^#)🚀 想看到更多实用折腾技巧?👉 先关注💬 评论区说说你的经历或想看的内容👍 点赞表示支持🔁 顺手分享给也在折腾的人,让大家都少踩坑 😎