如何安全地清理 Linux 伺服器磁碟空間 文章首圖

如何安全地清理 Linux 伺服器磁碟空間

如何安全地清理 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

通常,日誌檔案(如 syslogkern.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)。

解決方法:

  1. 找出開啟該檔案的進程:
    sudo lsof | grep deleted
  2. 找到對應的 PID,並重啟該服務,或直接殺死該進程:
    sudo kill -9 <PID>

    重啟服務後,空間通常會立即釋放。

Q2: 如何避免未來再次發生磁碟爆滿?

自動化是關鍵。你可以配置 logrotate 來自動輪替日誌檔案,並設定 apt 自動清理快取。此外,建議設定監控警報(如 Prometheus + Node Exporter 或簡單的 cron 腳本),當磁碟使用率超過 80% 時發送通知,讓你在問題惡化前介入。

小結

清理 Linux 伺服器磁碟空間並非單純的「刪除檔案」,而是一個診斷與維護的過程。透過 df 監控、du 定位、以及針對性地使用 journalctlapt clean 等工具,你可以安全有效地釋放空間。記住,預防勝於治療,建立定期的清理機制與監控警報,才能確保伺服器的長期穩定運行。