987 字
5 分钟
Linux inode 不足与小文件排查
磁盘还有剩余空间,却无法创建文件,并不一定是容量问题。Linux 文件系统还需要 inode 保存文件类型、权限、时间戳和数据块位置等元数据;大量小文件可能先耗尽 inode。
inode 是什么
一个常规文件、目录、符号链接通常都会占用一个 inode。文件内容大小与 inode 数量不是同一个维度:一百万个 1 KB 小文件只占约 1 GB 数据空间,却可能耗尽为分区预留的 inode。
先确认是否真的耗尽
# 查看数据块容量findmnt -T /var/lib/appdf -h /var/lib/app
# 查看 inode 使用率df -i /var/lib/app典型现象是 IUse% 接近 100%,同时应用出现 No space left on device。还要同时排除只读挂载、用户配额和目录权限问题:
findmnt -no OPTIONS /var/lib/appquota -s 2>/dev/null || truenamei -l /var/lib/app定位 inode 数量最多的目录
先在同一个文件系统内统计目录分布,-xdev 可以避免进入其他挂载点:
sudo find /var -xdev -printf '%h\n' \ | sort \ | uniq -c \ | sort -nr \ | head -n 30对可疑目录继续缩小范围:
sudo find /var/lib -xdev -type f | wc -lsudo find /var/lib/app -xdev -maxdepth 2 -type f \ -printf '%h\n' | sort | uniq -c | sort -nr | head只看 du -sh 容易漏掉问题,因为它主要回答“占了多少数据块”,而不是“创建了多少目录项”。
安全清理顺序
- 查阅应用文档,确认哪些缓存、临时文件和任务产物允许删除。
- 检查日志轮转是否生效,优先压缩或归档历史日志。
- 对长期保存的大量小文件先打包,再转移到对象存储或归档盘。
- 删除前检查文件是否仍被进程打开。
- 清理后再次执行
df -i,确认 inode 使用率确实下降。
查看已删除但仍被进程占用的文件:
sudo lsof +L1查找零字节文件只能作为线索,不能直接批量删除:
sudo find /var/lib/app -xdev -type f -size 0c -printWARNING不要把
find ... -delete直接用于不了解的数据目录。先输出文件列表、抽样检查并准备备份,再执行删除。
ext4 创建时的 inode 规划
inode 数量通常在创建文件系统时决定。面向大量小文件的分区,可以在确认业务模型后选择更适合的使用类型:
sudo mkfs.ext4 -T small /dev/sdX1sudo tune2fs -l /dev/sdX1 | grep -E 'Inode count|Block size|Inode size'-T small 会影响块大小和 inode 密度,并不适合所有负载。小块可能增加大文件的元数据与寻址开销,因此需要用真实文件规模和读写模式做基准测试。
mkfs.ext4 会重新创建文件系统并破坏原有数据。已有 ext4 文件系统的 inode 总量通常不能在原地安全扩大;正确流程是备份、重新规划文件系统、格式化并恢复数据。
常见误区
- 磁盘没满就不是空间问题: inode 耗尽同样会返回空间不足。
- 删除几个大文件就能恢复: 一个大文件只释放一个 inode;应处理数量最多的小文件集合。
- 重启会恢复 inode: inode 是文件系统资源,重启不会自动增加。
- 只提高 inode 数量: 如果应用无上限地产生文件,最终仍会再次耗尽,应同时增加生命周期管理。
排障清单
1. df -h 与 df -i 同时检查2. 确认挂载点、只读状态、配额和权限3. 使用 find -xdev 按目录统计文件数量4. 找到文件产生者和保留策略5. 先归档、再清理、最后复查6. 长期修复写入日志轮转、缓存上限或对象存储方案本文根据早期个人笔记重新整理,并结合当前通用实践进行了校对。
Linux inode 不足与小文件排查
https://zh19990906.github.io/fuwari/posts/linux-inode-troubleshooting/