别再只会用df -h了!用ncdu可视化揪出Linux服务器磁盘爆满的元凶(附Docker日志清理脚本)
2026/5/12 4:34:22 网站建设 项目流程

别再只会用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/ # 按大小排序显示文件

这种方法存在三个致命缺陷:

  1. 层级穿透困难:需要手动进入每个可疑目录重复执行du
  2. 结果不直观:数字堆砌难以快速识别异常点
  3. 操作风险高:误删关键文件的风险始终存在

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 典型磁盘杀手排查

根据笔者处理过的数百起磁盘告警案例,这些目录最可能藏有"空间怪兽":

  1. Docker存储/var/lib/docker(特别是aufs/diff目录)
  2. 日志文件/var/log/journal/(systemd日志)
  3. 临时文件/tmp/var/tmp
  4. 缓存数据/var/cache/apt/archives/

注意:删除前建议先用ls -lh查看文件详情,避免误删正在使用的交换文件或数据库

3. Docker空间清理终极方案

当ncdu指向/var/lib/docker时,说明容器已成为磁盘空间的头号公敌。以下是经过实战检验的清理组合拳:

3.1 基础清理命令

# 删除所有停止的容器、悬空镜像和未使用网络 docker system prune -f # 彻底清理(包括未被任何容器引用的镜像) docker system prune -a --volumes

3.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.sh

3.3 高级空间回收

对于使用devicemapper存储驱动的情况,额外执行:

# 查看元数据空间使用 docker info | grep 'Data Space Used' # 回收thin pool空间 docker run --privileged --pid=host docker/desktop-reclaim-space

4. 防患于未然:磁盘空间监控体系

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 * 100
  • rate(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使配置生效。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询