这是inode耗尽而非磁盘空间不足;Inode是存储文件元数据的固定数量节点,df -i可确认IUse%达100%,需用du --inodes定位高inode目录并清理残留文件或重启占用进程。

Linux系统报“No space left on device”,但df -h显示磁盘还有大量剩余空间——这大概率不是磁盘真满了,而是inode用尽。Inode是文件系统的元数据节点,每个文件、目录、软链接都必须占用一个,数量在格式化时就固定了,无法动态增加。
Inode到底是什么
Inode(索引节点)不存文件名和内容,只存文件的元信息:大小、权限、所有者、时间戳、数据块位置、硬链接数等。文件名存在目录项里,和inode通过号码关联。系统靠inode号识别文件,而非文件名。每创建一个文件,就消耗一个inode;删掉文件,只有当没进程再打开它时,inode才真正释放。
快速确认是不是inode耗尽
运行:df -i
重点关注IUse%列。只要任意挂载点(比如/var、/tmp、/home)显示100%,就可断定是inode瓶颈。别只看/根分区,各挂载点inode池相互独立。
对比df -h和df -i结果:若磁盘使用率(Use%)很低,而inode使用率(IUse%)已达100%,问题基本坐实。
定位哪个目录吃掉了最多inode
从高风险路径入手,避免全盘扫描:
- 对可疑挂载点(如
/var)执行:du --inodes -s /var/* 2>/dev/null | sort -nr | head -5 - 若发现
/var/spool/postfix/maildrop或/var/log/journal异常突出,进入该目录统计文件数:find . -maxdepth 1 -type f | wc -l - 常见“产inode大户”:
/tmp(临时文件)、/var/spool/(邮件队列)、/var/log/(未轮转日志)、/var/lib/docker/overlay2(容器残留)
安全清理与释放inode
删除文件不等于立刻回收inode,关键要看是否被进程占用:
- 批量删小文件防参数超长:
find /path/to/dir -maxdepth 1 -type f -delete
或find /tmp -name "sess_*" -print0 | xargs -0 rm -f - 查已删但未释放的文件:
lsof +L1或lsof | grep deleted
找到对应PID后,重启服务(如systemctl restart postfix)或终止进程 - 慎删整个日志目录;先用
journalctl --disk-usage查systemd日志占用,再用journalctl --vacuum-size=100M收缩
长期预防比临时清理更重要
业务持续生成小文件,光清一次没用:
- 为
/var/log配置可靠的logrotate,启用maxage和create - 检查crontab任务,禁用无意义高频执行项,或重定向输出:
>/dev/null 2>&1 - 对
/tmp挂载tmpfs并设大小上限,重启自动清空 - 新建文件系统时,按预期文件规模选参数:
mkfs.ext4 -T small(小文件多)或-T largefile(大文件少)










