核心區別
| 維度 | df (disk free) | du (disk usage) |
| 統計視角 | 文件系統級(基於超級塊) | 文件/目錄級(遍歷 inode) |
| 計算依據 | 總空間 - 未分配空間 = 已用空間 | 累加文件實際佔用的磁盤塊 |
| 元數據開銷 | 包含 inode 表、日誌、保留塊等 | 不包含 inode、inode map、磁盤圖等元數據 |
| 隱藏文件 | 統計所有分配塊 | 掛載點下被遮蓋的文件不統計 |
| 已刪除但未釋放文件 | 計入已用空間 | 目錄項已無,不統計 |
| 可靠性 | 反映真實物理佔用,最權威 | 反映用戶可見數據佔用,便於定位大文件 |
df 常用參數
df -h # 人類可讀單位 (K/M/G)
df -hi # 顯示 inode 使用情況
df -T # 顯示文件系統類型 (ext4, xfs, nfs...)
輸出示例
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 12G 7.2G 63% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sdb1 500G 320G 180G 64% /data
du 常用參數
du -h # 人類可讀
du -s # 只顯示總計
du -a # 顯示文件與目錄
du -x # 不跨越文件系統邊界
du -c # 顯示總計
du --max-depth=N # 限制遞歸深度
定位大目錄技巧
du -h --max-depth=1 / | sort -hr
# 顯示根目錄下一級子目錄大小,按人類可讀單位倒序排列
為什麼 df 和 du 結果不一致?
- 進程持有已刪除文件:
lsof | grep deleted 找出佔用空間的進程,重啟進程釋放。
- 掛載點遮蓋:
/var 下掛載了新分區,原 /var 數據被隱藏,du 不統計,df 統計。
- 文件系統保留空間:ext4 默認保留 5% 給 root,
df 顯示已用含保留,du 不含。
- 稀疏文件:邏輯大小 > 物理塊,
du 統計物理塊,ls -lh 顯示邏輯大小。
inode 耗盡排查
df -hi | awk '$6 ~ /%$/ && $5+0 > 90'
# 找出 inode 使用率超過 90% 的分區
find / -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head
# 定位 inode 消耗大戶目錄
最佳實踐建議
- 磁盤告警以
df 為準(反映物理真實)。
- 清理空間用
du 定位大文件/目錄。
- 定期
lsof +L1 檢查已刪除未釋放文件。
- 格式化分區時根據文件數量預估調整 inode 比例(
mkfs.ext4 -i)。