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

磁盘空间不足时,不能只看表面现象,得从三类典型原因入手:真实文件占满、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/logs、MySQL 的 binlog 或慢查询日志。
检查被进程占用的已删除文件
有时删了几十 GB 日志,df -h 却不释放空间——大概率是进程还在写这个已被删除的文件。此时需用 lsof 检查:
- 安装 lsof(如未预装):yum install -y lsof 或 apt install -y lsof
- 查找已删但未释放的文件:lsof +L1 或 lsof | 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% 的磁盘打满场景。










