SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 已更新 2026-10-24

如何安全移除 LVM volume group 中的磁碟

先用 pvmove 將資料移出實體卷區,再依序執行 vgreduce 與 pvremove,最後卸除磁碟,避免掛載中的檔案系統因順序錯誤而遺失。

從 LVM volume group 移除磁碟代表什麼

若要從 LVM volume group 移除磁碟,必須先將其中的資料移至其他裝置,再把已清空的裝置移出該群組、清除其上的 LVM 標籤,最後才能從伺服器卸除磁碟。LVM(logical volume manager)會從群組中的每個磁碟取得小區塊來分配儲存空間,因此,您認為是「單一 volume」的檔案系統,可能有部分資料位於即將拔除的磁碟上。LVM 預設不會保留這些資料的第二份副本。先卸除磁碟會導致原本幾分鐘前還能正常運作的檔案系統遺失。

如果檔案系統仍要保留,只移除磁碟,整個作業可以在線上完成。pvmove 會在檔案系統掛載且持續提供網路流量時複製資料。不需要重新開機,也不需要進入救援模式。風險不在技術本身,而在執行順序,以及這裡的每個命令都需要裝置路徑,且不會要求您再次確認。

實體卷區、卷冊群組與邏輯卷區的實際意義

這是同一個堆疊的 3 個層級。磁碟承載哪一個層級,會完全決定是否能「直接卸離」。

  • 實體卷區(PV)。 這是寫入 LVM 標籤的磁碟或分割區。pvcreate 會寫入該標籤。其後的空間會分割成實體範圍,也就是固定大小的區塊,預設為 4 MiB。
  • 卷冊群組(VG)。 這是由 1 個以上 PV 建立的資源池。VG 會統一管理所有實體範圍,不在意個別實體範圍來自哪一顆磁碟。
  • 邏輯卷區(LV)。 這是從資源池分配出的區段。檔案系統會建立在這個區塊裝置上,而它會顯示為 /dev/<vg>/<lv> 或 /dev/mapper/<vg>-<lv>。
  • 各層之間的對應關係才是整個問題的核心。 1 個 LV 的實體範圍可以位於群組中的任何 PV 上。LVM 也會將單一 LV 分散到多顆磁碟,因為資源池的用途就是如此。

因此,第一項工作是確認要移除的磁碟承載哪些內容。共有 4 種情況,所需的處理程度各不相同。

  1. 磁碟具有 LVM 標籤,但從未加入卷冊群組。沒有任何項目指向它。執行 pvremove,然後卸離磁碟。
  2. 磁碟是卷冊群組的成員,但不含任何已配置的實體範圍。執行 vgreduce,接著執行 pvremove,然後卸離磁碟。
  3. 磁碟包含屬於要保留之邏輯卷區的實體範圍。必須先將這些實體範圍移至其他 PV,這就是 pvmove 的用途。
  4. 邏輯卷區會與磁碟一併移除。此時請卸載它,並在執行 lvremove 前刪除其中的 /etc/fstab 行,否則下次開機會停在緊急提示字元。

標準 LVM 不會自行建立鏡像,除非你刻意建立鏡像或 RAID 邏輯卷區。因此,若屬於情況 3 的磁碟已經卸離,這就不是移除程序,而是從備份還原。如果你仍在規劃變更,建議先重新閱讀連接區塊儲存卷區並將其加入卷冊群組。磁碟採用何種方式加入,會決定移除時所需的工作量。

確認裝置對應關係後再輸入指令

先列出機器上的裝置,再要求 LVM 顯示它認定哪些裝置為 physical volume。

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
sudo pvs

接著將路徑一次設定為 shell 變數,之後每個路徑只需輸入一次。在執行其他操作前,先將引號中的文字替換成上方清單中的實際路徑。

VG="the volume group name from pvs"
OLD="the path of the disk that is leaving"
NEW="the path of the replacement disk"

在每個具破壞性的步驟前,先輸出這些變數,並對照 lsblk 清單逐一讀出。相同供應商提供的兩個相同大小 volume,正是最容易導致錯誤的組合。如果不確定某個路徑指向哪個實體裝置,請比對裝置的型號與序號,確認它就是目標裝置,不要相信 kernel 找到裝置的順序。

大多數 LVM 指令都接受全域 dry run 旗標 --test。它會計算變更並回報結果,但不會寫入 metadata。執行實際操作前,先使用此旗標演練每個具破壞性的步驟。請在自己的系統上確認 man pvmove、man vgreduce 與 man pvremove 中的旗標,因為選項清單會隨 lvm2 releases 而變動。

也請備份 group description。sudo vgcfgbackup 會將目前的 layout 寫入 /etc/lvm/backup/,而 vgcfgrestore 可還原損毀的 description。它只能還原 metadata,因此無法復原已遺失磁碟上的資料。

步驟 1:確認此 PV 是否仍包含 extents

這是決定後續所有工作的問題,因此應直接查詢磁碟,而不是依賴幾個月前的操作記憶。

sudo pvs -o pv_name,vg_name,pv_size,pv_free,pv_used
sudo pvdisplay "$OLD"

從輸出中確認兩件事。首先,$OLD 中的路徑是否顯示 volume group 名稱?群組欄位為空,表示此裝置是尚未被任何群組使用的 PV,也就是情況 1。其次,確認使用量。可用空間等於總容量,表示此裝置尚未配置任何資料,因此可直接跳到步驟 4。只要已有配置,就表示 logical volumes 在此處包含 extents,必須將其移出。pvdisplay 會以 PE(physical extents)計算並顯示相同資訊,包括已配置數量與可用數量。

接著確認涉及哪些 logical volumes,以及群組的其餘空間是否能容納其資料。

sudo lvs -a -o lv_name,vg_name,lv_size,seg_pe_ranges
sudo vgs -o vg_name,pv_count,vg_size,vg_free

在 lvs 的輸出中,segment 範圍會列出每個 LV 的各個部分位於哪個 PV,因此請尋找 $OLD 中的路徑,並記下旁邊的每個 LV 名稱。這些 volume 在保持掛載的狀態下,底層資料會被重新寫入。在 vgs 的輸出中,比較群組的可用空間與 $OLD 上的已配置容量。若群組中的其餘磁碟已有足夠空間,便不需要替代裝置,可直接前往步驟 3。若空間不足,請在步驟 2 處理。

在開始上述工作前,還應進行一項檢查:如果變更原因是 filesystem 已滿,請確認空間確實正在使用。df 與 du 對 filesystem 已滿的結果不一致 通常表示已刪除的檔案仍由執行中的程序保持開啟;搬移儲存空間無法解決這個問題。

步驟 2:將磁碟群組延伸至替換裝置

在供應商端附加替換磁碟區,確認它對應的路徑,然後為其寫入標籤並加入磁碟群組。

sudo apt install lvm2   # Ubuntu and Debian ship the tools in this package
sudo pvcreate "$NEW"
sudo vgextend "$VG" "$NEW"
sudo vgs -o vg_name,pv_count,vg_size,vg_free

pvcreate 只會寫入 LVM 標籤,不會執行其他操作。vgextend 會將該裝置的實體區段加入集區。這兩個指令都不會修改現有邏輯磁碟區中的資料,因為只有在明確要求配置時,配置才會變更。

LVM 接受整個原始裝置,因此 pvcreate /dev/sdb 可以正常運作。將單一分割區配置跨越整個磁碟只需多一個步驟,並會留下其他工具能識別的簽章,因此下一位執行 lsblk 的人可以看出其用途,而不是看到沒有標籤的磁碟。對於可能擴充至超過 2 TiB 的磁碟,請使用 GPT 分割區表,而不要使用 MBR。替換裝置也應保留足夠的容量餘裕,因為 工具顯示的大小與供應商標示的大小並不相同,而且 LVM 中繼資料也會佔用少量容量。紙面容量與原裝置完全相同的替換裝置,實際上可能包含較少的實體區段。

該區塊中的最後一個指令會確認第 3 步能否進行:磁碟群組目前是否擁有多於 $OLD 已配置數量的可用實體區段?在符合條件之前,pvmove 沒有位置可寫入資料,因此會拒絕執行該工作。

第 3 步:使用 pvmove 搬移實體區段,支援線上操作與恢復

sudo pvmove --test "$OLD"
sudo pvmove -i 30 "$OLD"

以下說明其運作機制,因為這能解釋為何掛載中的檔案系統仍可安全執行。對於每個必須搬移的區段,pvmove 會在邏輯卷內建立暫存鏡像,將實體區段複製到新的位置,等待兩側同步後,再移除舊側並改寫群組中繼資料。這些操作都在檔案系統下方的 device mapper 層進行,因此檔案系統不會遇到空缺,應用程式也能持續讀寫。-i 30 旗標會每 30 秒顯示一次進度。若要自行指定目的地,而不是讓 LVM 自動選擇,請指定該位置:sudo pvmove "$OLD" "$NEW"。

  • 這項操作速度較慢,因為它會以較慢裝置的速度複製每個已配置的實體區段。對網路連接的卷而言,速度取決於網路速度。請在 tmux 或 screen 中執行,避免 SSH 連線中斷時一併終止程序。
  • 這項操作會與工作負載競用磁碟 I/O。請在伺服器負載較低時開始,或使用 sudo pvmove -n <lvname> "$OLD" 一次搬移一個卷,將負載分散到多個時段。
  • 這項操作支援恢復。如果機器重新開機,或程序在中途終止,請不帶參數執行 sudo pvmove,以繼續尚未完成的搬移。sudo pvmove --abort 則會取消操作,並讓每個邏輯卷繼續指向一份一致的資料副本。
  • 某些配置無法搬移。目前的 lvm2 不允許搬移用作 writecache 的裝置、啟用 integrity 的 RAID 邏輯卷(包括位於 cache 下方的 RAID 邏輯卷),以及正在進行轉換或合併的卷。Cache 和 thin pool 配置不在此限制之列,lvm2 自己的測試套件也會搬移這些配置。如果 pvmove 拒絕執行,請閱讀它顯示的錯誤,因為 man pvmove 不會列出這些情況。加入 --force 並不能讓不受支援的配置變成受支援。

完成後,請再次回答第 1 步提出的問題,這次特別檢查 $OLD。該裝置上是否仍有任何已配置的實體區段?若還有已配置的實體區段,表示搬移尚未完成,而不是悄悄失敗;不帶參數執行 sudo pvmove 即可繼續搬移。

第 4 步:使用 vgreduce 將裝置移出群組

sudo vgreduce --test "$VG" "$OLD"
sudo vgreduce "$VG" "$OLD"

vgreduce 會將裝置從群組的成員清單移除,並把磁碟區群組中繼資料重新寫入仍保留的 PV。若裝置仍有已配置的 extent,該命令會拒絕執行,因為繼續操作會截斷使用中邏輯磁碟區的部分內容。請將此拒絕視為安全檢查正常運作,然後返回第 3 步。

此時不要使用 vgreduce --removemissing。該旗標適用於磁碟已經消失的群組;搭配 --force 使用時,會刪除遺失裝置上具有 extent 的所有邏輯磁碟區。這是用來處理事故既已發生情況的修復工具。

步驟 5:使用 pvremove 移除標籤,然後分離磁碟

sudo pvremove "$OLD"
sudo wipefs -a "$OLD"
sudo lvmdevices --deldev "$OLD"   # only on systems using /etc/lvm/devices/system.devices

pvremove 會清除 LVM 標籤,使裝置不再是 physical volume。只要裝置仍屬於 volume group,該命令就會拒絕執行,因此必須先完成步驟 4。wipefs -a 會清除殘留的簽章,包括任何 partition table,避免磁碟向下一個掃描它的工具呈現不完整的識別資訊。對於使用 devices file 而非 filter 的 lvm2 版本,也要從該檔案中移除這個路徑,否則檔案仍會列出已不存在的裝置。

現在,請在供應商端分離此 volume,然後使用 lsblk 和 sudo pvs 確認該路徑已消失,且該 group 僅列出剩餘成員。由於你已先從中繼資料移除裝置,再將其從機器中移除,該 group 會在下次開機時完整啟用,不會產生任何警告。若先分離磁碟,結果會相反:group 只能部分啟用,每次執行 LVM 命令都會出現警告,而任何 extents 位於遺失磁碟上的 logical volume 都會無法使用,直到你修復該 group。

若要移除邏輯卷,先處理 fstab

有時磁碟即將移除,是因為儲存在其中的內容已不再使用。這時需要移除邏輯卷,操作順序比本指南其他部分更重要。先卸載,刪除 /etc/fstab 行,然後才執行 lvremove。

sudo umount /path/to/mountpoint
sudo swapoff "/dev/$VG/<lvname>"   # only if this LV was swap
sudo nano /etc/fstab               # delete the line naming this LV
sudo systemctl daemon-reload
sudo lvremove "$VG/<lvname>"

這個順序之所以重要,是因為 systemd 會在開機時將每一行 /etc/fstab 轉換為掛載單元。如果該行仍在檔案中就移除邏輯卷,該單元會等待永遠不會出現的裝置,導致 local-fs.target 失敗,並在開機時停在要求於主控台輸入 root 密碼的緊急提示畫面。對租用的伺服器而言,這表示必須先找到供應商提供的主控台,機器才有可能連線。編輯 fstab 後執行 systemctl daemon-reload,可立即讓 systemd 忘記產生的單元,避免在刪除邏輯卷前的幾秒內有程序嘗試重新掛載該卷。

如果 umount 回報檔案系統正在使用中,請使用 sudo fuser -vm /path/to/mountpoint 或 sudo lsof +f -- /path/to/mountpoint 找出持有該檔案系統的程序,並正常停止該程序。避免使用 umount -l。延遲卸載會在檔案仍保持開啟並持續運作時,先將掛載從命名空間分離。這表示您可能會 lvremove 仍有程序正在寫入的儲存空間。也請檢查較不明顯的路徑使用者:/etc/exports 中的 NFS 匯出、cron 中的備份與 rsync 工作,以及容器儲存。因為compose 檔案中的繫結掛載會指向主機路徑,邏輯卷移除後,該掛載會悄悄開始填滿 root 檔案系統。

群組沒有空間可放置資料時

如果無法連接替代裝置,而其他 PV 也沒有剩餘空間,磁碟必須先縮減資料,才能移除。這首先是檔案系統的工作,其次才是 LVM 的工作;是否可行,取決於檔案系統本身。

  • ext4 可以縮減,但只能在未掛載時進行。卸載磁碟區,對其執行 sudo e2fsck -f,接著執行 sudo resize2fs <lv> <new size>,再執行 sudo lvreduce -L <new size> "$VG/<lvname>"。sudo lvreduce --resizefs -L <new size> "$VG/<lvname>" 會執行這兩個步驟,底層規則相同。從 lvm2 2.03.17 起,它會直接呼叫 resize2fs,不再經由 fsadm;後者現在是已淘汰的 --fs resize_fsadm 選項。
  • XFS 只能在最後一個 allocation group 內縮減。xfs_growfs -D 可以從該群組的末端裁剪未使用空間,但無法移除整個群組,也無法將檔案系統縮減至只剩一個群組。若需要進一步縮減,必須先備份,再建立較小的 logical volume,最後將資料還原至其中。

請特別注意一項規則:logical volume 絕不能小於其中承載的檔案系統。先縮減檔案系統,再縮減 volume,並讓 volume 稍微大於檔案系統所需的大小。lvreduce 會要求確認,因為順序錯誤會截斷檔案系統末端;之後即使將 volume 長大,也無法復原。volume 縮小後,釋出的 extents 會回到群組,步驟 3 才有空間可將資料移入。

操作順序一覽

  1. 使用 pvs、pvdisplay 與 lvs -a -o lv_name,seg_pe_ranges 確認 PV 儲存的內容。
  2. 為群組提供空間:使用 vgextend 將裝置加入群組,或在其他位置釋放 extents。
  3. 線上將 extents 從即將移除的裝置移出,確保可恢復,並使用 --test 事先演練 pvmove。
  4. 使用 vgreduce 將裝置從群組移除。
  5. 使用 pvremove 清除標籤,並使用 wipefs 擦除剩餘內容。
  6. 在供應商端卸除裝置,然後使用 lsblk 與 pvs 確認。

若連 logical volume 也要移除,前 4 行則改為:卸載、編輯 /etc/fstab、systemctl daemon-reload、lvremove。

FAQ

如果不需要區塊磁碟區上的內容,可以直接將其卸離嗎?

只有在沒有其他項目需要它時才可以,而且必須先確認,不可直接假設。使用 pvs -o pv_name,pv_used,pv_free 和 pvdisplay 檢查該實體磁碟區是否仍有已配置的 extent,再使用 lvs -a -o lv_name,seg_pe_ranges 確認這些 extent 所屬的邏輯磁碟區。如果其他邏輯磁碟區仍有部分資料位於該磁碟上,卸離磁碟會使該磁碟區損壞,因為一般 LVM 不會在其他位置保留 extent 的第二份副本。使用 pvmove 移動 extent,使用 vgreduce 將裝置從群組移除,再使用 pvremove 清除標籤,之後即可順利卸離。

pvmove 可以在檔案系統掛載時執行嗎?如果中斷又該怎麼辦?

可以,這正是它的用途。pvmove 會在檔案系統下方建立暫時鏡像、複製 extent,接著在 device mapper 中將邏輯磁碟區切換到新的位置,因此應用程式全程都能讀寫。如果重新開機或工作階段中斷,請不帶參數執行 sudo pvmove,以繼續未完成的移動;或執行 sudo pvmove --abort 停止操作,並讓每個磁碟區都保留在一致的副本上。請在 tmux 或 screen 中啟動這項操作,因為它會複製每個已配置的 extent,所需時間取決於磁碟的速度與容量。

為什麼移除邏輯磁碟區後,伺服器就停止開機?

因為檔案中仍保留該磁碟區的 /etc/fstab 行。systemd 會為每個 fstab 項目產生掛載單元,而該單元會等待已不存在的裝置;local-fs.target 失敗後,開機流程便會在主控台停留於 emergency prompt。復原時,請進入供應商的主控台或救援映像,刪除過時的行,然後重新開機。避免此問題的方法是先卸載、刪除 fstab 行、執行 systemctl daemon-reload,最後才執行 lvremove。在非 root 資料掛載的 fstab 行加入 nofail,可讓下次發生相同錯誤時仍能完成開機。

為什麼 vgreduce 拒絕從我的磁碟區群組移除磁碟?

通常是因為該實體磁碟區仍有已配置的 extent,移除它會切斷使用中的邏輯磁碟區。請針對該裝置使用 pvs -o pv_name,pv_used,pv_free 和 pvdisplay 檢查,完成或繼續 pvmove 後再試一次。另一個常見原因是路徑輸入錯誤,指定了屬於其他群組的裝置。因此,將路徑設為 shell 變數,並在每個步驟前讀回確認,值得花費這兩秒。

#lvm#storage#block-storage#linux#disks