Linux磁盘空间不足排查_磁盘占用分析方法

2次阅读

磁盘空间不足需按三步排查:先用df -h查使用率,再用df -i查inode耗尽,最后用lsof +l1找已删除未释放文件;对应清理日志、限制journald、清理docker等。

Linux磁盘空间不足排查_磁盘占用分析方法

磁盘空间不足时,不能只看表面现象,得从三类典型原因入手:真实文件占满、Inode耗尽、已删除但未释放空间的文件。每种情况对应不同的排查路径和命令组合,顺序错了容易白忙活。

确认磁盘实际使用率和挂载点

先用 df -h 查整体占用,重点关注 Use% 达到 90% 以上的挂载点(如 //var/home)。如果显示 100%,说明空间确实告急;如果显示还有余量但系统报 “No space left on device”,就要怀疑是不是 Inode 耗尽或文件被进程锁住没释放。

接着执行 df -i 查 Inode 使用率。若 IUse% 接近或等于 100%,即使 df -h 显示空间充足,也无法新建文件——这是大量小文件(比如日志碎片、临时缓存、邮件队列)导致的常见假象。

定位大目录和大文件

在问题挂载点下(比如根目录),用以下命令逐层缩小范围:

  • du -sh /* 2>/dev/NULL | sort -hr | head -10 —— 快速列出根下前 10 大目录
  • du -sh /var/* 2>/dev/null | sort -hr | head -10 —— 若 /var 占用高,进一步聚焦
  • find /var/log -type f -size +100M -exec ls -lh {} ; —— 直接找大于 100MB 的日志文件
  • du -sh –max-depth=1 /var/log/* 2>/dev/null | sort -hr —— 看各服务日志子目录总大小

常见“空间杀手”包括:/var/log/journal(journald 日志)、/var/lib/docker/overlay2(Docker 容器层)、/usr/local/tomcat/logsmysqlbinlog 或慢查询日志。

检查被进程占用的已删除文件

有时删了几十 GB 日志,df -h 却不释放空间——大概率是进程还在写这个已被删除的文件。此时需用 lsof 检查:

  • 安装 lsof(如未预装):yum install -y lsofapt install -y lsof
  • 查找已删但未释放的文件:lsof +L1lsof | grep deleted
  • 重点看输出中的 SIZE/OFF 列(单位字节)和 PID 列,例如:
    java 7053 root 1w REG 202,1 1180888 /usr/local/tomcat/logs/catalina.out (deleted)
  • 确认进程用途后,可重启服务(如 systemctl restart tomcat)或 kill 进程释放空间

针对性清理与预防建议

确认目标后,清理要克制且可逆:

  • 清日志优先用 truncate -s 0 filename,比 rm 更安全,不中断进程写入
  • journald 日志限制:journalctl –vacuum-size=500M 或修改 /etc/systemd/journald.conf 中的 SystemMaxUse=500M
  • Docker 清理:docker system prune -a –volumes(慎用,会删所有未用镜像和卷)
  • 设置 logrotate 规则,避免单个日志无限增长;对 /tmp 加上 tmpfs 挂载或定时清理

排查本身不复杂,但容易忽略 Inode 和已删文件这两类“隐形占位者”。动手前务必确认挂载点、查 Inode、扫 deleted 文件,三步走稳了,基本能覆盖 95% 的磁盘打满场景。

text=ZqhQzanResources