inode 是什么,和磁盘空间什么关系,满了怎么清
一、一个经典场景
你有没有遇到过这种情况:
服务器的 df -h 显示磁盘还剩 50GB,但你 touch test.txt 的时候,系统告诉你:
touch: cannot touch 'test.txt': No space left on device
磁盘有空间,但写不了文件——那到底是谁把空间"占"了?
答案是:磁盘空间没占满,但 inode 占满了。
今天就把这个东西聊透。
二、inode 是什么
inode = index node(索引节点)。
当你创建一个文件时,Linux 文件系统做两件事:
- 分配一个 inode — 用来存文件的元数据(权限、所有者、大小、时间戳、数据块指针等)
- 分配 data block — 用来存文件的实际内容
文件名 → inode → data block ↓ 元数据(权限、大小、时间...)
每个文件/目录都有一个 inode。注意目录本身也是文件,也占一个 inode。
三、inode 和磁盘空间的关系
这是最常被混淆的地方。拿出两个命令来看:
df -h → 看磁盘空间(data block 使用率)df -i → 看 inode 使用率
它们是完全独立的指标。inode 满不会影响现有文件的读写,但任何创建新文件/目录的操作都会失败。
四、inode 满了会有什么影响
真实故障场景:
- 系统服务崩溃 — syslog/rsyslog 写不了新日志
- 邮件队列崩了 — Postfix/Exim 无法创建新队列文件
- Docker 容器起不来 — overlay 层创建失败
- 数据库异常 — 某些数据库需要先写临时文件再 rename
识别方法:当 df -h 显示有余量但系统报 No space left on device 时,第一时间跑 df -i。
五、什么场景会耗尽 inode
inode 撑爆的常见元凶:
- 邮件队列表象 - /var/spool/postfix/maildrop/ 未送达邮件积压数百万个几字节的小文件
- Docker overlay2 - /var/lib/docker/overlay2/ 每层镜像产生大量元数据
- node_modules - 前端项目动辄数万个文件
- 日志切割但没清理 - /var/log/*.gz 长期累积
- 临时文件没清理 - /tmp/ /var/tmp/ 年久日深
- 回收站 .Trash - GUI 系统下累积海量文件
六、怎么检查 inode
df -i
输出示例:
Filesystem Inodes IUsed IFree IUse% Mounted on/dev/sda1 655360 655360 0 100% /
IUse% = 100% 就是问题所在。
统计各目录文件数:
for d in /*; do echo "$(find $d -xdev -type f | wc -l) $d"; done | sort -rn | head -10
七、怎么清理 inode
清理 inode = 删除大量小文件。
# 最常用find /path/to/dir -type f -delete# 按时间筛选find /path/to/dir -type f -mtime +30 -delete# 清理邮件队列systemctl stop postfixfind /var/spool/postfix/maildrop -type f -deletesystemctl start postfix# 清理 Dockerdocker system prune -af# 终极手段 - rsync 重建目录mkdir /tmp/emptydirrsync -a --delete /tmp/emptydir/ /var/spool/problem-dir/
八、如何预防 inode 耗尽
- 监控 df -i,inode 使用率超过 80% 报警
- 分区规划:将 /var /tmp 单独分区,格式化时用 mkfs.ext4 -i 16384 调大 inode 数量
九、总结
一句话记住 inode:
df -h 看数据块(内容能不能写),df -i 看 inode(文件能不能建)。
日常记住了:遇到 No space left 时,先跑 df -h,再看 df -i,double check 不会错。
本文为 Linux 基础概念科普。文中所用命令适用于 ext4/xfs 文件系统,其他文件系统可能略有差异。
封面图为本公众号调用AI 工具生成