答案是inode耗尽或小文件堆积导致,需先用df -h和df -i区分空间满还是inode满,再用find或ncdu定位高占用目录,最后针对性清理并配置预防措施。

Linux磁盘显示“空间不足”,但df -h和du -sh *结果对不上?大概率是inode耗尽,或小文件堆积导致空间无法释放。别急着删日志,先分清是“没空间”还是“没inode”——这是排查的起点。
第一步:确认到底是空间满,还是inode满
运行两个命令对比:
-
df -h:看各挂载点的磁盘使用率(Size/Used/Avail) -
df -i:看各挂载点的inode使用率(IUsed/IFree/IUse%)
常见异常组合:
-
df -h显示使用率95%,但df -i显示IUse%接近100% → inode耗尽,典型于海量小文件(如缓存、邮件临时文件、未清理的/tmp) -
df -h显示已满,但du -sh /path总和远小于Used → 可能有已删除但进程仍占用的大文件(lsof可查)
第二步:快速定位高inode占用目录
进入疑似挂载点(如/var),执行:
find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -nr | head -10
这条命令统计每个二级子目录下的文件数量(按降序排前10)。例如输出:
482312 ./log
120944 ./spool
87652 ./cache
说明/var/log下有近50万文件,极可能是日志轮转失效或应用未清理所致。
更直观方式(需安装ncdu):
ncdu -x /var
交互式查看各目录文件数与磁盘占用,支持按文件数排序(按Ctrl+d切换排序方式)。
第三步:释放inode或空间的具体操作
若inode满:
- 清空无用小文件:
find /var/log -name "*.log.*" -mtime +30 -delete(删30天前的压缩日志) - 检查mail spool:
ls -l /var/spool/mail/,大量零字节或超龄邮件文件可批量清理 - 临时禁用日志生成:如
systemctl stop rsyslog(仅调试用,勿长期停)
若空间满但du不匹配:
- 查被删除但仍被进程占用的文件:
lsof +L1或lsof | grep deleted - 常见场景:nginx/apache日志被logrotate重命名后,主进程仍在往旧文件句柄写;重启对应服务即可释放空间
- 强制释放(不推荐):
echo > /proc/PID/fd/FD_NUMBER(仅限明确可丢弃的日志)
第四步:预防再次发生
治标更要治本:
- 为
/tmp和/var/log配置tmpfiles.d自动清理规则(如/etc/tmpfiles.d/local.conf中加D /var/log/myapp 0755 root root 30d) - 监控inode使用率:Zabbix/Prometheus添加
node_filesystem_files_free指标告警 - 限制用户创建过多文件:
ulimit -n或在/etc/security/limits.conf中设置hard nofile










