Linux 磁盘满 5 大根因与解法:从 Inode 耗尽到 Docker 缓存

📅 2026/7/6 2:11:35
Linux 磁盘满 5 大根因与解法:从 Inode 耗尽到 Docker 缓存
Linux 磁盘空间告急全景排查指南从基础清理到高级扩容当服务器磁盘空间耗尽时整个系统可能陷入瘫痪——数据库拒绝连接、应用无法写入日志、甚至系统命令都无法执行。对于运维工程师来说快速定位问题根源并采取正确措施至关重要。本文将系统性地介绍五种常见磁盘空间耗尽场景及其解决方案帮助您建立完整的排查思路。1. 基础排查定位磁盘空间占用元凶遇到磁盘空间不足的报警时第一步是确认问题的范围和严重程度。以下命令组合能快速帮您摸清现状# 查看各挂载点使用情况人类可读格式 df -h # 查看inode使用情况处理小文件爆炸场景 df -i # 找出根目录下占用空间前10的目录 du -hx --max-depth1 / | sort -rh | head -n 10典型输出示例Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 48G 0 100% / /dev/vdb1 100G 20G 80G 20% /data /var/log 25G /var/lib/docker 15G /opt 5.2G关键指标解读Use%达到100%表示分区已满IUse%达到100%表示inode耗尽du命令结果展示具体目录占用空间注意如果df显示已满但du统计的总和远小于磁盘用量可能存在幽灵空间已删除但未释放的文件我们将在第3节专门讨论这种情况。2. 常规清理释放可回收空间对于明确的存储占用可以按照以下优先级进行清理2.1 日志文件清理系统和服务日志是常见的空间杀手特别是长期运行的服务器# 查看/var/log目录下大于100MB的日志文件 find /var/log -type f -size 100M -exec ls -lh {} \; # 安全清理方法示例为Nginx日志 echo /var/log/nginx/access.log journalctl --vacuum-size200M # 系统日志保留200MB # MySQL二进制日志清理需连接数据库 PURGE BINARY LOGS BEFORE 2023-01-01 00:00:00;2.2 软件包缓存清理包管理器会保留下载的安装包长期积累可能占用数GB空间包管理器清理命令典型释放空间yumyum clean all0.5-2GBaptapt-get clean1-3GBdnfdnf clean all1-2GB2.3 临时文件清理系统临时目录和用户缓存也是清理重点# 系统级临时文件 rm -rf /tmp/* # 用户缓存保留重要配置 find ~/.cache -type f -atime 30 -delete3. 高级场景隐藏的空间占用有些空间占用不会直接体现在常规检查中需要特殊手段排查。3.1 已删除但未释放的文件当进程持有已删除文件的句柄时空间不会被释放# 安装lsof工具如未安装 yum install -y lsof || apt-get install -y lsof # 查找被删除但仍被进程占用的文件 lsof | grep deleted | sort -k7 -rn输出示例mysql 1234 root 10u REG 0,3 2147483648 1234 /var/lib/mysql/ibdata1 (deleted)处理方法重启持有文件的进程示例中为MySQL或通过/proc文件系统手动释放gdb -p 1234 call close(10) # 1234是PID10是文件描述符3.2 挂载点覆盖问题当挂载到非空目录时原内容会被隐藏但仍占用空间# 检查重复挂载点 lsblk -o NAME,MOUNTPOINT # 查找被隐藏的空间 mount | grep -v overlay | awk {print $3} | xargs -I{} find {} -xdev -type f -size 100M解决方案卸载后重新挂载到空目录或迁移原目录内容后再挂载4. Inode耗尽小文件过多的解决方案即使磁盘空间充足inode耗尽也会导致磁盘已满错误# 查看inode使用情况 df -i # 查找inode消耗大户 find / -xdev -printf %h\n | sort | uniq -c | sort -k1 -n常见inode黑洞及处理邮件队列/var/spool/postfix清理旧队列Docker层/var/lib/docker/overlay2prune无用镜像小文件缓存应用生成的临时文件优化应用配置临时扩容方案# 重新格式化并增加inode数量需备份数据 mkfs.ext4 -N 2000000 /dev/sda15. Docker存储优化容器场景专项处理容器环境会产生独特的存储问题需要专门工具管理# 查看Docker磁盘使用 docker system df # 全面清理危险会删除所有未使用的资源 docker system prune --all --volumes # 针对性清理 docker image prune # 删除悬空镜像 docker volume prune # 删除未使用的卷Docker存储驱动对比驱动类型空间效率性能适用场景overlay2中高通用场景默认devicemapper低中旧版本兼容zfs高中大数据量环境优化建议定期执行docker system prune为/var/lib/docker单独挂载大容量分区考虑使用docker save导出重要镜像后清理6. 终极方案存储扩容实战指南当清理无法满足需求时扩容成为最终选择。以下是LVM扩容的标准流程# 查看当前VG空间 vgs # 如果VG有剩余空间直接扩展LV lvextend -L 20G /dev/mapper/vg-root # 如果没有空间先扩展PV pvresize /dev/sda3 # 扩展文件系统ext4示例 resize2fs /dev/mapper/vg-rootXFS文件系统特别注意事项# XFS必须在挂载状态下扩容 xfs_growfs /mount/point关键提示扩容前务必创建快照备份误操作可能导致数据丢失。通过这套组合方案您应该能够应对绝大多数磁盘空间告急的场景。记住预防胜于治疗——设置监控告警如PrometheusAlertmanager和定期清理任务如logrotate能有效避免紧急情况的发生。