实用指南:linux磁盘空间爆满排查与清理

一、系统化排查流程

1. 诊断流程图

可删除
需保留
磁盘空间告警
定位挂载点
df -h
Use% > 80%?
分析目录大小
du -h --max-depth=1 / | sort -hr
定位最大目录
查找大文件
find /var -type f -size +1G
确认大文件重要性
清理与优化
日志轮转/文件清理
归档或压缩
检查已删除文件
lsof | grep deleted
重启服务释放空间
检查其他分区

2. 关键命令矩阵

步骤命令示例功能说明输出关键列
定位挂载点df -h显示文件系统使用情况Use%, Mounted on
分析目录du -h --max-depth=1 / | sort -hr一级目录大小排序目录大小, 路径
查找大文件find /var -type f -size +1G -exec ls -lh {} \;查找大于1G的文件文件大小, 路径
检查已删文件lsof | grep deleted查看被删除但未释放的文件进程, 文件描述符
实时监控watch -n 5 'df -h'每5秒刷新磁盘使用实时使用率变化

二、进阶排查技巧

1. 日志文件专项处理

# 日志轮转配置示例(/etc/logrotate.d/tomcat)
/var/log/tomcat/*.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
    create 644 tomcat tomcat
    postrotate
        /usr/bin/kill -HUP `cat /var/run/tomcat.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
# 查找日志大文件并清理
find /var/log -name "*.log" -size +100M -exec ls -lh {} \;
find /var/log -name "*.log.?" -mtime +30 -delete

2. 自动化清理脚本

#!/bin/bash
# 磁盘空间安全清理脚本
LOG_DIR="/var/log"
DAYS_TO_KEEP=7
SIZE_THRESHOLD="500M"
BACKUP_DIR="/backup/cleanup_$(date +%Y%m%d)"
# 创建备份目录
mkdir -p $BACKUP_DIR
echo "=== 开始磁盘清理 $(date) ==="
# 1. 备份并清理旧日志
echo "清理超过${DAYS_TO_KEEP}天的日志文件..."
find $LOG_DIR -type f -name "*.log" -mtime +$DAYS_TO_KEEP | while read file; do
    echo "备份并删除: $file"
    gzip -c "$file" > "${BACKUP_DIR}/$(basename $file).gz"
    rm -f "$file"
done
# 2. 清空过大的日志文件(保留最近内容)
echo "处理超过${SIZE_THRESHOLD}的大日志文件..."
find $LOG_DIR -type f -name "*.log" -size +$SIZE_THRESHOLD | while read file; do
    echo "清空大文件: $file"
    tail -n 1000 "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"
done
# 3. 清理临时文件(保留7天内)
echo "清理临时文件..."
find /tmp -type f -mtime +7 -delete 2>/dev/null
find /var/tmp -type f -mtime +7 -delete 2>/dev/null
# 4. 清理软件包缓存
echo "清理包管理器缓存..."
apt-get clean 2>/dev/null || yum clean all 2>/dev/null
# 5. 显示清理结果
echo "=== 清理完成 ==="
df -h | grep -v tmpfs

三、生产环境注意事项

1. 清理安全清单

可清理项风险等级建议操作检查命令
/tmp目录保留7天内文件find /tmp -type f -mtime +7 -ls
日志文件先备份再清理ls -la /var/log/*.log
软件包缓存可安全清理du -sh /var/cache/apt/
Docker资源确认无在用容器docker system df
系统缓存小心清理sync; echo 3 > /proc/sys/vm/drop_caches

2. 预防性措施

监控预警配置

# 添加到crontab,每天检查
#!/bin/bash
THRESHOLD=80
CURRENT=$(df / | awk 'NR==2{print $5}' | sed 's/%//')
if [ $CURRENT -gt $THRESHOLD ]; then
    echo "警告: 根分区使用率 ${CURRENT}%" | mail -s "磁盘空间告警" admin@company.com
fi

磁盘配额管理

# 设置用户配额示例
setquota -u username 50G 60G 0 0 /home
# 检查配额使用
repquota -a

四、特殊场景处理

1. 已删除文件未释放空间

# 查找被删除但未释放的文件
lsof | grep deleted | sort -k7 -hr
# 不重启服务释放空间(危险操作,谨慎使用)
for file in $(lsof | grep deleted | awk '{print $2":"$4}' | sort -u); do
    pid=$(echo $file | cut -d: -f1)
    fd=$(echo $file | cut -d: -f2 | tr -d 'rwu')
    echo "清理进程 $pid 的文件描述符 $fd"
    : > /proc/$pid/fd/$fd
done
# 安全做法:重启相关服务
systemctl restart apache2 mysql

2. LVM扩容操作流程

运维人员监控系统服务器LVM文件系统接收磁盘空间告警发送扩容通知登录服务器检查执行lvextend扩容lvextend -L +20G /dev/vg0/lv0扩展文件系统xfs_growfs /mount_point或 resize2fs /dev/vg0/lv0返回扩容结果确认扩容完成关闭告警运维人员监控系统服务器LVM文件系统

五、企业级解决方案

1. 存储架构建议

日志分离架构

# 单独日志分区挂载示例
/dev/sdb1   /var/log  xfs  defaults,noatime  0 0
/dev/sdb2   /opt/data xfs  defaults,noatime  0 0

自动化清理策略

# Ansible清理剧本示例
- name: 磁盘空间维护
  hosts: production
  tasks:
    - name: 清理旧日志
      find:
        paths: "/var/log"
        patterns: "*.log.*"
        age: "7d"
      register: old_logs
    - name: 删除找到的旧日志
      file:
        path: "{{ item.path }}"
        state: absent
      with_items: "{{ old_logs.files }}"

2. 推荐工具集

工具名称适用场景特点安装命令
ncdu交互式磁盘分析可视化导航,支持远程apt install ncdu
gt5目录历史对比追踪目录增长趋势yum install gt5
iotopIO监控定位高IO进程apt install iotop
dust现代化du替代彩色输出,更直观cargo install du-dust

重要安全提示

  1. 备份优先: 任何删除操作前务必确认文件重要性,建议首次操作在测试环境验证
  2. 渐进清理: 采用"查看-备份-移动-删除"的渐进式清理策略
  3. 监控验证: 清理后持续监控磁盘使用情况,确保问题真正解决
  4. 文档记录: 记录清理操作内容和时间,便于审计和问题追溯

紧急恢复命令:

# 如果误删重要文件,立即停止写入并尝试恢复
echo 1 > /proc/sys/vm/drop_caches  # 清除缓存避免覆盖
extundelete /dev/sda1 --restore-all  # 尝试恢复删除的文件
posted on 2025-10-20 20:13  ljbguanli  阅读(17)  评论(0)    收藏  举报