根分割區滿了通常並不代表一定要停機。在大多數情況下,你都可以在不中斷服務、也不重新開機的前提下,線上擴充伺服器根分割區。

正確的操作步驟取決於你使用的檔案系統。LVM、ext4 與 XFS 的處理指令各不相同,而 XFS 只支援擴充,不支援縮減。

如果是虛擬機器環境,還需要多一步:必須先在虛擬化平台中擴大虛擬磁碟,然後客體系統內部的擴充操作才能辨識並使用這部分新增空間。

當磁碟空間告急時,不要急著「臨場發揮」。請先做完整備份,再仔細檢查目前的磁碟與分割區配置。

擴充根分割區前的準備條件

本文中的每一條指令都需要 root 權限,或具備 sudo 權限的帳號。若沒有相應權限,核心會拒絕分割區或檔案系統擴充操作。你可以先執行 sudo -v 確認權限是否可用。若可以繼續,該指令會靜默返回。建議在檢查任何儲存裝置之前先執行它。

在修改分割區前,務必先做完整備份。線上擴充通常是安全的,但停電或誤操作仍可能造成資料損毀。備份能為你提供明確的還原路徑。請將備份儲存到獨立磁碟或遠端主機上,並在開始操作前確認備份可以正常讀取。

確認 Root 權限並備份資料

執行 sudo -i,在整個操作工作階段中進入 root shell。這樣可以避免擴充過程中途出現權限問題。如果你本來就是 root 使用者,可以略過這一步。但備份仍然不可少。你可以使用 dump、tar,或虛擬化平台的快照功能進行備份。備份內容必須涵蓋完整的根檔案系統。請用日期與伺服器名稱為備份加上標籤,以便在伺服器意外中斷時快速定位並還原。

辨識是否使用 LVM、ext4 或 XFS

執行 df -hT / 查看檔案系統類型。這個指令會在容量輸出中增加 Type 欄。掛載到 / 的那一列會顯示為 ext4 或 xfs。Type 欄會與 Size、Used、Avail、Use% 與 Mounted on 一起顯示。

接著執行 lsblk -f。該指令會顯示從實體磁碟到分割區的完整儲存層級結構,你可以藉此判斷根檔案系統是否位於 LVM 之上。如果是 LVM,請進一步使用 pvs、vgs 與 lvs 檢查卷組資訊。pvs 會列出實體卷及其大小;vgs 會顯示卷組剩餘可用空間;lvs 會給出執行擴充指令時所需的邏輯卷精確路徑。

XFS 只能擴充,不能縮減。如果你的根檔案系統使用 XFS,請在開始前確認確實存在可用空間,然後再次核對 Type 欄以避免誤操作。掌握這一點,才能更安全地擴充根分割區。

在 Linux 伺服器上擴充根分割區前,先評估目前配置

在你安全地擴充 Linux 伺服器根分割區之前,必須先梳理清楚目前的儲存配置。請依序執行以下指令,並記錄每一項輸出結果。

  1. 執行 df -h,確認根檔案系統的目前使用情況。
  2. 執行 lsblk,查看磁碟與分割區樹狀結構。
  3. 執行 fdisk -l 與 parted -l,列出分割區邊界。
  4. 執行 vgs,檢查卷組中是否有可用的剩餘空間。

檢查磁碟與虛擬 Linux 系統分割區

parted -l 的輸出會顯示每個分割區的起始磁區與結束磁區。請留意某個分割區結束位置與下一個分割區開始位置之間是否存在空隙。這個空隙就是尚未配置的可用空間。線上擴充要求這段空閒空間必須緊接在目標分割區之後。

虛擬 Linux 系統分割區還有一個額外限制:在虛擬化平台層面擴大虛擬磁碟,並不會自動擴大客體系統內部的分割區。你必須先在虛擬化平台上完成磁碟擴充,然後在客體系統內再執行 growpart 或 LVM 相關指令。客體系統只能使用虛擬磁碟層面已經存在的新增空間。

檢查卷組剩餘空間

vgs 指令的輸出中會包含一個 VFree 欄。例如,卷組 myvolg 的示例輸出可能顯示 VFree <139.99g。這表示卷組內部可用於擴充邏輯卷的空間大小。

請區分兩種「空閒空間」。卷組內部的空閒空間,是 LVM 可直接用來擴充邏輯卷的容量;而實體磁碟上的未配置空間,則位於任何分割區之外。對於非 LVM 配置,只有第二種空間才有幫助。在選擇擴充方法之前,請務必同時確認這兩類空間,並核實磁碟上的剩餘空間是否與你的擴充方案一致。

透過 LVM 在線擴充伺服器根分割區

LVM 是在線擴充伺服器根分割區最簡潔的方式。你只需擴充邏輯卷,核心就會在系統運行期間辨識新增的區塊裝置。無需重新開機,也不會中斷服務。

使用卷組中的剩餘空間進行擴充

首先使用這條一步到位的指令:lvextend -r -l 100%FREE /dev/mapper/<vg>-<lv>。其中 -r 參數會自動調整檔案系統大小。對於 ext4,LVM 會呼叫 resize2fs;對於 XFS,則會呼叫 xfs_growfs。這條指令會一次性使用卷組中全部空閒 extent。

在執行之前,請先用 lvs 確認邏輯卷路徑。輸出會列出每個邏輯卷、所屬卷組以及大小。典型結果中可能會看到像是 lv_root 為 20.00g、lv_home 為 10.00g,且都屬於卷組 vg_os。然後再用 df -hTP / 交叉確認根目錄所掛載的裝置,例如 /dev/mapper/vg_os-lv_root。請務必將這個準確路徑傳給 lvextend。如果路徑寫錯,可能擴充的是錯誤的邏輯卷,而根分割區本身仍然沒有變化。

步驟 6:使用 lvs 指令檢查需要擴充的邏輯卷名稱。在我的例子中,它是 lv_root。再使用 df -hTP 指令取得 lv_root 邏輯卷的具體路徑。在我的例子中,root 邏輯卷的具體路徑是 /dev/mapper/vg_os-lv_root

這種方法僅適用於卷組中已經存在剩餘空間的情況。請先檢查 vgs 輸出中的 VFree 欄。如果它為零,就需要改用下一種方法。

向卷組中新增一顆磁碟

如果卷組中已經沒有剩餘空間,那就需要掛載一顆新磁碟,並將其加入現有卷組。你需要先在虛擬化平台中附加該磁碟,並重新掃描 SCSI 匯流排,讓客體系統辨識它。然後依下列順序執行:

  1. 將新磁碟初始化為實體卷:pvcreate /dev/sdd
  2. 把它加入現有卷組:vgextend datavg /dev/sdd
  3. 擴充邏輯卷並自動調整檔案系統大小:lvextend -L +50G -r /dev/datavg/datalv

如果要擴充的是根邏輯卷,請用相同方式替換成根卷路徑,例如:lvextend -L +10G -r /dev/rhel/root。你也可以一次性使用所有剩餘空間:lvextend -l 100%FREE /dev/myvg/root。這裡的 -r 參數同樣會在擴充邏輯卷的同時調整檔案系統大小,因此整個操作可以線上完成,無需卸載檔案系統。

執行 lvextend 之前,請先用 pvs 與 vgs 驗證新增實體卷是否已成功加入。此時 VFree 的數值應反映出新增容量。確認無誤後,再執行 lvextend。這樣的順序可以避免在卷組尚未真正接收新磁碟時就執行擴充,從而導致失敗。

只要按步驟操作,透過 LVM 在線擴充根分割區的風險通常很低。確認路徑、確認可用空間,然後讓 -r 自動完成後續檔案系統擴充即可。

在非 LVM 環境下在線擴充系統分割區

如果不是 LVM 配置,可用的「安全緩衝」會少一些。你必須先擴充分割區本身,然後再另外擴充檔案系統。這兩個步驟都可以在系統保持在線的情況下完成。

使用 growpart 或 parted 擴充分割區

growpart 工具是在線擴大分割區最簡潔的方法。它會讀取分割表,尋找目標分割區之後的空閒空間,並在不碰觸既有資料的前提下重寫分割區項目。

它的第一個參數是磁碟裝置,第二個參數是分割區編號。該工具支援線上執行,因此無需卸載檔案系統。如果目標分割區不是 LVM 實體卷,工具可能會輸出類似 /dev/vde1 is not an lvm pv 的提示後退出。這個提示恰好說明該分割區是一個一般檔案系統,這正是本節所討論的情境。

parted 也可以用於擴充分割區。執行 parted /dev/sdX,然後使用 resizepart 指令,指定分割區編號與新的結束磁區。無論你使用哪一種工具,完成後都要執行 partprobe,讓核心重新讀取分割表。

使用 fdisk 刪除後重建分割區項目的方法同樣可行,但風險確實更高。你需要先刪除原分割區項目,再用相同的起始磁區與更大的結束磁區重新建立。繼續之前,請務必了解以下風險:

  • 用 fdisk 操作分割區時,如果執行者對流程不熟悉,尤其是在生產環境中,可能會直接導致虛擬機器客體作業系統無法啟動。
  • 重建根分割區後,bootable 標記可能會遺失,系統啟動時可能報出「could not find a file system」之類的錯誤。

如果你必須使用 fdisk,完成後請再次進入該工具,並使用 a 指令將啟動分割區重新標記為 active。務必先在開發或測試環境中完整演練流程,並提前備份所有關鍵資料。

在線擴充 ext4 與 XFS 檔案系統

僅僅擴大分割區邊界,並不會讓根檔案系統自動獲得新空間。你還必須執行第二步:擴充檔案系統本身。上述所有方法都必須遵循這項原則。

對於 ext2、ext3 或 ext4,請對對應裝置執行 resize2fs:

sudo resize2fs /dev/sda3

同樣的寫法也適用於其他 ext 分割區,例如 resize2fs /dev/sdb1。該工具會在檔案系統維持掛載狀態下,將其擴充至整個分割區大小。

對於 XFS,請使用 xfs_growfs,並指定掛載點或裝置路徑:

xfs_growfs /dev/sdh1

如果要擴充已掛載的根檔案系統,建議直接把指令指向掛載點:

sudo xfs_growfs /

指令輸出會確認資料區塊數量已經變化,這也代表擴充成功。請記住,XFS 只能擴充,無法事後縮減。

在確認裝置路徑正確的前提下,使用這種兩步法在線擴充根分割區是很常見的操作。如果你跳過檔案系統擴充這一步,那麼即使分割區邊界已經變大,根分割區看起來依然會是滿的。

驗證線上擴充結果與系統健康狀態

使用 df、lvs 與 lsblk 確認新容量

先執行 df -h。輸出會顯示根檔案系統的新容量。將 Size 欄與擴充前記錄的數值進行比較。此時 Avail 欄也應反映新增的可用空間。如果這些數值符合你的預期目標,就表示檔案系統擴充已經成功。

接著執行 sudo lvs 檢查邏輯卷。LSize 欄會顯示每個邏輯卷的目前大小。示例輸出可能類似 lv_root vg_os -wi-ao---- 20.00g。擴充完成後,這裡的值應變為你希望擴大的目標大小。再執行 lsblk -o NAME,SIZE,TYPE,MOUNTPOINT 查看完整結構。根邏輯卷會以 lvm 裝置形式出現,並掛載到 /,其大小應與 lvs 的輸出一致。

檢查日誌與掛載狀態

執行 dmesg,檢查是否存在與檔案系統或分割區相關的錯誤訊息。重點留意提到磁碟裝置名稱或擴充操作的日誌。如果出現 I/O 故障或分割表衝突相關錯誤,就必須立即處理。接著執行 journalctl -xe,查看最近的系統事件。該指令可以捕捉 dmesg 可能遺漏的服務層級警告資訊。

確認根檔案系統仍然以可讀寫模式掛載。執行 mount | grep ' / ',檢查輸出中是否包含 rw 標記。如果根目錄被掛載為唯讀,就表示存在需要進一步排查的問題。還應確認擴充過程中沒有服務重新啟動或失敗。執行 systemctl --failed 查看處於失敗狀態的 systemd 單元。若輸出為空,表示各項服務在擴充過程中沒有受到影響;如果出現失敗項,請檢查其日誌,並在需要時重新啟動。

只要根據檔案系統類型選擇正確方法,你就可以安全地在線擴充伺服器根分割區。LVM、ext4 與 XFS 都有清楚可行的路徑,而核心也能在服務持續運行時辨識新增的區塊裝置。

有兩條原則必須始終堅持。第一,先備份根分割區;第二,在動手之前,先用 df、lsblk 與 vgs 檢查配置。每次完成修改後,再用 df -h、lvs 與 lsblk 驗證結果。

最後,建議先在預備或測試環境中完整演練整個流程。一次演練就能暴露路徑錯誤、空間不足等問題。當你已經在測試環境中成功在線擴充過伺服器根分割區後,生產環境中的操作就會從容許多。

常見問題

以下回答涵蓋了在線擴充根分割區時最常見的問題。

擴充根分割區需要重新開機嗎?

不需要。本文中的指令都可以在系統保持在線的情況下執行。LVM 的 lvextend -r 會自動完成檔案系統擴充。非 LVM 配置則需要兩步:先擴大分割區,再擴充檔案系統。整個過程都無需重新開機。

如果根分割區後面沒有可用的空閒空間怎麼辦?

先檢查你的儲存配置。對於 LVM,可以新增一顆實體磁碟並擴充卷組。對於非 LVM,空閒空間必須緊鄰在該分割區之後。如果空閒空間不在它後面,那麼在不移動或刪除其他分割區的前提下,就無法在線擴充這個分割區。

ext4 檔案系統在掛載狀態下可以擴充嗎?

可以。Linux 支援線上擴充。resize2fs 可以在檔案系統維持掛載的情況下完成擴充。操作前請先備份,並透過 df -hTP / 確認裝置路徑無誤後再執行指令。

XFS 的擴充流程有什麼不同?

使用 xfs_growfs /,而不是 resize2fs。XFS 只能擴充,不能縮減。除非你使用的是 LVM,否則分割區後方必須有可用的空閒空間。XFS 支援線上擴充,但無法回退縮小。

如何確認擴充已經成功?

執行 df -h,比較 Size 欄變化;再用 lvs 檢查邏輯卷大小;然後使用 lsblk 確認分割區與裝置層級;查看 dmesg 是否存在錯誤;最後透過 mount | grep ' / ' 確認 / 仍以讀寫模式掛載。