«

Linux磁盘占用100%排查与大文件清理方法

时间:2026-11-14 07:41     作者:emer     分类: 无


服务器磁盘占用 100% 是运维高频故障:日志写不进、网站 500、数据库无法启动,往往都是根分区被占满。新手容易一上来就删文件,结果删错系统文件。正确做法是先定位“哪个分区满、哪个目录大、哪个文件最占地方”,再有针对性清理。本文给出一套从粗到细的排查命令。

一、先看哪个分区满了

df -h

看 Use% 一列,达到 100% 的就是出问题的分区。重点关注根分区 / 和 /var、/home 等挂载点。加 -i 看 inode 是否用尽:

df -i

有些情况空间没满但 inode 耗尽(大量小文件),也会报磁盘满。

二、定位哪个目录最占空间

从根目录逐级往下找,du 统计目录大小:

du -h --max-depth=1 / 2>/dev/null

进入最大的那个目录继续同样操作,例如:

du -h --max-depth=1 /var 2>/dev/null
du -h --max-depth=1 /var/log 2>/dev/null

参数 --max-depth=1 只看一层,避免刷屏;2>/dev/null 忽略无权限报错。

三、找出最大的单个文件

# 在 /var/log 下找大于 100M 的文件
find /var/log -type f -size +100M -exec ls -lh {} \;

# 全盘查找大于 500M 的文件并按大小排序
find / -type f -size +500M 2>/dev/null | xargs ls -lhS

四、常见占用大户与清理

  1. 系统日志:/var/log 下的大日志,可先清空而非删除文件:
cat /dev/null > /var/log/messages
  1. 软件包缓存(CentOS):
yum clean all
  1. 回收站与临时文件:/tmp、/var/tmp、~/.cache。

  2. Docker 镜像和容器日志(如果装了 Docker):

docker system prune -af
  1. Nginx、PHP、MySQL 的业务日志,用 logrotate 定期切割。

五、特殊情况:文件已删但空间没释放

进程仍持有已删除文件的句柄,空间不会立刻回收:

lsof +L1 | head

找到对应进程重启,或直接重启服务释放句柄。这是“删了大文件 df 还是 100%”的经典原因。

常见坑

  1. 直接 rm 系统关键目录,可能导致系统无法启动,务必先确认用途。
  2. du 和 df 对不上,多是隐藏的已删除句柄文件,用 lsof +L1 查。
  3. 只清文件不设切割,过几天又满,应配合 logrotate 自动化。
  4. inode 耗尽(df -i 满)删大文件无效,要清小文件。
  5. 清业务日志前确认没有正在写入,避免影响排查。

总结

排查顺序:df -h 找满的分区 → du --max-depth=1 逐层找大目录 → find 定位大文件 → 清空日志/清缓存,最后用 lsof +L1 处理已删未释放句柄,并配置 logrotate 防止复发。

遇到问题加QQ23979811 协助处理

标签: logrotate du df 磁盘满 大文件清理