1. Linux文件统计利器:du命令深度解析
在Linux系统管理中,磁盘空间管理是每个运维人员和开发者必须掌握的基础技能。当你的服务器突然报警磁盘空间不足,或者需要清理老旧日志文件时,快速准确地定位"空间吞噬者"就显得尤为重要。du(disk usage)命令正是解决这类问题的瑞士军刀,它不仅能统计单个文件大小,更能递归计算目录总占用空间,配合各种参数可以实现灵活的空间分析。
我管理过上百台Linux服务器,发现90%的磁盘空间问题都可以通过du命令快速定位。与简单的ls -lh不同,du直接显示磁盘块的实际占用情况,这在处理大量小文件或稀疏文件时尤为准确。下面我将分享十年运维积累的du实战经验,从基础用法到高阶技巧,帮你彻底掌握这个空间分析神器。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. du命令核心参数详解
2.1 基础统计模式
最基础的du [文件/目录]会递归显示所有子目录的磁盘用量(默认以KB为单位)。但实际工作中我们更常用这些参数组合:
bash复制du -sh * # -s汇总显示 -h人性化单位
这个经典组合能立即显示当前目录下所有文件和目录的总大小,MB/GB单位自动转换,避免了数字位数过长的问题。比如发现某个日志目录显示"4.0G",就能快速锁定需要清理的目标。
2.2 深度控制与过滤
当处理深层目录结构时,--max-depth参数能控制递归深度:
bash复制du -h --max-depth=1 /var # 只显示/var下第一级目录大小
结合sort命令可以快速找出最大目录:
bash复制du -h --max-depth=1 /var | sort -hr | head -n 5
这个管道组合会按大小降序显示/var下最大的5个目录,在排查磁盘爆满问题时特别高效。
2.3 排除特定文件类型
有时需要排除某些文件类型的统计,比如临时文件:
bash复制du -h --exclude="*.tmp" /data
注意exclude模式匹配的是完整路径,如果要排除目录需要写完整路径或使用--exclude-from参数指定排除列表文件。
3. 高级应用场景与技巧
3.1 统计差异对比
当需要对比两次统计结果时(比如清理前后),可以:
bash复制du -sb /target > before.txt
# 执行清理操作后
du -sb /target > after.txt
diff -y before.txt after.txt
使用-b参数(以字节为单位)能确保统计精度,适合需要精确对比的场景。
3.2 跨文件系统统计
默认情况下du会统计所有子目录,包括挂载点。使用-x参数可以限制在当前文件系统:
bash复制du -xh / # 不统计其他挂载点如/data /mnt等
这个技巧在分析根分区使用情况时非常有用,避免外部存储干扰统计结果。
3.3 特殊文件处理
对于稀疏文件(sparse file)或压缩文件系统,需要注意:
--apparent-size显示逻辑大小而非磁盘占用-B参数可以指定块大小(如-BM以MB为单位统计)- 使用
du --inodes可以统计inode使用情况,解决"磁盘未满但无法创建文件"的问题
4. 常见问题排查实录
4.1 du与df统计差异
经常有工程师困惑:为什么du统计的目录总和与df显示的已用空间不一致?主要原因包括:
- 已删除但仍被进程占用的文件(lsof检查)
- 文件系统预留空间(ext4默认保留5%)
- 日志文件系统如xfs的元数据开销
- 容器/虚拟机的存储驱动开销
4.2 性能优化技巧
统计大目录时du可能较慢,这些技巧可以提速:
- 使用
--time参数查看统计耗时 - 通过
ionice -c 3 du...降低IO优先级 - 对NFS等网络存储先做本地快照再统计
- 避免在统计期间并行执行大量IO操作
4.3 权限问题处理
当遇到"Permission denied"错误时:
bash复制sudo du -sh /root # 需要root权限的目录
du -sh 2>/dev/null # 静默权限错误
find /path -type d -exec du -s {} + 2>/dev/null # 跳过无权限目录
5. 生产环境实战案例
5.1 日志文件分析
某次线上报警显示/var分区使用率95%,通过以下命令快速定位:
bash复制du -h --max-depth=1 /var | sort -hr
发现/var/log/journal占用了82G空间,进一步检查是systemd-journal日志未配置轮转。临时解决方案:
bash复制journalctl --vacuum-size=1G # 清理日志保留1G
长期方案则是修改/etc/systemd/journald.conf配置日志大小限制。
5.2 用户磁盘配额监控
在共享主机环境中,可以用du定期统计用户目录:
bash复制for user in /home/*; do
echo -n "$user: "
du -sh "$user" | cut -f1
done
结合crontab设置每日运行,输出结果重定向到监控系统。
5.3 容器存储分析
Docker容器的存储占用经常出人意料:
bash复制du -h /var/lib/docker/overlay2 | sort -hr | head -n 10
这个命令可以找出最大的容器存储层,对于清理退出的容器和悬空镜像很有帮助。
6. 可视化与扩展工具
虽然du是命令行工具,但可以结合其他工具实现可视化:
bash复制du -h / | ncdu -o- # 生成可浏览的磁盘使用报表
或者使用图形化工具如:
- gdmap - 生成磁盘空间热图
- baobab - GNOME磁盘使用分析器
- k4dirstat - KDE版本的磁盘统计工具
对于需要持续监控的场景,建议使用Prometheus的node_exporter或者telegraf采集磁盘指标,配合Grafana展示历史趋势。
掌握du命令的艺术不仅能帮你快速解决磁盘空间问题,更能培养对存储系统的直觉理解。记住,最好的工具往往是那些看似简单却内涵丰富的经典命令。下次当你面对磁盘空间告警时,不妨先深呼吸,然后拿起du这把瑞士军刀,精准地解剖存储问题。
