当服务器磁盘空间突然告急时,很多运维人员的第一反应往往是"哪个目录占用了这么多空间?"上周我就遇到一个典型案例:某台生产环境服务器突然触发磁盘报警,使用率飙升至95%。如果直接用ls -lh命令查看,根本找不到罪魁祸首——因为大文件可能藏在十几层子目录深处。这时候du命令就派上用场了,它能在3秒内帮你定位到真正的空间占用大户。
du(disk usage的缩写)是Linux系统自带的磁盘分析工具,相比简单的ls命令,它有三大不可替代的优势:
实际工作中,我主要用du解决三类问题:
新手建议从这两个黄金参数开始:
bash复制du -h --max-depth=1 /path/to/directory
这里的-h代表"human-readable",会自动将字节数转换为KB/MB/GB单位。而--max-depth=1控制递归深度,表示只显示指定目录的直接子目录统计。如果不加路径参数,默认分析当前目录。
举个例子,分析根目录的空间占用:
bash复制$ du -h --max-depth=1 /
12K /lost+found
7.8G /home
24G /var
1.2G /usr
48K /root
33G /
从输出可以立即看出/var和/home是主要空间占用者,接下来可以针对性地深入分析这些目录。
除了基础参数,这些选项在实际工作中非常实用:
-s:只显示汇总结果(summarize),适合快速查看总量bash复制$ du -sh /var/log
3.4G /var/log
-a:显示所有文件而不仅是目录(all),配合-h使用更佳bash复制$ du -ah --max-depth=1 /tmp | sort -rh | head -5
2.1G /tmp/large_video.mp4
1.4G /tmp/database_dump.sql
-x:不跨越文件系统边界(one-file-system),避免统计挂载点bash复制$ du -xh --max-depth=1 /
-t:设置大小阈值(threshold),过滤小文件bash复制# 只显示大于1GB的目录
$ du -h --max-depth=1 -t 1G /
结合sort和head命令,可以快速找出占用最大的目录:
bash复制$ du -h --max-depth=1 / | sort -rh | head -5
33G /
24G /var
7.8G /home
1.2G /usr
12K /lost+found
这里sort -rh表示按人类可读的数字逆序排序,head -5显示前5行结果。我在处理一次线上事故时,用这个方法10秒就定位到某个日志目录异常增长到20GB。
有时需要排除某些已知的大目录(如挂载的NAS),可以用--exclude参数:
bash复制$ du -h --max-depth=1 --exclude="/mnt" /
更复杂的排除模式可以配合find命令:
bash复制$ find / -type d \( -name "cache" -o -name "temp" \) -prune -o -print | du -h --files0-from=- | sort -rh
du本身不直接支持按时间筛选,但可以结合find实现:
bash复制# 查找最近7天修改的大于100MB的文件
$ find / -type f -size +100M -mtime -7 -exec du -h {} + | sort -rh
这个Bash脚本可以定期记录目录大小变化:
bash复制#!/bin/bash
LOG_FILE="/var/log/disk_usage.log"
TARGET_DIRS=("/var/log" "/tmp" "/home")
echo "==== $(date) ====" >> $LOG_FILE
for dir in "${TARGET_DIRS[@]}"; do
size=$(du -s "$dir" | awk '{print $1}')
echo "$dir: ${size}KB" >> $LOG_FILE
done
设置cron任务每天运行:
bash复制0 3 * * * /path/to/disk_monitor.sh
当某个目录超过阈值时自动发送告警:
bash复制THRESHOLD=10000000 # 10GB in KB
USAGE=$(du -s /var | awk '{print $1}')
if [ $USAGE -gt $THRESHOLD ]; then
echo "Warning: /var usage exceeded $THRESHOLD KB" | mail -s "Disk Alert" admin@example.com
fi
虽然du是命令行工具,但可以生成可视化报告:
bash复制# 生成CSV格式数据
du -k --max-depth=3 / | awk -F/ '{print $0}' > disk_usage.csv
# 用Excel或Google Sheets生成树状图
-x参数-L参数才会解引用对于超大型文件系统,这些方法可以显著提升速度:
bash复制# 1. 使用更快的排序算法
du -h --max-depth=1 / | sort -rh --parallel=4
# 2. 跳过特定文件系统
du -xh --exclude="/proc" --exclude="/sys" /
# 3. 后台运行并记录结果
nohup du -sh / > du_result.log 2>&1 &
当du性能不足时,可以考虑这些工具:
ncdu:交互式磁盘分析工具,适合可视化浏览df:查看文件系统整体使用情况ls -lR:简单场景下的替代方案记得第一次处理一个包含数百万小文件的目录时,du运行了20分钟还没结束,后来改用find . -type f -printf '%s\n' | awk '{sum+=$1} END {print sum}'才快速得到结果。不同的工具各有适用场景,关键是要了解它们的特性。