磁盘空间查看 - du和df命令详解

title

磁盘空间管理是Linux系统运维的重要任务。dudf命令是查看磁盘使用情况的核心工具,掌握它们的用法对系统维护至关重要。

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"

注意事项

  1. 权限问题: 某些目录需要root权限才能查看
  2. 符号链接: du默认不跟随符号链接,使用-L选项跟随
  3. 挂载点: du可能跨越文件系统边界,使用-x限制
  4. 性能影响: 对大目录执行du会消耗大量I/O资源
  5. 实时性: du统计的是实际占用空间,可能与文件大小不同

相关命令

  • lsof - 查看打开的文件
  • find - 查找文件
  • ncdu - 交互式磁盘使用分析器
  • tree - 树形显示目录结构
  • ls -la - 查看文件详细信息

掌握du和df命令是Linux运维的基本技能,结合脚本和监控可以有效管理系统磁盘空间。


powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:47:16

results matching ""

    No results matching ""