1. 为什么每个Linux用户都必须掌握du命令?
在服务器运维的第七个年头,我处理过上百次磁盘爆满的紧急告警。最夸张的一次是某电商大促期间,日志文件在30分钟内吃掉了90%的磁盘空间。当时正是du -h --max-depth=1 /var/log这个命令组合,让我在10秒内锁定了罪魁祸首——一个失控的支付服务日志文件。这就是磁盘分析利器du(Disk Usage)的实战价值。
1.1 du命令的核心定位
作为Linux磁盘管理的"三剑客"之一(另外两个是df和lsblk),du专门用于计算文件和目录的物理存储占用。与df显示文件系统整体使用情况不同,du的精妙之处在于:
- 精确到子目录级:可以递归统计每个子目录的磁盘占用
- 支持人类可读格式:用
-h参数自动转换KB/MB/GB单位 - 深度可控:通过
--max-depth限定扫描层级 - 排除干扰:用
--exclude过滤特定文件类型
1.2 典型应用场景速览
根据我处理过的案例,du命令最常见的用武之地包括:
- 定位磁盘空间异常占用的"元凶"
- 定期清理前评估目录大小
- 备份前计算数据体积
- 监控关键目录增长趋势
- 排查隐藏的大文件(如
.*开头的隐藏文件)
经验之谈:在SSD服务器上慎用无限制的
du /全盘扫描,高频IO操作可能影响正在运行的服务。建议先用--max-depth限定范围。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. du命令完全参数解析与实战组合
2.1 基础参数:你必须掌握的六种武器
bash复制# 1. 基础格式(默认显示字节数)
du /path/to/directory
# 2. 人类可读格式(最常用)
du -h /var/log
# 3. 显示总和(适用于统计总量)
du -sh /home
# 4. 限制递归深度(性能与精度的平衡)
du -h --max-depth=1 /usr
# 5. 排除特定模式(过滤干扰项)
du -h --exclude='*.log' /opt
# 6. 按大小排序输出(需结合sort)
du -h /var | sort -rh | head -n 10
参数组合效果对比:
| 命令示例 | 输出特点 | 适用场景 |
|---|---|---|
du -sh * |
当前目录各项目总大小 | 快速概览 |
du -h --time * |
显示最后修改时间 | 找近期变化的目录 |
du -ah --max-depth=1 |
显示所有文件(含隐藏文件) | 彻底排查 |
du -csh * |
显示每个项目及累计总和 | 统计汇总 |
2.2 高阶技巧:运维老手的私藏秘籍
场景一:快速定位TOP10大目录
bash复制# 组合sort和head实现智能排序
du -h / 2>/dev/null | sort -rh | head -n 10
这个命令链的妙处在于:
2>/dev/null屏蔽无权限目录的报错sort -rh按人类可读数值逆序排序head -n 10只显示前10条结果
场景二:排除特定文件类型扫描
bash复制# 忽略所有.jpg文件
du -h --exclude='*.jpg' /var/www
场景三:跨文件系统统计(避免误计挂载点)
bash复制du -h -x / # -x参数不跨越文件系统边界
3. 性能优化与安全注意事项
3.1 大型文件系统的扫描策略
在PB级存储系统上直接运行du /可能导致:
- 长时间IO等待(我曾遇到过扫描24小时的情况)
- 系统负载飙升影响服务
- 临时目录
/tmp被占满
优化方案:
- 分时段扫描:通过
ionice降低IO优先级bash复制ionice -c 3 du -h /data - 后台执行+结果重定向
bash复制nohup du -h / > du_result.log 2>&1 & - 使用
ncdu等替代工具(交互式界面更友好)
3.2 权限管理避坑指南
常见权限问题及解决方案:
| 错误现象 | 原因分析 | 解决方案 |
|---|---|---|
du: cannot access 'xxx' |
目录无读取权限 | 使用sudo或调整目录权限 |
| 结果明显偏小 | 遇到符号链接未跟随 | 添加-L参数跟随链接 |
| 重复统计 | 跨文件系统重复统计 | 添加-x参数限制 |
安全提示:生产环境中谨慎使用
sudo du,某些恶意软链接可能指向敏感路径。建议先用ls -l确认链接指向。
4. 实战案例:从报警到解决的完整流程
凌晨3点的紧急工单: /var分区使用率超过95%
第一步:快速定位问题目录
bash复制$ sudo du -h --max-depth=1 /var | sort -rh
12G /var
9.8G /var/log
1.2G /var/lib
...
第二步:分析异常目录
bash复制$ sudo du -h /var/log | grep -E '[0-9]G'
8.4G /var/log/nginx/error.log
第三步:处理日志文件(非简单删除!)
bash复制# 清空日志文件(保留inode)
sudo truncate -s 0 /var/log/nginx/error.log
# 配置logrotate防止复发
sudo vim /etc/logrotate.d/nginx
第四步:验证结果
bash复制$ df -h /var
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 50G 15G 33G 31% /var
这个案例展示了标准处理流程:定位→分析→处理→验证。关键在于使用--max-depth快速缩小范围,再通过管道组合命令精准打击问题文件。
5. 替代方案与扩展工具
当du无法满足需求时,可以考虑:
ncdu (NCurses Disk Usage)
- 交互式界面
- 支持键盘导航
- 可删除文件
安装方式:
bash复制sudo apt install ncdu # Debian/Ubuntu
sudo yum install ncdu # CentOS/RHEL
图形化工具对比
| 工具名称 | 特点 | 适用场景 |
|---|---|---|
| Baobab | GNOME官方工具,环形图展示 | 桌面环境快速分析 |
| QDirStat | Qt开发,支持多种视图 | 复杂目录结构分析 |
| Filelight | KDE组件,可视化出色 | KDE环境用户 |
对于习惯命令行的用户,推荐掌握这些du的黄金搭档:
df -h:查看文件系统整体使用情况ls -lh:查看单个文件大小find -size:按大小查找文件
6. 自动化监控与告警配置
将du命令集成到监控系统中:
示例:每日磁盘使用报告
bash复制#!/bin/bash
REPORT_FILE="/var/log/disk_usage_$(date +%Y%m%d).log"
echo "==== Disk Usage Report ====" > $REPORT_FILE
du -h --max-depth=1 /var >> $REPORT_FILE 2>&1
mail -s "Daily Disk Report" admin@example.com < $REPORT_FILE
Prometheus监控配置
yaml复制- job_name: 'disk_usage'
static_configs:
- targets: ['localhost']
metrics_path: '/custom_metrics'
params:
directory: ['/var', '/home']
关键指标阈值建议
| 目录 | 警告阈值 | 严重阈值 | 检查频率 |
|---|---|---|---|
| / | 80% | 90% | 每小时 |
| /var/log | 5GB | 10GB | 每天 |
| /home | 85% | 95% | 每天 |
在多年的运维生涯中,我发现很多"磁盘空间不足"的紧急情况,其实都可以通过定期运行du命令来预防。建议将关键目录的du检查纳入日常巡检流程,比如每周用du -sh /var/* | mail -s "Weekly Var Check" admin@example.com自动发送报告。
