记一次 Linux 磁盘 inode 耗尽事故:空间还剩 50G 却报 No space left

举报
yd_218612773 发表于 2026/11/06 09:11:14 2026/11/06
【摘要】 尝试创建文件报错 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。