服务器磁盘满了怎么办?3步自救+日常清理指南

服务器磁盘满了怎么办?3步自救+日常清理指南

半夜三点,监控报警:“磁盘使用率 99%”。你登上去,想删点东西,结果连命令都敲不动了——因为磁盘满了,系统连日志都写不进去。

别慌。这事儿我干过,不,是经历过。第一次遇到的时候,我也慌,恨不得把服务器拆了。后来发现,磁盘满这事儿,有套路。三步自救,半小时搞定。


先看一个数据

某云厂商统计过,超过20%的服务器宕机事件,根本原因是磁盘满了。不是CPU不够,不是内存不足,就是硬盘写满了。

更可怕的是,磁盘满的时候,数据库可能会损坏,网站会直接挂掉,甚至SSH都进不去。你在外面干着急,里面已经死锁了。

所以,磁盘满了不是小问题。但也不是绝症。


第一步:快速定位——谁在偷偷吃空间

磁盘满了,第一件事不是删东西,是搞清楚谁在吃。

1. 看哪个分区满了

bash

df -h

看到 / 或者 /var 红了,就是它。

2. 找大目录

bash

du -sh /* 2>/dev/null | sort -hr | head -10

这条命令会告诉你,根目录下哪10个文件夹最大。

常见的元凶:

  • /var/log:日志没轮转,几个月没清理
  • /home:用户上传了一堆文件
  • /tmp:临时文件没删
  • /var/lib/docker:Docker镜像堆成山
  • /root:你自己下载了一堆东西忘了删

反常识点:很多人以为磁盘满是因为网站文件太多,其实大部分情况是日志没清理。一个跑了几年的服务器,日志文件几十GB太正常了。


第二步:三步自救,从死到活

定位到元凶之后,开始动手。

第一刀:清理日志

日志是最常见的大胃王。

systemd 日志(如果你用 systemd):

bash

# 查看日志占了多少空间
journalctl --disk-usage

# 清理到只保留 500MB
journalctl --vacuum-size=500M

# 或者只保留最近 7 天
journalctl --vacuum-time=7d

传统日志文件

bash

# 找大于 100MB 的日志文件
find /var/log -name "*.log" -size +100M

# 删掉 30 天前的日志(谨慎)
find /var/log -name "*.log" -mtime +30 -delete

Nginx / Apache 日志
如果你自己配了 access.log 和 error.log,看看它们多大。太大就 > access.log 清空,或者删了重新生成。

第二刀:清理包管理器缓存

你装软件的时候,包管理器会下载安装包,装完不删。

Ubuntu/Debian

bash

apt clean           # 清理所有缓存
apt autoremove      # 删掉不需要的依赖包

CentOS/RHEL

bash

yum clean all

有时候能清出几个GB。

第三刀:清理旧内核

内核更新后,旧内核还在。留着也没用。

Ubuntu/Debian

bash

apt autoremove --purge

CentOS/RHEL

bash

package-cleanup --oldkernels --count=2

只保留最近两个内核,防止新内核出问题还能回滚。


第三步:日常清理自动化——让服务器自己打扫卫生

手动清理是救急,自动清理才是长久之计。

1. 配置 logrotate

/etc/logrotate.conf 和 /etc/logrotate.d/ 下的配置文件,控制日志怎么轮转。

一个典型的配置:

text

/var/log/nginx/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
}

意思是:每天轮转一次,保留7天,压缩旧日志。

2. 写个清理脚本,放 crontab

bash

#!/bin/bash
# 清理超过30天的日志
find /var/log -name "*.log" -mtime +30 -delete
# 清理journal日志
journalctl --vacuum-size=1G
# 清理apt缓存
apt clean

放到 crontab 里,每周跑一次。

3. 设置磁盘告警

用监控工具(Netdata、Prometheus)设置磁盘使用率告警,80%就提醒,别等到99%。


一个反常识的事实:磁盘满之前,往往有征兆

磁盘不是突然满的。日志每天写一点,缓存每周多几MB,备份每月增几个G。这个过程很慢,但你从来没看过。

如果你每天扫一眼 df -h,或者每周看一次监控,你会在 80% 的时候发现它,然后从容清理。而不是等到 99% 的时候,手忙脚乱。

所以,磁盘满了的根源不是空间不够,是你不看它。


最后说一句

有个朋友,服务器跑了三年,从来没清理过。有一天,网站挂了,数据库起不来,日志写不进去,SSH 敲命令报“No space left on device”。他慌了,问我怎么办。

我让他进救援模式,删了 /var/log 下几个大文件,腾出 5GB,重启,网站活了。他感叹:“原来硬盘这么容易满。”

我说:“不是硬盘容易满,是你从来没看过它。”

服务器就像家里的冰箱。你不清理,它会满。你定期看一眼,扔点过期的东西,它永远够用。

磁盘满了不可怕,可怕的是你从来没想过它会满。

今天花半小时清理一下,再配个自动轮转。以后服务器出问题,至少不是因为磁盘。

知识库

网站访问慢?试试这3招加速技巧(CDN+缓存+图片优化)

2026-3-27 14:43:47

实操指南知识库

基于时序数据库的网络性能监控系统设计

2024-11-27 16:09:50

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧