df 與 du:磁碟空間的監控與分析 文章首圖

df 與 du:磁碟空間的監控與分析

df 與 du:磁碟空間的監控與分析

在 Linux 系統管理與開發的日常工作中,磁碟空間不足是最常見的災難之一。當應用程式突然無法寫入資料、日誌檔爆增導致服務中斷,或是備份任務失敗時,第一時間往往需要快速診斷磁碟使用狀況。這時,dfdu 這兩個指令就成了我們手中的利劍。雖然它們都與磁碟空間有關,但側重點截然不同: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

小結

dfdu 是 Linux 系統監控的黃金組合。df 讓我們從宏觀角度掌握檔案系統的健康狀況與掛載狀態,而 du 則提供微觀視角,精準定位空間佔用的來源。掌握這兩者的特性與常見陷阱(如保留空間、已刪除檔案描述符),能幫助我們在面對磁碟空間危機時,快速、準確地進行診斷與處理。建議在日常工作中養成定期執行 df -h 的習慣,並在空間異常時,善用 du 搭配 sort 快速排除問題。