linux磁盘空间爆满排查与清理
一、系统化排查流程
1. 诊断流程图
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 {dailyrotate 30compressmissingoknotifemptycreate 644 tomcat tomcatpostrotate/usr/bin/kill -HUP `cat /var/run/tomcat.pid 2>/dev/null` 2>/dev/null || trueendscript
}# 查找日志大文件并清理
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_DIRecho "=== 开始磁盘清理 $(date) ==="# 1. 备份并清理旧日志
echo "清理超过${DAYS_TO_KEEP}天的日志文件..."
find $LOG_DIR -type f -name "*.log" -mtime +$DAYS_TO_KEEP | while read file; doecho "备份并删除: $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; doecho "清空大文件: $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 ]; thenecho "警告: 根分区使用率 ${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); dopid=$(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扩容操作流程
五、企业级解决方案
1. 存储架构建议
日志分离架构
# 单独日志分区挂载示例
/dev/sdb1 /var/log xfs defaults,noatime 0 0
/dev/sdb2 /opt/data xfs defaults,noatime 0 0
自动化清理策略
# Ansible清理剧本示例
- name: 磁盘空间维护hosts: productiontasks:- name: 清理旧日志find:paths: "/var/log"patterns: "*.log.*"age: "7d"register: old_logs- name: 删除找到的旧日志file:path: "{{ item.path }}"state: absentwith_items: "{{ old_logs.files }}"
2. 推荐工具集
工具名称 | 适用场景 | 特点 | 安装命令 |
---|---|---|---|
ncdu | 交互式磁盘分析 | 可视化导航,支持远程 | apt install ncdu |
gt5 | 目录历史对比 | 追踪目录增长趋势 | yum install gt5 |
iotop | IO监控 | 定位高IO进程 | apt install iotop |
dust | 现代化du替代 | 彩色输出,更直观 | cargo install du-dust |
重要安全提示
- 备份优先: 任何删除操作前务必确认文件重要性,建议首次操作在测试环境验证
- 渐进清理: 采用"查看-备份-移动-删除"的渐进式清理策略
- 监控验证: 清理后持续监控磁盘使用情况,确保问题真正解决
- 文档记录: 记录清理操作内容和时间,便于审计和问题追溯
紧急恢复命令:
# 如果误删重要文件,立即停止写入并尝试恢复
echo 1 > /proc/sys/vm/drop_caches # 清除缓存避免覆盖
extundelete /dev/sda1 --restore-all # 尝试恢复删除的文件