系統管理員常遇到這種情況:df -h 顯示分區已滿,但 du -sh * 加總子目錄大小卻遠小於已用空間,甚至相差數 GB。這通常不是檔案系統損壞,而是以下三種「隱形佔用」導致。
Linux 以「.」開頭的檔案視為隱藏檔,du -sh * 預設不會掃描它們。若根目錄下有巨大的隱藏檔(如 .cache、.local),便會造成落差。
# 正確統計含隱藏檔的大小
du -sh .[^.]* *
若將新分區掛載到「非空目錄」(如 /mnt 原有檔案),原目錄內容會被掛蓋而不可見,但磁碟空間仍被佔用。umount 後檔案即會重現。
# 檢查掛載點是否覆蓋資料
ls -la /mnt # 掛載前先備份或清空目錄
mount /dev/sda6 /mnt
當程式持續寫入日誌檔,中間有人用 > log 清空內容,檔案大小(ls -l)不變,但實際佔用的區塊(du -h)驟減,產生「空洞」。此時 df 回報的是區塊佔用,而 du 回報的是邏輯大小,造成誤差。
# 找出稀疏檔案
find / -type f -printf "%S %p\n" | awk '$1 < 0.5'
du -sh /mnt/* 確認掛載點下是否有資料被遮蔽。lsof | grep deleted 找出已刪除但仍被進程持有開啟的檔案(釋放需重啟進程)。/var/log、/tmp、使用者家目錄下的隱藏資料夾。掌握這三大原因,下次磁碟告警響起時,即可迅速定位「消失的空間」並精準清理。