1. 前言:磁盘占满,如何快速应对?
CentOS系统运行一段时间后,磁盘空间莫名其妙地飙到90%以上,甚至连SSH都登录不上?别慌,这几乎是每个运维都会遇到的常见问题。磁盘满通常由日志堆积、yum缓存、旧内核残留、Docker镜像暴涨等原因引起。下面分享一套实战经验,从诊断到清理,一步步教你快速释放空间。
2. 第一步:诊断磁盘占用情况
先用最直观的df -h查看各分区使用率:
df -h
重点关注占用率高的挂载点(如/、/var)。然后进入疑似目录,用du -sh * | sort -rh | head -10快速定位大文件夹:
cd /var && du -sh * | sort -rh | head -10
这样能一分钟内找到罪魁祸首是日志、缓存还是其他。
3. 第二步:快速清理清单(按优先级排序)
3.1 清理yum缓存
yum的缓存文件长期不清理会占用几百MB甚至GB:
yum clean all
如果使用dnf(CentOS 8+):
dnf clean all
3.2 清理系统日志(重灾区)
日志文件在/var/log下,常见大文件:messages、secure、audit、journal。推荐做法:
- 压缩旧日志(不删除):
logrotate -f /etc/logrotate.conf会按配置轮转。 - 直接清理journal日志:
journalctl --vacuum-size=200M保留最近200MB的日志,较新系统可用:
- 手动删除大日志:先确认,再操作:
cd /var/log && rm -f messages-* secure-* # 保留当前日志 - 清空特定文件(不删除文件本身):
cat /dev/null > /var/log/messages
3.3 清理临时文件
/tmp和/var/tmp经常被忽略,但长期运行会积累大量临时文件:
rm -rf /tmp/* && rm -rf /var/tmp/*
⚠️ 注意:不要重启时清理,否则可能影响运行中的程序。
3.4 清理旧内核(CentOS 7/8特有)
每次内核更新都会留下旧版本,占用/boot空间。查看已安装内核:
rpm -qa | grep kernel
保留当前运行内核(uname -r),然后用package-cleanup(CentOS 7)或dnf autoremove(CentOS 8)清理:
# CentOS 7
yum install yum-utils -y
package-cleanup --oldkernels --count=1
# CentOS 8
dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q kernel-core)
3.5 清理大文件(任意目录)
用find命令找出大于100MB的文件:
find / -type f -size +100M -exec ls -lh {} ; 2>/dev/null | awk '{print $9, $5}'
然后逐一确认是否可删。常见的大文件包括:core文件、应用日志、数据库备份等。
3.6 清理Docker残留(如果有)
Docker的镜像、容器、卷会占用大量空间:
docker system prune -a --volumes
⚠️ 这个命令会删除所有未使用的镜像、容器和卷,慎用。
3.7 清理系统更新备份(/var/cache/yum)
yum缓存已清过,但/var/cache/yum下的元数据还可能残留,可手动删:
rm -rf /var/cache/yum/*
4. 第三步:验证清理结果
再次运行df -h并检查各分区可用空间是否恢复。如果问题依旧,可能需要检查是否有隐藏的大文件(如数据库的binlog、邮件队列等)。
5. 预防措施(长期解决方案)
- 配置logrotate:确保
/etc/logrotate.d/下每个服务日志都有合理的轮转策略(保留天数、压缩)。 - 使用系统监控:安装
ncdu、duf等工具定期扫描磁盘。 - 设置磁盘告警:通过cron+df脚本或zabbix/ganglia等监控工具,当磁盘使用率超过80%时自动报警。
- 分区规划:将
/var、/home等独立分区,避免根分区被填满。
6. 总结
磁盘满不是大问题,但处理不当可能导致服务中断。以上步骤涵盖了CentOS系统最常见的占用点,按优先级执行即可。养成定期清理日志和缓存的好习惯,能避免90%的磁盘告警。遇到极端情况,可以用lsof | grep deleted查找已删除但进程仍占用的文件,重启对应进程释放空间。