logo

Linux服务器系统盘告急:高效清理与扩容指南

作者:沙与沫2025.09.17 15:56浏览量:0

简介:当Linux服务器系统盘空间耗尽时,可能导致服务中断、日志无法写入等严重问题。本文提供从诊断到解决的完整方案,涵盖日志清理、缓存释放、大文件定位及扩容策略,帮助运维人员快速恢复系统运行。

一、系统盘空间耗尽的危害与诊断

当Linux服务器系统盘(通常为//boot分区)空间耗尽时,系统会出现以下典型症状:

  • 服务中断:依赖磁盘写入的进程(如MySQL、Redis)可能崩溃
  • 日志堆积/var/log目录下的日志文件无法轮转,导致关键日志丢失
  • 更新失败yum/apt等包管理器因空间不足无法安装软件
  • 启动异常:系统可能因/boot分区满而无法加载新内核

诊断步骤

  1. 查看磁盘使用情况

    1. df -hT # 显示所有文件系统使用情况(含文件系统类型)
    2. du -sh /* 2>/dev/null | sort -rh | head -n 10 # 显示根目录下占用最大的10个目录

    重点关注//boot分区的Use%是否接近100%。

  2. 定位大文件

    1. find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null # 查找大于100MB的文件
    2. find /var/log -type f -name "*.log" -exec du -h {} + | sort -rh # 统计日志文件大小

二、紧急清理策略(无需重启)

1. 清理日志文件

  • 日志轮转:手动触发logrotate(若已配置):
    1. logrotate -f /etc/logrotate.conf
  • 删除旧日志
    1. rm -f /var/log/*.gz /var/log/*.old # 删除压缩旧日志
    2. truncate -s 0 /var/log/syslog /var/log/messages # 清空当前日志(保留文件)

    ⚠️ 注意:直接删除日志文件后,需重启相关服务(如systemctl restart rsyslog)以释放文件描述符。

2. 清理缓存与临时文件

  • 清理包管理器缓存
    1. yum clean all # CentOS/RHEL
    2. apt-get clean # Debian/Ubuntu
  • 清理内核缓存
    1. sync; echo 3 > /proc/sys/vm/drop_caches # 释放pagecache、dentries和inodes
  • 删除临时文件
    1. rm -rf /tmp/* /var/tmp/* # 清理临时目录
    2. rm -rf ~/.cache/* # 清理用户级缓存(如Docker构建缓存)

3. 清理旧内核与无用文件

  • 删除旧内核(仅限/boot分区满时):
    1. # CentOS/RHEL
    2. package-cleanup --oldkernels --count=1
    3. # Debian/Ubuntu
    4. dpkg --list | grep linux-image | awk '{print $2}' | grep -v `uname -r` | xargs apt-get purge -y
  • 删除无用内核模块
    1. rm -rf /lib/modules/$(uname -r)/.tmp_versions/ # 清理编译残留

三、长期优化方案

1. 日志管理自动化

  • 配置logrotate
    1. # /etc/logrotate.d/myapp
    2. /var/log/myapp/*.log {
    3. daily
    4. missingok
    5. rotate 14
    6. compress
    7. delaycompress
    8. notifempty
    9. create 0640 root adm
    10. sharedscripts
    11. postrotate
    12. /bin/systemctl restart myapp >/dev/null 2>&1 || true
    13. endscript
    14. }
  • 使用journald限制日志大小(Systemd系统):
    1. # /etc/systemd/journald.conf
    2. [Journal]
    3. Storage=persistent
    4. SystemMaxUse=500M
    5. RuntimeMaxUse=100M

2. 监控与告警

  • 使用df监控脚本

    1. #!/bin/bash
    2. THRESHOLD=90
    3. USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
    4. if [ "$USAGE" -ge "$THRESHOLD" ]; then
    5. echo "WARNING: / partition usage is ${USAGE}%!" | mail -s "Disk Space Alert" admin@example.com
    6. fi

    通过crontab -e添加每30分钟执行一次的计划任务。

  • 使用Prometheus+Grafana监控

    1. # Prometheus配置示例
    2. - job_name: 'node'
    3. static_configs:
    4. - targets: ['localhost:9100']
    5. metric_relabel_configs:
    6. - source_labels: [__name__]
    7. regex: 'node_filesystem_avail_bytes{device="rootfs",mountpoint="/"}'
    8. target_label: __name__
    9. replacement: 'node_disk_free'

四、扩容方案(终极手段)

1. 扩展LVM分区

步骤

  1. 添加新磁盘(如/dev/sdb
  2. 创建物理卷
    1. pvcreate /dev/sdb
  3. 扩展卷组
    1. vgextend vg00 /dev/sdb # 假设原卷组为vg00
  4. 扩展逻辑卷
    1. lvextend -l +100%FREE /dev/vg00/lv_root # 扩展至全部剩余空间
    2. resize2fs /dev/vg00/lv_root # 对于ext4文件系统
    3. xfs_growfs / # 对于XFS文件系统

2. 迁移数据至独立分区

场景/var/home占用过高
步骤

  1. 创建新分区(如/dev/sdb1
  2. 格式化并挂载
    1. mkfs.ext4 /dev/sdb1
    2. mount /dev/sdb1 /mnt/newvar
    3. rsync -av /var/ /mnt/newvar/
  3. 修改/etc/fstab
    1. /dev/sdb1 /var ext4 defaults 0 2
  4. 重启验证
    1. umount /mnt/newvar
    2. mount -a
    3. df -h /var

五、预防措施

  1. 设置磁盘配额
    1. # 启用配额(需文件系统支持)
    2. mount -o remount,usrquota,grpquota /
    3. quotacheck -cum /
    4. quotaon /
  2. 定期清理脚本

    1. # /usr/local/bin/cleanup.sh
    2. find /tmp -type f -mtime +7 -delete
    3. find /var/log -type f -name "*.log" -mtime +30 -exec gzip {} \;

    通过crontab -e添加每周执行一次的任务。

  3. 使用云存储对象存储:将非核心数据(如备份、日志)迁移至S3兼容存储。

总结

Linux服务器系统盘满问题需结合紧急清理长期优化双重策略。运维人员应首先通过df/du定位问题,优先清理日志和缓存;随后通过logrotate、监控告警等手段预防复发;最终在必要时通过LVM扩容或分区迁移解决根本问题。定期执行清理脚本和配额管理可显著降低此类故障的发生率。

相关文章推荐

发表评论