IT

Linux磁盘空间不足?du与find实战清理思路

AI智能摘要

磁盘满了先别乱删。先用 df 看哪个分区告警,再用 du 逐层下钻找大目录,接着用 find 按大小和时间筛出大文件。删完空间没降,多半是进程还占着已删除文件的句柄,用 lsof 查 deleted 再重启服务。最后配上 logrotate 和监控,别让同样的问题再来一次。

先定位: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 查句柄 → 清理并加轮转策略。按这个顺序走,基本不会误删,也能把空间真正释放出来。

发表评论