磁盘空间满时应先用df -h定位问题分区,再用du逐级排查大目录,接着用find查找大文件,最后检查lsof +L1确认被删未释放文件;清理优先清空日志、配置轮转、删除旧备份,避免直接rm -rf。

磁盘空间满了,第一反应不是删文件,而是先搞清楚“谁占的、占在哪、能不能动”。快速定位+安全清理,才是不背锅的关键。
看整体:用 df -h 锁定问题分区
运行 df -h,重点关注 Use% 列。比如输出中 /dev/vda1 100G 100G 0 100% /,说明根分区已满。注意排除 tmpfs、devtmpfs 等内存伪文件系统(它们不占磁盘),可用 df -h -x tmpfs -x devtmpfs 过滤。
查目录:用 du 定位占用大户
在满的挂载点下逐层排查:
- 一级目录汇总:执行
du -sh /* 2>/dev/NULL | sort -rh | head -10,快速看到哪些根级目录最大(常见如/var、/home、/opt) - 二级深入:进到大目录里,例如
cd /var && du -sh * 2>/dev/null | sort -rh | head -10 - 跳过深度遍历卡顿:用
du -h --max-depth=1 /var | grep -E '[0-9][GTM]'直接筛出 GB/TB 级目录
找文件:用 find 定位具体元凶
确认大目录后,聚焦单个大文件:
- 查大于 100MB 的日志或普通文件:
find /var/log -type f -size +100M -exec ls -lh {} ; - 按大小排序前 20:
find /var -type f -size +50M -exec du -h {} ; 2>/dev/null | sort -hr | head -20 - 注意隐藏大文件:加
-a参数可包含点开头文件,如du -ah /var/log | sort -hr | head -10
防遗漏:检查被删未释放的空间
有时 df 显示已满,但 du 统计总和远小于此——很可能是文件已被 rm,但进程还在写它。
- 运行
lsof +L1或lsof | grep deleted,列出被删除却仍被打开的文件 - 输出中会带 PID 和路径,例如
nginx 1234 root 7w REG 253,1 2.1G 123456 /var/log/nginx/access.log (deleted) - 重启对应服务即可释放空间:
systemctl restart nginx,或kill -USR1 $(cat /var/run/nginx.pid)(视服务支持而定)
基本上就这些。排查讲顺序,清理讲方法——别直接 rm -rf,优先清空日志、轮转配置、删旧备份。日常加个 logrotate,比救火强十倍。