使用df和高效定位服务器磁盘占用情况

📊 一、命令基础:核心功能与定位

  1. df(Disk Free)

    • 功能 :显示文件系统级别的磁盘空间使用情况,包括总容量、已用空间、可用空间、使用率百分比及挂载点。
    • 适用场景 :快速检查磁盘分区是否空间不足,例如监控根分区(/)或数据盘(/data)的剩余空间。
  2. du(Disk Usage)

    • 功能 :统计目录或文件级别的磁盘占用空间,支持递归计算子目录。
    • 适用场景 :定位大文件/大目录(如日志目录/var/log),分析存储消耗来源。

🛠️ 二、命令详解:选项与示例

1. df命令常用选项及示例
选项 作用 示例命令 输出说明
-h 人类可读格式(KB/MB/GB) df -h 显示易读的磁盘使用情况
-T 显示文件系统类型(如ext4、xfs) df -T /home 输出包含文件系统类型的分区信息
-i 显示inode使用情况 df -i 检查inode是否耗尽(小文件过多时常见)
--total 显示所有文件系统的总计 df -h --total 末尾汇总所有分区的空间使用

典型输出

bash 复制代码
$ df -hT
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sda1      ext4   20G   15G  4.0G  79% /
/dev/sdb1      xfs   100G   60G   40G  60% /data

2. du命令常用选项及示例
选项 作用 示例命令 输出说明
-h 人类可读格式 du -h ~/Documents 显示目录下各文件/子目录大小
-s 仅显示汇总值(不展开子目录) du -sh /var/log 输出目录总大小(如1.2G /var/log
--max-depth=N 限制递归深度 du -h --max-depth=1 /usr 仅显示/usr下一级子目录大小
-a 包括文件在内的所有项 `du -ah /tmp sort -rh`
-c 显示总计 du -ch *.log 计算所有.log文件总大小

典型场景

bash 复制代码
# 查找当前目录下占用最大的前5个目录
$ du -h --max-depth=1 | sort -rh | head -n 5
12G    ./database
8.4G   ./logs
3.2G   ./backups
1.1G   ./downloads
24G    .  # 当前目录总计

⚖️ 三、核心区别:df vs du

维度 df du 原因说明
作用范围 文件系统整体(分区/挂载点) 具体目录或文件 df读取文件系统元数据;du遍历文件
输出内容 总容量、可用空间、使用率百分比 目录/文件的实际占用空间 df关注剩余空间;du关注已用空间
性能影响 低(直接读取内核缓存) 高(需递归遍历文件树) 大目录下du可能消耗较多I/O资源
不一致场景 显示100%已用,但du统计值更少 统计值小于df的已用空间 文件被删除但未释放(进程仍占用句柄)

💡 关键差异示例

rm删除一个大文件后,du统计值立即减少,但df显示空间未释放------因文件被进程占用(可通过lsof | grep deleted定位进程并重启释放)。


🔍 四、典型应用场景

1. 磁盘空间不足排查
  • 步骤1 :用df -h定位满盘的分区(如/分区使用率95%)。
  • 步骤2 :用du -sh /* --max-depth=1检查根目录下各子目录大小,找到最大占用(如/var)。
  • 步骤3 :逐层深入分析:du -h --max-depth=1 /vardu -h /var/log | sort -rh
2. Inode耗尽问题
  • 现象:创建文件失败,但df -h显示空间充足。
  • 解决:df -i检查inode使用率,若100%则清理小文件(如临时文件、缓存)。
3. 自动化监控脚本
bash 复制代码
# 磁盘空间超过90%时邮件告警
THRESHOLD=90
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
    echo "警告:根分区使用率 ${USAGE}%" | mail -s "磁盘告警" admin@example.com
fi

🧩 五、命令组合技巧

  1. 快速定位大文件

    bash 复制代码
    du -ah / | sort -rh | head -n 20  # 全盘查找最大的20个文件
  2. 排除特定目录

    bash 复制代码
    du -h --exclude="*.cache" --max-depth=2  # 忽略.cache目录
  3. 跨文件系统统计

    bash 复制代码
    du -x /  # 跳过其他文件系统(如NFS挂载点)

💎 总结

  • df :监控分区整体空间,用于预防磁盘耗尽。

  • du :分析具体存储消耗来源,用于清理大文件/目录。

  • 黄金组合

    bash 复制代码
    df -h → 定位问题分区 → du --max-depth逐层排查 → 清理目标

⚠️ 操作注意 :生产环境慎用rm -rf,建议先truncate -s 0 大文件清空内容,再逐步删除。对关键目录操作前备份(如tar -czvf backup.tar.gz /path)。