记一次 Linux 磁盘 inode 耗尽事故:空间还剩 50G 却报 No space left
【摘要】 尝试创建文件报错 No space left on device,但 df -h 显示仍有大量剩余空间。本文记录 inode 耗尽排障与数百万细碎小文件快速清理实战。
在开发机上执行 mkdir test 或写入日志时,系统报错:
mkdir: cannot create directory 'test': No space left on device
执行 df -h 检查磁盘,发现根分区明明还剩余 52GB,使用率仅为 42%。
一、排查 inode 使用情况
在 ext4/xfs 文件系统中,每个文件都需要占用一个 inode 节点存储元数据。如果存在海量微小文件,inode 可能会先于磁盘容量被消耗殆尽。
执行 df -i 查看 inode 分布:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 3276800 3276800 0 100% /
果然,327 万个 inode 已经被 100% 占满!
二、定位是哪个目录被小文件塞满
编写简短 Shell 脚本逐层排查包含文件最多的目录:
for d in /*; do
echo "$d $(find "$d" -maxdepth 1 2>/dev/null | wc -l)"
done | sort -k2 -nr | head -n 5
逐级下钻,最终锁定了罪魁祸首目录:/var/spool/postfix/maildrop/,里面堆积了超过 280 万个未发送成功的系统 cron 邮件临时文件。
三、安全清理海量小文件
注意:当一个目录包含数百万文件时,直接执行 rm -rf * 会触发 Argument list too long 错误。必须使用 find 配合 delete:
cd /var/spool/postfix/maildrop/
find . -type f -delete
同时在 /etc/crontab 开头加上 MAILTO="",杜绝定时任务失败自动发邮件导致的垃圾文件堆积。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)