先定位:df 看分区,du 看目录
磁盘告警时别急着删文件,先确认是哪个分区满了。用 df -h 看各挂载点使用率,再对告警分区做逐层下钻。核心命令是 du,关键是限制深度,避免一次扫全盘拖慢 IO。
df -h
# 假设 / 使用率 100%,先看一级目录占用
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20
找到大目录后继续下钻,把路径换成该目录即可。常见元凶是 /var/log、/var/lib/docker、应用日志目录、用户家目录下的缓存。注意 du 统计的是块占用,和 ls -l 的文件大小可能不一致,排查时以 du 为准。
找出大文件:find 按大小和类型筛
目录定位到后,用 find 精确捞出大文件。下面这条查 100M 以上普通文件,按大小排序输出,适合快速锁定日志、备份包、core dump。
find /var -xdev -type f -size +100M -printf '%st%pn' 2>/dev/null
| sort -nr | head -20
-xdev 很重要,它避免跨挂载点扫描(比如扫到 NFS 或容器挂载),既快又不会误判。再配合时间条件找陈旧文件:find /path -type f -mtime +30 -size +50M 表示 30 天未修改且大于 50M 的文件,这类通常是可清理的旧日志或临时产物。
处理“空间没释放”:被删除但仍被占用的文件
删了文件但 df 没降,多半是进程还持有已删除文件的句柄。用 lsof 查 deleted 标记:
lsof +L1 2>/dev/null | head -30
# 或
lsof | grep deleted | sort -k7 -nr | head -20
确认是哪个进程后,重启该服务即可释放。不要直接 kill -9 关键进程,优先用 systemctl restart 服务名。日志类进程也可以先 truncate -s 0 文件 清空内容,避免句柄失效导致日志断档。
清理与防复发
- 日志:用
logrotate配置按大小/天数轮转,别只靠手动删;临时清理可用truncate -s 0或find ... -delete。 - 包缓存:Debian 系
apt clean,RHEL 系yum clean all/dnf clean all。 - 容器:
docker system df看占用,docker system prune清无用镜像和停止的容器(先确认无业务依赖)。 - 兜底:给关键分区配监控告警(如 80% 阈值),比事后救火省事得多。
整体思路就是:df 定分区 → du 定目录 → find 定文件 → lsof 查句柄 → 清理并加轮转策略。按这个顺序走,基本不会误删,也能把空间真正释放出来。

