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
四、常见占用大户与清理
- 系统日志:/var/log 下的大日志,可先清空而非删除文件:
cat /dev/null > /var/log/messages
- 软件包缓存(CentOS):
yum clean all
-
回收站与临时文件:/tmp、/var/tmp、~/.cache。
-
Docker 镜像和容器日志(如果装了 Docker):
docker system prune -af
- Nginx、PHP、MySQL 的业务日志,用 logrotate 定期切割。
五、特殊情况:文件已删但空间没释放
进程仍持有已删除文件的句柄,空间不会立刻回收:
lsof +L1 | head
找到对应进程重启,或直接重启服务释放句柄。这是“删了大文件 df 还是 100%”的经典原因。
常见坑
- 直接 rm 系统关键目录,可能导致系统无法启动,务必先确认用途。
- du 和 df 对不上,多是隐藏的已删除句柄文件,用 lsof +L1 查。
- 只清文件不设切割,过几天又满,应配合 logrotate 自动化。
- inode 耗尽(df -i 满)删大文件无效,要清小文件。
- 清业务日志前确认没有正在写入,避免影响排查。
总结
排查顺序:df -h 找满的分区 → du --max-depth=1 逐层找大目录 → find 定位大文件 → 清空日志/清缓存,最后用 lsof +L1 处理已删未释放句柄,并配置 logrotate 防止复发。
遇到问题加QQ23979811 协助处理