别再只会用df -h了!用ncdu可视化揪出Linux服务器磁盘爆满的元凶(附Docker日志清理脚本)
别再只会用df -h了!用ncdu可视化揪出Linux服务器磁盘爆满的元凶(附Docker日志清理脚本)
收到服务器磁盘告警时,大多数运维工程师的第一反应是执行df -h查看磁盘使用情况。这个命令确实能快速告诉我们哪个分区满了,但它就像医院里的体温计——只能告诉你发烧了,却无法诊断病因。当/dev/sda显示100%使用率时,真正的挑战才刚刚开始:如何在数百GB的数据海洋中,精准定位那几个吞噬空间的"巨鲸文件"?
传统做法是du -sh *一层层手动排查,这就像在迷宫里蒙眼摸索,不仅效率低下,还容易遗漏隐藏在深层目录中的大文件。而ncdu(NCurses Disk Usage)的出现,彻底改变了这场"寻宝游戏"的规则。这个基于终端的可视化工具,能在几秒内扫描整个目录树,用交互式界面直观展示每个文件夹的空间占比,甚至支持直接删除文件——所有操作无需离开键盘。
1. 从告警到定位:磁盘排查工具进化论
1.1 传统三板斧的局限性
当服务器弹出"no space left on device"警告时,老派运维可能会祭出这三件套:
df -h # 查看分区使用概览 du -sh /* # 根目录下各文件夹大小 ls -lhS /var/log/ # 按大小排序显示文件这种方法存在三个致命缺陷:
- 层级穿透困难:需要手动进入每个可疑目录重复执行
du - 结果不直观:数字堆砌难以快速识别异常点
- 操作风险高:误删关键文件的风险始终存在
1.2 ncdu的降维打击
安装这个不足1MB的工具只需一条命令:
sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # RHEL/CentOS其核心优势通过这个对比表一目了然:
| 功能特性 | df/du组合 | ncdu |
|---|---|---|
| 扫描速度 | 逐层手动执行慢 | 全自动递归扫描快 |
| 结果呈现 | 纯数字列表 | 交互式百分比柱状图 |
| 导航效率 | 需多次cd切换目录 | 单界面键盘快捷跳转 |
| 危险操作防护 | 直接执行rm | 需确认删除操作 |
| 排序灵活性 | 需额外管道操作 | 内置多维度排序 |
提示:首次使用建议添加
--exclude-kernfs参数跳过虚拟文件系统:ncdu --exclude-kernfs /
2. ncdu实战:揪出磁盘空间的隐形杀手
2.1 高效导航技巧
启动扫描后,你会看到类似这样的界面:
--- / -------------------------------------------------- 96.3GiB [##########] /var 12.1GiB [# ] /usr 4.7GiB [ ] /home通过这些快捷键实现闪电导航:
- j/k:上下移动光标(Vim党狂喜)
- Enter:进入选中目录
- <:返回上级目录
- n/s:按名称/大小排序(反复按切换升降序)
- d:标记删除当前文件(实际删除需确认)
2.2 典型磁盘杀手排查
根据笔者处理过的数百起磁盘告警案例,这些目录最可能藏有"空间怪兽":
- Docker存储:
/var/lib/docker(特别是aufs/diff目录) - 日志文件:
/var/log/journal/(systemd日志) - 临时文件:
/tmp和/var/tmp - 缓存数据:
/var/cache/apt/archives/
注意:删除前建议先用
ls -lh查看文件详情,避免误删正在使用的交换文件或数据库
3. Docker空间清理终极方案
当ncdu指向/var/lib/docker时,说明容器已成为磁盘空间的头号公敌。以下是经过实战检验的清理组合拳:
3.1 基础清理命令
# 删除所有停止的容器、悬空镜像和未使用网络 docker system prune -f # 彻底清理(包括未被任何容器引用的镜像) docker system prune -a --volumes3.2 日志清理脚本
将以下脚本保存为clean_docker_logs.sh:
#!/bin/bash echo "===== Docker日志清理开始 =====" logs=$(find /var/lib/docker/containers -name '*-json.log') for log in $logs; do if [ -f "$log" ]; then echo "清空 $log" truncate -s 0 "$log" fi done echo "===== 共清理 ${#logs[@]} 个日志文件 ====="赋予执行权限并运行:
chmod +x clean_docker_logs.sh sudo ./clean_docker_logs.sh3.3 高级空间回收
对于使用devicemapper存储驱动的情况,额外执行:
# 查看元数据空间使用 docker info | grep 'Data Space Used' # 回收thin pool空间 docker run --privileged --pid=host docker/desktop-reclaim-space4. 防患于未然:磁盘空间监控体系
4.1 自动化监控方案
配置Prometheus+Grafana实现预警:
# prometheus.yml 片段 scrape_configs: - job_name: 'node_disk' static_configs: - targets: ['node-exporter:9100']关键监控指标:
node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes * 100rate(node_disk_written_bytes_total[1h])
4.2 日志轮转配置
在/etc/logrotate.d/docker中添加:
/var/lib/docker/containers/*/*.log { rotate 7 daily compress delaycompress missingok copytruncate }最后记得定期执行logrotate -f /etc/logrotate.conf使配置生效。
