答案是inode耗尽或小文件堆积导致,需先用df -h和df -i区分空间满还是inode满,再用find或ncdu定位高占用目录,最后针对性清理并配置预防措施。
Linux磁盘显示“空间不足”,但df -h和du -sh *结果对不上?大概率是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可查)进入疑似挂载点(如/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满:
find /var/log -name "*.log.*" -mtime +30 -delete(删30天前的压缩日志)ls -l /var/spool/mail/,大量零字节或超龄邮件文件可批量清理systemctl stop rsyslog(仅调试用,勿长期停)若空间满但du不匹配:
lsof +L1 或 lsof | grep deleted
在往旧文件句柄写;重启对应服务即可释放空间echo > /proc/PID/fd/FD_NUMBER(仅限明确可丢弃的日志)治标更要治本:
/tmp和/var/log配置tmpfiles.d自动清理规则(如/etc/tmpfiles.d/local.conf中加D /var/log/myapp 0755 root root 30d)node_filesystem_files_free指标告警ulimit -n或在/etc/security/limits.conf中设置hard nofile