Linux磁盘爆满排查教程_inode与空间问题解决

13次阅读

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

Linux磁盘爆满排查教程_inode与空间问题解决

linux磁盘显示“空间不足”,但df -hdu -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 +L1lsof | 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

text=ZqhQzanResources