Linux LVM根分区磁盘爆满排查指南:从定位到清理的完整解决方案
当服务器突然告警磁盘空间不足时,那种紧迫感每个运维人员都深有体会。特别是当根分区(/dev/mapper/vg_xxx-lv_root)显示100%占用时,系统随时可能崩溃。本文将带你系统化解决这个问题,不仅提供应急处理方案,还会分享如何预防此类问题再次发生。
1. 快速诊断:三步定位磁盘占用元凶
遇到磁盘爆满时,盲目删除文件可能造成严重后果。我们推荐以下系统化的排查流程:
1.1 第一步:确认磁盘使用情况
首先用df命令确认问题所在分区:
df -hT关键观察点:
- Filesystem:确认是
/dev/mapper/vg_xxx-lv_root占用100% - Mounted on:确认挂载点为根目录
/ - Type:了解文件系统类型(ext4/xfs),这对后续扩容很重要
典型输出示例:
Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_centos-root xfs 50G 50G 20K 100% /1.2 第二步:定位大文件目录
使用du命令找出占用空间最大的目录:
du -hx --max-depth=1 / | sort -h这个命令组合的巧妙之处在于:
-h:人类可读格式显示大小-x:不跨越文件系统边界(避免统计挂载点)--max-depth=1:只显示一级子目录sort -h:按人类可读的大小排序
常见占用大户目录:
/var:日志、数据库文件/usr:系统软件/home:用户数据/opt:第三方应用
1.3 第三步:精确查找大文件
锁定可疑目录后,使用find命令定位具体的大文件:
find /var -type f -size +500M -exec ls -lh {} \; | sort -k5 -h -r参数解析:
-type f:只查找文件-size +500M:大于500MB的文件-exec ls -lh {} \;:显示详细信息sort -k5 -h -r:按第五列(大小)逆序排序
2. 常见罪魁祸首及专业处理方案
根据多年运维经验,以下是最常见的磁盘占用元凶及其安全清理方法:
2.1 MySQL日志文件处理
MySQL相关日志通常位于/var/lib/mysql/,主要包括:
- binlog:mysql-bin.000xxx
- 错误日志:mysqld.log
- 慢查询日志:slow.log
安全清理方案:
对于binlog文件,绝对不要直接rm删除!正确的做法是:
-- 登录MySQL后执行 PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00'; -- 清理指定日期前的日志 -- 或 PURGE BINARY LOGS TO 'mysql-bin.000010'; -- 清理到指定日志文件 -- 或设置自动过期(推荐) SET GLOBAL expire_logs_days = 3; -- 只保留3天日志对于错误日志,安全的做法是清空而非删除:
> /var/log/mysqld.log # 清空日志文件2.2 系统日志文件处理
系统日志通常位于/var/log/,常见占用空间的文件:
- messages:系统主日志
- secure:安全相关日志
- audit/audit.log:审计日志
专业处理建议:
- 使用logrotate配置自动轮转:
cat /etc/logrotate.d/syslog典型配置示例:
/var/log/messages { daily rotate 7 compress delaycompress missingok notifempty create 0640 root adm }- 手动清理旧日志:
# 保留最近7天日志 find /var/log -type f -name "*.log" -mtime +7 -exec truncate -s 0 {} \;2.3 已删除但未释放空间的文件处理
有时文件已被删除,但进程仍持有文件句柄,空间并未释放。使用lsof工具检测:
lsof | grep deleted | sort -nrk7处理方案:
- 记录占用进程的PID
- 评估是否可以重启该进程
- 必要时用
kill -HUP PID优雅重启进程
3. 高级排查技巧与预防措施
3.1 Inode耗尽问题排查
即使磁盘空间足够,inode耗尽也会导致"No space left"错误。检查方法:
df -i # 查看inode使用情况解决方案:
- 删除小文件:
find / -type f -size -1k -exec rm {} \; - 调整文件系统inode数量(需重新格式化)
3.2 Docker磁盘空间管理
Docker会占用大量空间在:
/var/lib/docker/overlay2/:容器存储层- 未清理的镜像、容器
清理命令:
docker system prune -a # 清理所有未使用的资源 docker volume prune # 清理未使用的卷3.3 LVM扩容终极解决方案
当清理无法解决问题时,考虑扩容LVM:
# 查看当前VG空间 vgs # 扩容物理卷 pvresize /dev/sdaX # 扩容逻辑卷 lvextend -L +10G /dev/mapper/vg_centos-root # 扩展文件系统 resize2fs /dev/mapper/vg_centos-root # 对于ext4 xfs_growfs /dev/mapper/vg_centos-root # 对于xfs4. 长效预防机制建设
监控预警:
- 配置Prometheus监控磁盘使用率
- 设置80%阈值告警
日志管理规范:
- 统一日志收集到ELK
- 配置合理的logrotate策略
定期维护:
# 每周清理临时文件 find /tmp -type f -atime +7 -delete # 每月检查大文件 find / -type f -size +1G -exec ls -lh {} \;架构优化:
- 将日志、数据分离到独立分区
- 使用云原生存储方案动态扩容
一套完整的磁盘空间管理策略,应该像优秀的城市规划,既要解决当下的交通拥堵,也要为未来发展预留空间。通过本文介绍的系统化方法,你不仅能快速解决当前的磁盘危机,更能建立起长效预防机制,让服务器运行更加稳健可靠。