网站突然报错、数据库无法写入、上传失败——一查,磁盘满了。磁盘爆满是服务器最常见也最容易解决的故障之一。本文教你快速定位空间被谁吃了,并安全清理释放。
第一步:确认磁盘使用情况
df -h # 查看各分区使用率,找到爆满的分区(Use% 接近100%)
重点看根分区(/)或数据分区。确认哪个分区满了,再去里面找元凶。
第二步:定位是谁占用了空间
du -h --max-depth=1 / | sort -rh | head -10 # 找出根目录下最大的目录
# 逐层深入,比如发现/var大,再看它里面
du -h --max-depth=1 /var | sort -rh | head -10
用这个方法层层下钻,很快就能找到那个吃掉几十G的目录或文件。常见的空间黑洞:日志、缓存、备份、Docker、数据库。
第三步:按类型安全清理
1. 日志文件(最常见):失控的日志能吃掉几十G。
journalctl --vacuum-size=200M # 清理systemd日志,只留200M
# 清理nginx等应用的大日志(先确认不需要)
> /var/log/nginx/access.log # 清空但保留文件
治本:配置日志轮转(logrotate),限制日志大小和保留天数,防止再次失控。
2. 包管理缓存:
apt clean # Debian/Ubuntu 清理apt缓存
dnf clean all # RHEL系
3. Docker空间(容器用户重灾区):
docker system df # 先看Docker占用了多少
docker system prune -a # 清理无用镜像、停止的容器、悬空卷
4. 旧备份文件:检查备份目录,删除过期备份(自动化备份脚本应带自动删除旧文件逻辑)。
第四步:一个诡异现象——删了文件空间没释放
你删了大文件,df 却显示空间没变?这是Linux新手最困惑的坑:如果某个进程还打开着这个文件,删除后空间不会真正释放,直到该进程关闭。常见于删了正在写入的大日志。解决:
lsof | grep deleted # 找出被删除但仍被占用的文件及进程
# 重启或reload对应服务即可真正释放空间(如nginx用 nginx -s reopen)
第五步:治本——预防再次爆满
- 配置logrotate管理所有日志的大小与保留期;
- 备份脚本加自动清理旧文件逻辑(
find /backup -mtime +7 -delete); - Docker用户定期 prune;
- 装磁盘监控告警:用量到80%就提醒,别等满了才发现(详见博客监控教程)。
什么时候该扩容而非清理?
如果清理后很快又满,说明是业务数据真实增长(数据库变大、用户上传增多),这时该扩容而不是反复清理。机器云支持磁盘升级方案,数据密集型业务(数据库、网盘、媒体站)建议一开始就配足够的NVMe空间,或选可配大容量磁盘的独立服务器。
磁盘满了别慌:df找分区 → du找目录 → 按类型清理 → 配置监控防复发。四步走,几分钟解决,并从此不再被同一个问题绊倒。