Linux 系統管理中,df(Disk Free)與 du(Disk Usage)是磁碟空間分析的雙核心工具。df 掌握檔案系統整體容量,du 深入檔案與目錄實際佔用。兩者配合使用,能快速定位空間異常根因。本文詳細解析進階用法、常見參數、差異成因與實務排查流程。
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 3.9G 300M 3.4G 8% /
/dev/sda7 100G 188M 95G 1% /data0
/dev/sdb1 133G 80G 47G 64% /data1
df -h:人類可讀單位(K/M/G)df -H:SI 單位(1000 進位)df -T:顯示檔案系統類型(ext4、xfs、vfat、nfs...)df -i:顯示 inode 使用量(關鍵:inode 耗盡導致無法建檔)df -x 檔案系統類型:排除特定類型(如 df -x tmpfs -x devtmpfs)df --output=source,size,used,avail,pcent,target:自訂輸出欄位(適合腳本解析)du -h:人類可讀單位du -s / --summarize:僅顯示總計du -d 深度 / --max-depth=深度:限制遞迴層數(極實用)du -a / --all:包含檔案(預設僅目錄)du -c / --total:顯示總計du -x / --one-file-system:不跨越檔案系統邊界du --exclude=模式:排除特定檔案/目錄du -b / --bytes:以 bytes 為單位# 查看當前目錄下一級子目錄大小(含檔案)
du -h --max-depth=1
# 查看當前目錄下所有檔案與一級子目錄大小
du -h --max-depth=1 *
# 找出 /var/log 下佔用空間最大的 10 個檔案/目錄
du -h /var/log | sort -hr | head -10
# 排除特定目錄(如快照、備份)
du -h --max-depth=1 --exclude='*snapshot*' --exclude='*backup*'
# 僅統計特定檔案類型
find . -name "*.log" -exec du -ch {} + | tail -1
注意:FreeBSD du 指定深度參數為 -d,Linux 為 --max-depth。
| 維度 | du | df |
|---|---|---|
| 統計對象 | 檔案與目錄實際資料區塊 | 檔案系統區塊分配圖 |
| 包含中繼資料 | 否 | 是(inode、superblock、bitmap、journal...) |
| 已刪除但開啟的檔案 | 不計入(目錄項已移除) | 計入(區塊未釋放) |
| 稀疏檔案 | 統計實際佔用區塊 | 統計邏輯大小(視檔案系統) |
| 硬連結 | 重複計算每個連結 | 僅計算一次實體區塊 |
# 現象:df 顯示空間未釋放,du 顯示已釋放
# 定位佔用進程
lsof | grep deleted
# 或
lsof +L1
# 輸出範例:
# java 1234 user 4u REG 253,0 10G 12 /var/log/app.log (deleted)
# 解決:重啟該進程或發送信號觸發日誌輪轉
kill -USR1 1234 # 視應用支援度
df -hT 找出使用率 > 80% 的掛載點df -i 確認 inode 是否耗盡(大量小檔案常見)du -h --max-depth=1 找出大目錄du -h --max-depth=1 大目錄/* 定位到檔案層級df >> du,檢查 lsof | grep deleted、journalctl --disk-usage、snap list --all(snap 佔用)docker system prune -a)、snap 版本# 安裝
yum install ncdu # 或 apt-get install ncdu
# 使用
ncdu /var # 互動式瀏覽、排序、刪除
# 找出系統中大於 100MB 的檔案
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -hr
# 找出 /var/log 下大於 50MB 的日誌檔
find /var/log -type f -name "*.log" -size +50M -ls
# systemd journal 限制大小
echo "SystemMaxUse=500M" >> /etc/systemd/journald.conf
systemctl restart systemd-journald
# 手動清理
journalctl --vacuum-size=500M
journalctl --vacuum-time=30d
docker system df # 查看 Docker 空間佔用
docker system prune -a # 清理未使用的映像、容器、網路、建構快取
docker builder prune -a # 清理建構快取
掌握 df 與 du 的統計視角差異,配合 lsof、find、ncdu 等工具,能將磁碟空間排查效率提升數倍。關鍵心法:宏觀用 df、微觀用 du、異常查 lsof、清理要有策略。建立定期巡檢腳本(含 df -h、df -i、關鍵目錄 du 告警),將空間風險消滅在萌芽狀態。