如何安全地清理 Linux 伺服器磁碟空間
在 Linux 伺服器運維的日常工作中,磁碟空間不足是最常見的突發狀況之一。當 df -h 顯示根目錄使用率接近 100% 時,服務可能會因為無法寫入日誌或暫存檔而崩潰。對於中階使用者而言,盲目執行 rm -rf /* 或刪除整個 /var 目錄是絕對禁忌。本文將引導你透過系統化的方法,找出佔用空間的元凶,並安全地釋放磁碟空間。
第一步:確認磁碟使用狀況
在採取任何行動之前,我們必須先建立全景圖。請使用以下指令查看各個分區的空間使用情況:
df -h
輸出結果中,請特別注意 Use% 欄位。如果發現 /(根目錄)或 /var 的使用率高於 85%,就需要立即介入。此外,建議檢查 inode 使用率,有時磁碟空間雖有剩餘,但 inode 耗盡也會導致無法建立新檔案:
df -i
第二步:找出大檔案與目錄
確認空間不足後,下一步是定位佔用空間的實體。我們可以使用 du 指令來掃描目錄結構。
若要查看當前目錄下,每個子目錄佔用的空間大小(由大到小排序),請執行:
sudo du -sh /var/* | sort -hr
這裡的參數意義如下:
-s:顯示總計大小,不列出每個檔案。-h:以人類可讀的格式(如 GB、MB)顯示。sort -hr:以人類可讀的方式進行反向排序(從大到小)。
假設發現 /var/log 佔用空間異常巨大,我們可以進一步深入該目錄:
sudo du -sh /var/log/* | sort -hr
通常,日誌檔案(如 syslog、kern.log 或應用程式日誌)是磁碟空間的主要消耗者。
第三步:安全清理策略
根據第二步的發現,我們採取不同的清理策略。請務必注意:永遠不要直接刪除正在被寫入的日誌檔案,這會導致服務無法記錄日誌甚至崩潰。
1. 清理日誌檔案
對於 systemd 管理的系統,最安全的方式是使用 journalctl 來限制日誌保留時間或大小。
查看目前日誌佔用空間:
journalctl --disk-usage
設定日誌最大保留空間為 100MB:
sudo journalctl --vacuum-size=100M
或者,僅保留最近 3 天的日誌:
sudo journalctl --vacuum-time=3d
若是傳統 syslog 系統(如 rsyslog),可以使用 logrotate 管理,或直接清空空閒的日誌檔(注意使用 > 而非 rm):
# 僅適用於確認該日誌檔已輪替或服務可接受短暫斷檔
sudo > /var/log/syslog
2. 清理套件快取
Ubuntu 和 Debian 系統會下載套件安裝檔並儲存在 /var/cache/apt/。清理這些快取通常能釋放數百 MB 到數 GB 的空間。
# 清理已下載但未安裝的套件快取
sudo apt clean
# 移除不再需要的相依性套件
sudo apt autoremove
3. 檢查核心日誌與暫存檔案
偶爾,/tmp 目錄下會殘留大量臨時檔案。你可以手動清理,但需確認沒有程式正在使用這些檔案:
# 謹慎執行,確保沒有重要資料
sudo find /tmp -type f -atime +7 -delete
這會刪除超過 7 天未被存取的文件。
常見問題
Q1: 刪除檔案後,df -h 顯示的空間沒有釋放?
這是一個經典的 Linux 陷阱。如果一個檔案正在被某個進程(Process)開啟,即使你使用 rm 刪除了該檔案,磁碟空間也不會立即釋放,因為進程仍持有該檔案的檔案描述符(File Descriptor)。
解決方法:
- 找出開啟該檔案的進程:
sudo lsof | grep deleted - 找到對應的 PID,並重啟該服務,或直接殺死該進程:
sudo kill -9 <PID>重啟服務後,空間通常會立即釋放。
Q2: 如何避免未來再次發生磁碟爆滿?
自動化是關鍵。你可以配置 logrotate 來自動輪替日誌檔案,並設定 apt 自動清理快取。此外,建議設定監控警報(如 Prometheus + Node Exporter 或簡單的 cron 腳本),當磁碟使用率超過 80% 時發送通知,讓你在問題惡化前介入。
小結
清理 Linux 伺服器磁碟空間並非單純的「刪除檔案」,而是一個診斷與維護的過程。透過 df 監控、du 定位、以及針對性地使用 journalctl、apt clean 等工具,你可以安全有效地釋放空間。記住,預防勝於治療,建立定期的清理機制與監控警報,才能確保伺服器的長期穩定運行。