磁盘空间查看 - du和df命令详解
磁盘空间管理是Linux系统运维的重要任务。du
和df
命令是查看磁盘使用情况的核心工具,掌握它们的用法对系统维护至关重要。
df命令 - 查看文件系统磁盘空间
基本语法
df [选项] [文件系统...]
主要选项
-h, --human-readable
- 以人类可读格式显示(KB, MB, GB)-k
- 以KB为单位显示-m
- 以MB为单位显示-T, --print-type
- 显示文件系统类型-i, --inodes
- 显示inode使用情况-a, --all
- 显示所有文件系统(包括虚拟文件系统)-l, --local
- 只显示本地文件系统-x, --exclude-type=TYPE
- 排除指定类型的文件系统
基本使用
# 查看磁盘空间占用情况(最常用)
df -h
# 查看指定目录所在分区的空间
df -h /home
# 显示文件系统类型
df -hT
# 查看inode使用情况
df -i
# 只显示本地文件系统
df -hl
输出字段说明
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 5.5G 14G 30% /
/dev/sda2 100G 80G 15G 85% /home
tmpfs 2.0G 0 2.0G 0% /dev/shm
- Filesystem: 文件系统设备名
- Size: 文件系统总大小
- Used: 已使用空间
- Avail: 可用空间
- Use%: 使用百分比
- Mounted on: 挂载点
du命令 - 查看目录和文件大小
基本语法
du [选项] [目录或文件...]
主要选项
-h, --human-readable
- 以人类可读格式显示-s, --summarize
- 只显示总计-a, --all
- 显示所有文件(不只是目录)-c, --total
- 显示总计-d, --max-depth=N
- 限制显示深度-x, --one-file-system
- 不跨越文件系统边界-L, --dereference
- 跟随符号链接--exclude=PATTERN
- 排除匹配模式的文件
基本使用
# 查看当前目录下所有子目录大小
du -h
# 只显示当前目录总大小
du -sh
# 查看指定目录大小
du -sh /var/log
# 显示一级子目录大小
du -h --max-depth=1
# 查看所有文件和目录大小
du -ah
# 显示总计
du -ch
实际应用场景
磁盘空间监控
# 检查磁盘使用率超过80%的分区
df -h | awk 'NR>1 {gsub(/%/, "", $5); if($5 > 80) print $0}'
# 查看剩余空间小于1GB的分区
df -h | awk '$4 ~ /^[0-9]+M$/ || ($4 ~ /^[0-9]+G$/ && $4+0 < 1) {print}'
# 监控根分区使用情况
df -h / | tail -1 | awk '{print "根分区使用率: " $5}'
查找大文件和目录
# 找出当前目录下最大的10个子目录
du -h --max-depth=1 | sort -hr | head -10
# 找出/var目录下大于100MB的目录
du -h /var | awk '$1 ~ /[0-9]+G/ || ($1 ~ /[0-9]+M/ && $1+0 > 100)'
# 查找系统中最大的文件
find / -type f -exec du -h {} + 2>/dev/null | sort -hr | head -20
# 查找大于1GB的文件
find / -type f -size +1G -exec du -h {} + 2>/dev/null
日志文件分析
# 查看日志目录占用情况
du -sh /var/log/*
# 找出最大的日志文件
du -ah /var/log | sort -hr | head -10
# 检查应用日志大小
du -sh /var/log/nginx /var/log/apache2 /var/log/mysql 2>/dev/null
用户目录分析
# 查看各用户主目录大小
sudo du -sh /home/*
# 分析用户磁盘使用情况
for user in $(ls /home/); do
size=$(sudo du -sh /home/$user 2>/dev/null | cut -f1)
echo "用户 $user: $size"
done
# 找出占用空间最多的用户
sudo du -sh /home/* | sort -hr
高级用法和技巧
实时监控脚本
#!/bin/bash
# disk_monitor.sh - 磁盘空间监控脚本
THRESHOLD=85 # 告警阈值85%
EMAIL="admin@example.com"
echo "磁盘空间监控报告 - $(date)"
echo "================================"
# 检查所有分区
df -h | awk 'NR>1 {
gsub(/%/, "", $5)
if($5 > '$THRESHOLD') {
print "警告: " $6 " 分区使用率过高 (" $5 "%)"
print "设备: " $1
print "总空间: " $2 ", 已用: " $3 ", 可用: " $4
print "--------------------------------"
}
}'
# 检查inode使用情况
echo -e "\nInode使用情况:"
df -i | awk 'NR>1 {
gsub(/%/, "", $5)
if($5 > '$THRESHOLD') {
print "警告: " $6 " 分区inode使用率过高 (" $5 "%)"
}
}'
磁盘清理辅助脚本
#!/bin/bash
# disk_cleanup_helper.sh
echo "磁盘清理建议"
echo "============"
echo "1. 大文件TOP 20:"
find / -type f -size +100M -exec du -h {} + 2>/dev/null | sort -hr | head -20
echo -e "\n2. 大目录TOP 10:"
du -h --max-depth=2 / 2>/dev/null | sort -hr | head -10
echo -e "\n3. 可清理的缓存和临时文件:"
echo "临时文件: $(du -sh /tmp 2>/dev/null | cut -f1)"
echo "缓存文件: $(du -sh /var/cache 2>/dev/null | cut -f1)"
echo "日志文件: $(du -sh /var/log 2>/dev/null | cut -f1)"
echo -e "\n4. 系统清理建议:"
echo "- 清理包管理器缓存: apt clean 或 yum clean all"
echo "- 清理日志文件: journalctl --vacuum-time=7d"
echo "- 清理临时文件: rm -rf /tmp/*"
echo "- 清理旧内核: apt autoremove 或 package-cleanup --oldkernels"
目录大小排序分析
# 分析指定目录下的空间使用
analyze_directory() {
local dir=${1:-"."}
echo "分析目录: $dir"
echo "==================="
# 按大小排序显示子目录
du -h --max-depth=1 "$dir" 2>/dev/null | sort -hr
echo -e "\n文件类型分析:"
find "$dir" -type f 2>/dev/null | sed 's/.*\.//' | sort | uniq -c | sort -nr | head -10
echo -e "\n大文件列表:"
find "$dir" -type f -size +10M 2>/dev/null | xargs du -h | sort -hr | head -10
}
# 使用示例
analyze_directory /var
性能优化建议
避免常见错误
# 错误:对整个根目录执行du
# du / (会扫描所有文件,很慢)
# 正确:限制深度或指定目录
du -h --max-depth=2 /
du -sh /var /home /usr
# 错误:在高I/O负载时频繁执行
# 正确:使用缓存或定时执行
提高查询效率
# 使用排除选项提高速度
du --exclude="*.log" --exclude="*.tmp" -sh /var
# 不跨越文件系统边界
du -x -sh /
# 使用并行处理
find /var -maxdepth 1 -type d | xargs -I {} -P 4 du -sh {}
故障排查
磁盘空间突然减少
# 检查是否有大文件正在写入
lsof | grep -E "\.log|\.tmp" | head -20
# 查找最近修改的大文件
find / -type f -mtime -1 -size +100M 2>/dev/null
# 检查隐藏的已删除文件
lsof | grep deleted
磁盘满但找不到大文件
# 检查inode使用情况
df -i
# 查找大量小文件的目录
for dir in /var /tmp /home; do
echo "$dir: $(find $dir -type f 2>/dev/null | wc -l) files"
done
# 检查挂载点问题
mount | grep -v "^/dev"
注意事项
- 权限问题: 某些目录需要root权限才能查看
- 符号链接: du默认不跟随符号链接,使用-L选项跟随
- 挂载点: du可能跨越文件系统边界,使用-x限制
- 性能影响: 对大目录执行du会消耗大量I/O资源
- 实时性: du统计的是实际占用空间,可能与文件大小不同
相关命令
lsof
- 查看打开的文件find
- 查找文件ncdu
- 交互式磁盘使用分析器tree
- 树形显示目录结构ls -la
- 查看文件详细信息
掌握du和df命令是Linux运维的基本技能,结合脚本和监控可以有效管理系统磁盘空间。