1. 问题现象与紧急处理
当CentOS系统根目录爆满时,系统会表现出明显的异常症状:命令行操作变得迟缓,部分服务无法正常启动,甚至出现"No space left on device"的错误提示。作为运维人员,我遇到这种情况通常会立即执行以下应急操作:
# 查看磁盘使用情况(人类可读格式) df -h # 快速定位大文件/目录 du -sh /* 2>/dev/null | sort -rh | head -10这个组合命令能快速找出占用空间最大的前10个目录。根据我的经验,/var(日志)、/tmp(临时文件)和/home(用户数据)是最常见的"罪魁祸首"。有一次生产环境事故就是因为/var/log/messages日志未轮转,单文件就占用了30GB空间。
紧急处理提示:如果根目录使用率达到95%以上,建议先清理/tmp目录下的临时文件,这通常能快速释放部分空间:
rm -rf /tmp/*
2. 根目录爆满的六大根源分析
2.1 日志文件失控(占比约40%案例)
/var/log目录是重点排查对象,特别是以下日志:
- /var/log/messages(系统主日志)
- /var/log/secure(认证日志)
- /var/log/httpd/(Apache日志)
- /var/log/nginx/(Nginx日志)
检查日志轮转配置:
ls -lh /etc/logrotate.d/我曾遇到一个典型案例:某电商网站在大促期间,Nginx访问日志每天增长5GB,但由于logrotate配置错误,导致日志从未轮转。
2.2 未清理的软件包缓存(占比约20%)
YUM和DNF的缓存目录/var/cache/yum可能堆积大量旧版本软件包。清理命令:
yum clean all dnf clean all对于特别老旧的CentOS 7系统,还需要手动清理:
rm -rf /var/cache/yum/x86_64/7Server/*2.3 容器/虚拟化残留(占比约15%)
Docker和Podman的存储目录/var/lib/docker常出现:
- 未清理的镜像层
- 停止的容器
- 悬空卷
清理策略:
docker system prune -a -f podman system prune -a -f2.4 用户数据膨胀(占比约10%)
/home目录需要重点关注:
- 开发人员的测试数据
- 上传的媒体文件
- 备份文件
查找大文件的黄金命令:
find /home -type f -size +100M -exec ls -lh {} \;2.5 临时文件堆积(占比约10%)
除了/tmp目录,还要检查:
- /var/tmp
- 用户家目录下的.Trash
- 浏览器缓存(如/root/.cache)
2.6 系统快照占用(占比约5%)
使用LVM快照或Btrfs文件系统时,未清理的快照可能占用大量空间。检查命令:
lvdisplay | grep -i snapshot btrfs subvolume list /3. 系统级解决方案
3.1 自动化日志管理
配置logrotate示例(/etc/logrotate.d/nginx):
/var/log/nginx/*.log { daily missingok rotate 30 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true endscript }关键参数说明:
- rotate 30:保留30个历史版本
- compress:启用gzip压缩
- delaycompress:延迟压缩前一个版本
3.2 智能清理脚本
创建/etc/cron.daily/cleanup脚本:
#!/bin/bash # 清理旧内核 package-cleanup --oldkernels --count=2 # 清理YUM缓存 yum clean all # 清理临时文件 find /tmp -type f -atime +7 -delete find /var/tmp -type f -atime +30 -delete # 清理Docker资源 [ -x /usr/bin/docker ] && docker system prune -a -f # 发送通知 df -h | mail -s "Daily Cleanup Report" admin@example.com记得给执行权限:
chmod +x /etc/cron.daily/cleanup4. 高级存储管理方案
4.1 LVM扩容实战
当清理无法解决问题时,扩容是最终方案。操作流程:
- 查看当前VG空间:
vgdisplay- 如果有可用空间,直接扩展:
lvextend -L +20G /dev/mapper/centos-root xfs_growfs / # 对于XFS文件系统 resize2fs /dev/mapper/centos-root # 对于ext4- 若无可用空间,需先添加新磁盘:
pvcreate /dev/sdb vgextend centos /dev/sdb lvextend -l +100%FREE /dev/mapper/centos-root xfs_growfs /4.2 目录迁移方案
对于特别大的目录(如/var),可以迁移到独立分区:
- 创建新分区并格式化:
mkfs.xfs /dev/sdb1- 挂载临时位置并迁移数据:
mkdir /mnt/newvar mount /dev/sdb1 /mnt/newvar rsync -avz /var/ /mnt/newvar/- 修改fstab永久挂载:
echo "/dev/sdb1 /var xfs defaults 0 0" >> /etc/fstab5. 监控与预防措施
5.1 实时监控脚本
创建/usr/local/bin/disk_monitor.sh:
#!/bin/bash THRESHOLD=90 CURRENT=$(df / | awk 'NR==2 {print $5}' | sed 's/%//') if [ "$CURRENT" -ge "$THRESHOLD" ]; then echo "WARNING: Root partition at ${CURRENT}% usage!" | \ mail -s "Disk Space Alert" admin@example.com /etc/cron.daily/cleanup # 触发自动清理 fi添加到crontab:
(crontab -l 2>/dev/null; echo "*/30 * * * * /usr/local/bin/disk_monitor.sh") | crontab -5.2 最佳实践建议
根据多年运维经验,我总结的黄金法则:
新系统部署时:
- 为/var单独分区(建议50GB+)
- 为/home单独分区
- 使用LVM便于后期扩容
日常维护:
- 每周检查日志轮转是否正常
- 每月执行yum/dnf clean all
- 每季度审计用户家目录
监控策略:
- 设置80%警告阈值
- 对/var/log建立单独监控
- 关键服务日志设置大小限制
6. 疑难问题排查案例
6.1 被删除文件仍占用空间
当进程持有已删除文件的句柄时,空间不会释放。解决方法:
# 查找被删除但未释放的大文件 lsof +L1 | grep deleted # 输出示例: # nginx 1234 root 10u REG 253,0 5.2G 123456 /var/log/nginx/access.log (deleted) # 解决方案: kill -9 1234 # 重启持有文件的进程6.2 inode耗尽问题
即使空间足够,inode耗尽也会导致类似问题。检查命令:
df -i解决方法:
- 删除小文件密集的目录
- 对于邮件服务器等场景,考虑使用专用存储方案
6.3 特殊文件系统问题
XFS文件系统的修复方法:
xfs_repair -v /dev/mapper/centos-rootext4文件系统的检查:
fsck -y /dev/mapper/centos-root7. 工具推荐与使用技巧
7.1 可视化分析工具
ncdu:终端下的交互式磁盘分析器
yum install -y ncdu ncdu /gt5:显示目录大小变化历史
yum install -y gt5 gt5 /var
7.2 高级查找技巧
查找最近修改的大文件:
find / -type f -size +500M -mtime -7 -exec ls -lh {} \;按用户统计空间使用:
du -sh /home/* | sort -rh7.3 系统审计工具
使用aide建立文件系统基准,检测异常增长:
yum install -y aide aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz aide --check