☰
CentOS根目录爆满的排查与解决方案
2026/10/26 7:43:07 网站建设 项目流程

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 -f

2.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/cleanup

4. 高级存储管理方案

4.1 LVM扩容实战

当清理无法解决问题时,扩容是最终方案。操作流程:

  1. 查看当前VG空间:
vgdisplay
  1. 如果有可用空间,直接扩展:
lvextend -L +20G /dev/mapper/centos-root xfs_growfs / # 对于XFS文件系统 resize2fs /dev/mapper/centos-root # 对于ext4
  1. 若无可用空间,需先添加新磁盘:
pvcreate /dev/sdb vgextend centos /dev/sdb lvextend -l +100%FREE /dev/mapper/centos-root xfs_growfs /

4.2 目录迁移方案

对于特别大的目录(如/var),可以迁移到独立分区:

  1. 创建新分区并格式化:
mkfs.xfs /dev/sdb1
  1. 挂载临时位置并迁移数据:
mkdir /mnt/newvar mount /dev/sdb1 /mnt/newvar rsync -avz /var/ /mnt/newvar/
  1. 修改fstab永久挂载:
echo "/dev/sdb1 /var xfs defaults 0 0" >> /etc/fstab

5. 监控与预防措施

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 最佳实践建议

根据多年运维经验,我总结的黄金法则:

  1. 新系统部署时:

    • 为/var单独分区(建议50GB+)
    • 为/home单独分区
    • 使用LVM便于后期扩容
  2. 日常维护:

    • 每周检查日志轮转是否正常
    • 每月执行yum/dnf clean all
    • 每季度审计用户家目录
  3. 监控策略:

    • 设置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-root

ext4文件系统的检查:

fsck -y /dev/mapper/centos-root

7. 工具推荐与使用技巧

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 -rh

7.3 系统审计工具

使用aide建立文件系统基准,检测异常增长:

yum install -y aide aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz aide --check

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询