Linux磁盘占用100%怎么排查,大文件查找清理方法
时间:2026-10-5 07:26 作者:emer 分类: 无
前言
服务器跑着跑着突然网站打不开了,SSH 也反应变慢,一查磁盘使用率 100%。这是运维中非常常见的问题。磁盘满了不仅影响服务正常运行,还可能导致数据丢失、日志写不进去等严重后果。本文就手把手教你怎么快速定位磁盘占用大的文件,以及怎么安全清理。
第一步:查看整体磁盘使用情况
先用 df 命令看看哪个分区满了:
df -h
参数说明:
-h:以人类可读的方式显示(G、M)
输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 38G 2.0G 95% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 480M 7.8G 6% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
看 Use% 那一列,如果哪个分区到了 100% 或者 90% 以上,那就是问题所在。比如上面 /dev/vda1 用了 95%,根分区快满了。
第二步:定位哪个目录占用最大
知道哪个分区满了,接下来找是哪个目录占了最多空间。用 du 命令:
1. 查看根目录下各目录的大小
du -sh /* 2>/dev/null
参数说明:
-s:只显示总计,不显示每个子目录-h:人类可读格式2>/dev/null:忽略权限不足的报错信息
输出示例:
0 /bin
100M /boot
...
15G /home
20G /var
3G /usr
从输出可以看出 /var 目录占了 20G,是大头。
2. 继续往下查 /var 目录
du -sh /var/* 2>/dev/null | sort -rh | head -10
参数说明:
sort -rh:按大小倒序排列head -10:只显示前10个最大的
输出示例:
15G /var/log
3G /var/lib
1G /var/cache
...
继续往下查,直到找到具体是哪个文件最大。
第三步:查找最大的单个文件
如果目录太大不好定位,直接找整个系统里最大的文件:
1. 查找大于100M的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'
参数说明:
-type f:只找文件,不找目录-size +100M:找大于100M的文件2>/dev/null:忽略权限报错
2. 按大小排序显示前20个最大文件
find / -type f -size +10M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -20
这样就能列出系统里最大的20个文件,一目了然。
常见的磁盘占用大户
根据经验,Linux 磁盘占用大通常是这几个地方:
1. 日志文件(/var/log)
这是最常见的。服务跑久了日志文件会越来越大,尤其是:
- Nginx 访问日志、错误日志
- MySQL 慢查询日志、错误日志
- 系统日志 messages、syslog
排查方法:
du -sh /var/log/* | sort -rh | head -10
2. 已删除但仍被进程占用的文件
有时候你删掉了大文件,但磁盘空间没释放,因为还有进程在占用这个文件的句柄。
排查方法:
lsof | grep deleted
如果看到很多 deleted 状态的文件,说明有进程占用着已删除的文件。重启对应的进程就能释放空间。
3. 缓存文件(/var/cache)
yum 下载的缓存包、APT 的缓存都在这里,时间久了会积累很多。
清理方法:
yum clean all
4. Docker 镜像和容器
如果用了 Docker,镜像、容器、日志都会占很多空间。
排查方法:
docker system df
清理方法:
docker system prune -a
安全清理方法
找到大文件后,不要直接 rm -rf 删了就完事,要注意安全:
1. 日志文件:清空而不是删除
如果是日志文件,不要删文件本身,而是清空内容:
> /var/log/nginx/access.log
或者:
echo "" > /var/log/nginx/access.log
这样文件还在,但内容清空了,不会影响正在写入的进程。
2. 大文件:先确认再删除
删之前一定要确认这个文件是不是真的不需要了:
ls -lh /path/to/file
head -20 /path/to/file # 看看内容是什么
确认没问题再删:
rm -f /path/to/file
3. 已删除但被占用的文件
如果删掉文件后空间没释放,找到占用的进程并重启:
lsof | grep deleted
# 找到对应的 PID,重启服务
systemctl restart nginx
常见坑
坑1:用 du 查到的大小和 df 不一致
有时候 df 显示磁盘满了,但 du -sh /* 加起来远没到那个数。这通常是因为:
- 有已删除但仍被进程占用的文件
- 挂载点下还有其他挂载
解决: 用 lsof | grep deleted 找被占用的已删除文件,重启对应进程释放空间。
坑2:删了文件空间没释放
这就是上面说的坑——文件被进程占用着,虽然删了但空间没释放。必须重启进程才能释放。
坑3:直接删日志文件导致服务异常
很多人直接 rm -f /var/log/nginx/access.log,结果 Nginx 还在往这个已经不存在的文件里写,日志就丢了。正确做法是清空内容而不是删除文件:> /var/log/nginx/access.log。
总结
排查磁盘占用的标准流程:
df -h看哪个分区满了du -sh /* | sort -rh找最大的目录find / -type f -size +100M找最大的文件- 确认文件用途后再清理
- 日志文件清空内容,不要直接删文件
日常运维建议配置 logrotate 自动切割日志,避免日志越积越大。
遇到问题加QQ23979811 协助处理