最近连续两周,我都在帮不同环境下的 CentOS 7 机器处理同一个问题:系统盘满了。有的机器 / 分区只有 50G,日志和容器一撑就直接 100%;有的机器是跑了一年多的数据库服务器,/var 下面悄悄涨了 30G 的备份;最夸张的一台是 /var/lib/docker/overlay2 一个目录占掉 80G,历史镜像和容器日志全堆在上面。CentOS 7 虽然已经进入生命周期的尾部,但生产环境里存量依然很大,尤其是当年用 CentOS 7 x86_64 minimal 镜像精简安装的机器,分区方案普遍偏保守,/ 分区太小、/home 和 /var 没有独立拆分,一旦出问题,连执行 shutdown 都可能卡死。这篇把我在实际运维中用到的、踩过坑反复验证过的系统盘清理方法整理成一份汇总,从怎么定位空间占用,到怎么动手清理,再到怎么防止复发,一次讲透。不管你是刚接手一台告急服务器的新手,还是想优化现有清理策略的老手,这篇文章都值得你收藏后边看边操作。
1. 系统盘告急:先判断空间到底被谁吃了
1.1 为什么系统盘总是最先告急
CentOS 7 的默认分区方案里,一般会把根分区留给 / 和 /var,而 /home 单独分出去,甚至很多用 minimal 镜像装出来的机器只有一个 / 分区。这种布局对于跑业务的人来说本身没什么问题,但系统盘的容量会随着运行时间的拉长不断被四类东西消耗掉:日志文件、软件包管理产生的缓存、临时文件、以及应用写入的数据。我这边最常见的场景是 journald 日志一路涨到几个 G,然后 /var/log/messages 又因为 logrotate 配置不对持续膨胀,再加上 yum 操作留了满目录的缓存包,最后的结果就是 df -h 一看,/ 分区 100%,ssh 登录慢得像蜗牛,连敲命令都快没响应。
与其等它满了再去抓瞎,不如先搞清楚几个基础命令,后面所有清理动作都建立在它们的基础上。优先解释这些命令背后的原理,是因为很多新手一上来就 rm -rf 一些看起来像缓存的东西,运气好能临时释放空间,运气不好直接把系统搞挂,所以排查顺序和判断优先级比清理动作本身更重要。我在实际处理告警时,默认遵守一个原则:先定位,再评估,最后才动手。这个顺序看起来慢,但比直接删文件不知道要稳多少倍。
1.2 快速定位大目录的排查命令
定位空间占用,第一步我习惯从根目录开始往下筛。常用组合是:
bash复制df -h /
du -x --max-depth=1 -h / 2>/dev/null | sort -rh | head -20
df 看的是整个分区使用率,du 则是累加计算目录实际占用的块数。加上 -x 参数强制 du 不要跨文件系统,这样可以避免把 /proc、/sys 这些虚拟文件系统也扫进去,扫描速度更快,结果也更准确。2>/dev/null 是忽略权限不足的目录报错,生产环境里总有一些目录当前用户没有权限读,不屏蔽的话输出会特别脏,影响你判断。
如果 du 显示某个目录特别大,就再往下一层重复同样动作,比如 /var 大就执行:
bash复制du -x --max-depth=1 -h /var 2>/dev/null | sort -rh | head -20
这样一层层递进,很快就能锁定是 /var/log 还是 /var/lib 在膨胀。要注意 du 在首次扫描全盘时速度比较慢,尤其是磁盘读写压力大的时候,一般建议在业务低峰执行,避免阻塞 IO。等文件系统缓存热起来之后再扫就快很多,不过不用担心扫两三次会浪费多少时间,系统盘告急的时候,多花两分钟定位比盲目删除省下来的时间多得多。
还有一个小技巧,扫描时可以把结果输出到临时文件里保存,比如:
bash复制du -x --max-depth=2 -h / 2>/dev/null | sort -rh > /tmp/disk_usage_$(date +%F).txt
这样即使你中途断开 ssh,下次登录还能接着看分析结果。
1.3 被删除但仍占用磁盘的文件辨别
这是系统盘清理里最反直觉的一个坑:你明明删掉了大文件,df -h 一看空间还是满的。原因是有进程仍在打开那个文件,文件虽然在目录树里看不到了,但文件句柄还处于打开状态,占用的 block 没有被释放。排查方法是用 lsof:
bash复制lsof +L1 | grep deleted
+L1 表示显示 link count 小于 1 的文件,也就是已经被删除但仍被某些进程占用的文件。看到输出后,确认是哪个进程、哪个路径,再根据实际情况决定是重启这个进程,还是直接 kill 让它重新拉起。最常见的元凶是日志服务、数据库进程和长时间运行的 Java 应用,我遇到过一台机器上 Java 应用把 log 文件删了之后没有 reopen,结果日志继续往已删除句柄里写,空间一直不释放,重启应用后瞬间恢复正常。
所以清理动作做完之后,别急着下结论,先执行 df -h 确认空间确实释放了,这个习惯能帮你少走很多弯路。如果明确看到某个已删除的大文件被 PID 占用,且这个进程不能随便重启,可以尝试通过清空 /proc 下的文件描述符来应急,比如把日志文件重定向为 0 字节,这个操作我会在后面的故障排查章节详细说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日志、缓存与软件包:日常清理的主战场
2.1 清理 journald 日志
systemd-journald 是 CentOS 7 上默认的系统日志收集器,它会长期累积 /var/log/journal 目录下的日志文件。很多人不知道它默认策略是只在磁盘空间达到
