Linux磁盘满了怎么清理,大文件查找命令

前言

网站突然打不开了?SSH连不上了?一查磁盘100%满了!本文讲怎么查找大文件、清理磁盘空间。

一、查看磁盘使用情况

df命令

df -h

输出:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   38G  2.0G  95% /

看什么:

  • Use%:使用率,超过90%就要注意了
  • Avail:可用空间

查看当前目录占用

du -sh

二、查找大文件

查找大于100M的文件

find / -type f -size +100M 2>/dev/null

解释:

  • /:从根目录开始找
  • -type f:只找文件
  • -size +100M:大于100M
  • 2>/dev/null:忽略错误信息

查找大于1G的文件

find / -type f -size +1G 2>/dev/null

按大小排序

find / -type f -size +100M 2>/dev/null | xargs du -h | sort -rh

三、查找大目录

查看各目录大小

du -sh /*

一级一级往下找

du -sh /var/*
du -sh /var/log/*
du -sh /var/lib/*

查看前10大目录

du -sh /* | sort -rh | head -10

四、常见大文件位置

1. 日志文件

/var/log/
/var/log/messages
/var/log/nginx/
/var/log/mysql/

2. 临时文件

/tmp/
/var/tmp/

3. 邮件

/var/spool/mail/

4. 数据库文件

/var/lib/mysql/

5. Docker镜像

/var/lib/docker/

6. 上传文件

/www/wwwroot/
/var/www/html/

五、清理方法

清理日志文件

方法1:清空文件

> /var/log/messages

方法2:删除旧日志

find /var/log -name "*.log" -mtime +30 -delete

删除30天前的日志。

清理yum缓存

yum clean all

清理Docker

docker system prune -a

清理临时文件

rm -rf /tmp/*

注意: 正在用的文件别删。

清理旧内核

package-cleanup --oldkernels --count=1

六、查看文件被谁占用

问题: 删了文件但磁盘没释放?

原因: 有进程还在写这个文件。

查看被删除但还被占用的文件

lsof | grep deleted

重启相关进程

systemctl restart nginx

七、常见坑

坑1:删了文件但空间没释放

原因: 进程还在写这个文件。

解决: 重启进程,或者用> 文件名清空。

坑2:日志一直涨

解决: 配置logrotate日志切割。

坑3:Docker占了很多空间

docker system df

清理:

docker system prune -a

八、自动清理脚本

写个脚本定期清理:

#!/bin/bash
# 清理30天前的日志
find /var/log -name "*.log" -mtime +30 -delete
# 清理yum缓存
yum clean all
# 清理Docker
docker system prune -f

加到crontab:

0 3 * * * /bin/bash /root/clean.sh

总结

记住:

  1. 用df -h看磁盘使用率
  2. 用du -sh /*看哪个目录大
  3. 用find / -size +100M找大文件
  4. 先看日志,再看Docker,再看临时文件
  5. 删文件前确认不用了
  6. 删了没释放就重启进程

最常用:

df -h
du -sh /*
find / -type f -size +100M 2>/dev/null

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:52 

Linux磁盘占用100%怎么排查,大文件查找清理方法

前言

服务器跑着跑着突然网站打不开了,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。

总结

排查磁盘占用的标准流程:

  1. df -h 看哪个分区满了
  2. du -sh /* | sort -rh 找最大的目录
  3. find / -type f -size +100M 找最大的文件
  4. 确认文件用途后再清理
  5. 日志文件清空内容,不要直接删文件

日常运维建议配置 logrotate 自动切割日志,避免日志越积越大。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:26 
'); })();