df 與 du:磁碟空間的監控與分析
在 Linux 系統管理與開發的日常工作中,磁碟空間不足是最常見的災難之一。當應用程式突然無法寫入資料、日誌檔爆增導致服務中斷,或是備份任務失敗時,第一時間往往需要快速診斷磁碟使用狀況。這時,df 與 du 這兩個指令就成了我們手中的利劍。雖然它們都與磁碟空間有關,但側重點截然不同:df 關注的是「檔案系統層級」的整體狀態,而 du 則深入「目錄層級」的檔案佔用細節。本文將深入解析這兩者的用法、差異與實際應用場景。
df:檢視檔案系統整體健康狀態
df (disk free) 指令的主要功能是報告檔案系統的磁碟空間使用情況。它讓我們能快速了解分區(Partition)或磁碟分割的總容量、已用空間、可用空間以及掛載點。
基本用法與單位優化
預設情況下,df 顯示的單位通常是 1K 區塊,對於現代大容量的硬碟來說,數字過於龐大且不易閱讀。因此,強烈建議搭配 -h (human-readable) 選項,讓輸出結果以 KB、MB、GB 等易讀單位呈現。
df -h
輸出範例:
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 795M 1.1M 794M 1% /run
/dev/sda1 100G 25G 71G 26% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
從上述輸出中,我們特別需要關注 Use%(使用率)欄位。當某個分區的使用率超過 80% 或 90% 時,系統效能可能會下降,甚至導致服務崩潰。
僅查看特定檔案系統
如果伺服器掛載了多個網路磁碟(如 NFS 或 CIFS),我們可能只想查看特定類型的檔案系統。使用 -T 選項可以顯示檔案系統類型,搭配 grep 即可過濾。
df -Th | grep -E 'ext4|xfs|nfs'
追蹤刪除後未釋放空間的陷阱
這是一個經典的 Linux 問題:為什麼 df 顯示磁碟已滿,但 du 顯示檔案佔用空間卻遠小於已用空間?這通常是因為檔案被刪除後,仍有程式(如資料庫或日誌服務)持有該檔案的檔案描述符(File Descriptor),導致空間無法釋放。
使用 df 配合 grep 查看掛載點,並結合 lsof 指令來檢查:
# 找出使用率高於 80% 的分區
df -h | awk '{print $5, $6}' | grep -E '[0-9]+%' | sort -rn | head
# 假設發現 /var/log 使用率高,檢查是否有已刪除但未關閉的檔案
sudo lsof +L1 | grep /var/log
du:深入目錄層級的空間分析
當 df 告訴我們某個分區(例如 /)快滿時,du (disk usage) 就是我們的下一站。du 會遞迴計算指定目錄及其子目錄中所有檔案的大小總和,幫助我們找出「誰」佔用了磁碟空間。
基礎掃描與排序
最實用的技巧是結合 --max-depth 限制搜尋深度,並使用 sort 將結果由大到小排序,快速定位佔用空間最大的目錄。
# 進入根目錄,查看各頂級目錄的使用情況,限制深度為 1
sudo du -h --max-depth=1 / | sort -rh | head -n 10
輸出範例:
45G /var
12G /usr
5.2G /home
...
這裡的 -h 讓人類易讀,--max-depth=1 避免一次性掃描整個檔案系統導致輸出過長,sort -rh 則是以人類可讀的大小進行反向排序(由大到小)。
處理符號連結與特殊檔案
預設情況下,du 會追蹤符號連結(Symlink)指向的實際檔案內容,這有時會導致重複計算。若只想計算目錄本身的佔用,可使用 -s (summary) 選項。此外,對於硬連結(Hard Link),du 會根據 inode 計算,確保不會重複計算同一個實體區塊。
# 僅顯示指定目錄的總和,不顯示子目錄細節
du -sh /var/log
常見問題與注意事項
1. 為什麼 df 和 du 顯示的空間不一致?
這是一個新手常遇到的困惑。主要原因有二:
- 系統保留空間:Linux 檔案系統(如 ext4)預設會保留 5% 的空間給 root 使用者,以防止普通使用者填滿磁碟導致系統無法運作。
df顯示的是「可用空間」,減去了這部分;而du計算的是「實際檔案佔用空間」,不包含這部分保留區。 - 已刪除但未關閉的檔案:如前所述,若檔案被刪除但仍有程式持有該檔案描述符,
du不會計算該檔案(因為路徑已不存在),但df仍會認為空間被佔用。
2. 掃描大量檔案時效能低落怎麼辦?
當使用 du 掃描包含數百萬個小檔案的目錄(如 /var/cache 或原始碼目錄)時,指令可能會卡住很久。建議使用 --exclude 選項排除不需要的目錄,或改用 ncdu(NCurses Disk Usage)工具,它提供互動式介面,能即時顯示進度且效能更佳。
# 安裝 ncdu (Ubuntu/Debian)
sudo apt install ncdu
# 互動式掃描
ncdu /var
小結
df 與 du 是 Linux 系統監控的黃金組合。df 讓我們從宏觀角度掌握檔案系統的健康狀況與掛載狀態,而 du 則提供微觀視角,精準定位空間佔用的來源。掌握這兩者的特性與常見陷阱(如保留空間、已刪除檔案描述符),能幫助我們在面對磁碟空間危機時,快速、準確地進行診斷與處理。建議在日常工作中養成定期執行 df -h 的習慣,並在空間異常時,善用 du 搭配 sort 快速排除問題。