别再只会用df -h了!用ncdu揪出Linux服务器磁盘占满的‘真凶’(以Docker日志为例)
别再只会用df -h了用ncdu揪出Linux服务器磁盘占满的‘真凶’以Docker日志为例当服务器监控系统突然报警磁盘使用率100%大多数运维新手的本能反应是输入df -h确认情况。这个命令确实能快速显示各分区的使用情况但它就像医院体检报告上的肝功能异常提示——告诉你结果却不解释病因。真正的系统诊断需要更专业的医疗设备而ncdu正是这样一款能帮你精准定位问题的内窥镜工具。1. 为什么传统诊断工具力不从心在Linux系统中排查磁盘空间问题du命令曾是大多数人的首选。但当你面对一个复杂的生产环境时这个经典工具暴露出明显的局限性# 传统du命令的典型用法 du -sh /* | sort -h这种方法存在三个致命缺陷扫描速度慢需要完整遍历所有子目录才能计算大小结果不直观需要额外排序命令才能看清最大目录操作风险高误删系统关键文件的风险始终存在更麻烦的是当遇到Docker这类现代技术栈时传统的空间分析方式往往失效。容器运行时产生的日志、缓存和分层镜像其存储路径与常规应用完全不同就像隐藏在迷宫深处的空间吞噬者。2. ncdu空间分析的手术刀ncdu(NCurses Disk Usage)的出现彻底改变了游戏规则。这个基于ncurses库的工具提供了交互式界面和实时分析能力其优势对比传统方法非常明显功能维度du命令ncdu工具扫描速度线性扫描增量扫描结果显示需要额外处理即时排序可视化交互操作纯命令行可视化导航风险控制无保护机制删除确认机制深度分析手动逐层检查一键钻取安装这个神器只需一条命令# Debian/Ubuntu系统 sudo apt install ncdu -y # RHEL/CentOS系统 sudo yum install ncdu -y3. 实战揪出Docker日志这个隐形杀手让我们模拟一个真实场景某台服务器/分区突然爆满初步检查显示/var目录异常膨胀。以下是专业运维的排查流程启动深度扫描sudo ncdu /var在交互界面中使用j/k键导航Enter键进入子目录。当发现/var/lib/docker目录异常时立即聚焦--- /var/lib/docker -------------------------------------------------- 148.7GiB [##########] /containers 12.4GiB [# ] /overlay2 1.2GiB [ ] /volumes进一步检查容器日志目录--- /var/lib/docker/containers/3a7b8...2e1f ------------------------- 148.7GiB [##########] 3a7b8...2e1f-json.log警告直接删除正在使用的日志文件可能导致应用异常。正确的做法是先清空内容而非直接删除文件。4. 安全清理策略与预防措施找到罪魁祸首后需要根据不同类型采取差异化处理即时清理方案# 清空单个日志文件保留inode sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log # 清理无用Docker对象危险操作需确认 docker system prune -a长期预防方案配置Docker日志轮转在/etc/docker/daemon.json中{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }设置日志监控告警当单个容器日志超过100MB时触发通知定期执行安全检查脚本#!/bin/bash CRITICAL$(find /var/lib/docker -type f -name *.log -size 1G) [ -z $CRITICAL ] || echo 发现超大日志文件$CRITICAL | mail -s 磁盘告警 adminexample.com5. 高阶技巧让ncdu更高效专业运维人员通常会定制化使用ncdu排除特定目录加速扫描ncdu --exclude /proc --exclude /sys /导出扫描结果供后续分析ncdu -o scan.result /远程分析其他服务器ssh userserver ncdu -o - / | ncdu -f -定时扫描对比发现异常增长# 首次扫描 ncdu -o baseline.scan /var # 后续对比 ncdu --compare baseline.scan /var在处理完一次紧急磁盘爆满事故后我养成了每周用ncdu做全盘检查的习惯。有次提前发现某个MySQL容器日志异常增长及时处理避免了生产事故。这个工具现在已成为我的服务器健康检查清单中的必选项——毕竟在运维领域预防总是比抢救来得轻松。