跳到主要內容
節省工具箱Jason Tools
技術文章

Proxmox VE ZFS Root 鏡像換碟與補碟步驟

Jason Cheng 發布 瀏覽 2 次
Proxmox VE ZFS Root 鏡像換碟與補碟步驟
本文目錄
  1. 執行前務必確認
  2. 確認磁碟
  3. 換碟步驟
  4. 實際範例
  5. PVE 8.x 與 9.x 的差異
  6. 結論
  7. 參考資料

Proxmox VE 安裝時選了 ZFS RAID1,開機碟就是鏡像的 rpool。但不管是硬碟故障要更換,還是當初只裝了一顆、現在要補上第二顆做鏡像,步驟都比一般的資料碟多:除了 ZFS 本身,開機分割與開機載入程式也要一起處理,不然換完之後新碟是不能開機的。

這篇整理 PVE 8.x、9.x 的 ZFS root 鏡像換碟與補碟步驟,以及幾個容易出錯的地方。

ZFS root 鏡像換碟的三個重點
ZFS root 鏡像換碟的三個重點

執行前務必確認

  1. sgdisk -R 的方向是「目的在前、來源在後」:sgdisk -R <新碟> <舊碟>。方向寫反的話,會把空白新碟的分割表蓋到舊碟上,造成資料毀損,這是整個流程風險最高的一步
  2. 一律使用 /dev/disk/by-id/ 路徑:不要用 /dev/sdX,重新開機後代號可能變動,容易操作到錯誤的磁碟
  3. 先確認開機模式:執行 proxmox-boot-tool status,確認系統是用 proxmox-boot-tool 管理開機分割,還是傳統的 GRUB

確認磁碟

先確認目前 rpool 的狀態與實際裝置名稱:

zpool status rpool

再找出新、舊兩顆碟的 by-id 名稱:

ls -l /dev/disk/by-id/ | grep -v part

以下以舊碟(來源)為 <OLD>、新碟(目的)為 <NEW> 說明,請替換成實際的 by-id 名稱。

換碟步驟

清空新碟

先在 PVE WebUI 的 節點 → 磁碟 對新碟按 抹除磁碟(Wipe Disk),確認新碟上沒有舊的分割與資料。

複製分割表

把舊碟的分割表複製到新碟(目的在前、來源在後):

sgdisk -R /dev/disk/by-id/<NEW> /dev/disk/by-id/<OLD>

再替新碟重新產生 GUID,避免與舊碟衝突:

sgdisk -G /dev/disk/by-id/<NEW>

PVE 安裝程式建立的開機碟有三個分割:part1 是 BIOS boot,part2 是 ESP(EFI 系統分割),part3 是 ZFS。

讓新碟可以開機

proxmox-boot-tool status 顯示使用 proxmox-boot-tool 管理的系統(UEFI,或 PVE 6.4 以後安裝的系統),初始化新碟的 ESP:

proxmox-boot-tool format /dev/disk/by-id/<NEW>-part2
proxmox-boot-tool init /dev/disk/by-id/<NEW>-part2
proxmox-boot-tool refresh

注意:如果 proxmox-boot-tool status 顯示目前的磁碟是用 GRUB 開機(特別是有啟用 Secure Boot 時),init 要加上 grub 參數:proxmox-boot-tool init /dev/disk/by-id/<NEW>-part2 grub。

沒有使用 proxmox-boot-tool、純 GRUB 開機的舊系統,改用:

grub-install /dev/disk/by-id/<NEW>

加入 ZFS 鏡像

補上第二顆碟做鏡像(原本只有一顆),用 zpool attach 把新碟的 ZFS 分割掛到現有碟旁邊:

zpool attach rpool /dev/disk/by-id/<OLD>-part3 /dev/disk/by-id/<NEW>-part3

更換故障或要汰換的碟,用 zpool replace 直接以新碟取代舊碟:

zpool replace -f rpool /dev/disk/by-id/<OLD>-part3 /dev/disk/by-id/<NEW>-part3

注意:zpool attach 的第一個參數要填 rpool 裡現有的裝置名稱,請以 zpool status rpool 顯示的名稱為準。

等待 resilver 完成

zpool status rpool

狀態顯示 resilver 進行中時,千萬不要移除任何一顆碟,等到顯示 resilvered 完成、兩顆碟都是 ONLINE 才算完成。

移除舊碟(選做)

用 zpool attach 補碟、之後又要拿掉舊碟的話,等 resilver 完成後再卸除:

zpool detach rpool /dev/disk/by-id/<OLD>-part3

使用 zpool replace 的話,resilver 完成後舊碟會自動移出鏡像,不需要再 detach。

實際範例

舊碟(來源)為 Intel SSD,新碟(目的)為另一顆 256GB SSD,原本 rpool 只有一顆碟,要補成鏡像:

  pool: rpool
 state: ONLINE
config:
        NAME                                                STATE     READ WRITE CKSUM
        rpool                                               ONLINE       0     0     0
          ata-INTEL_SSDSC2BB120G6_SERIAL0001-part3          ONLINE       0     0     0
# 複製分割表(目的=新碟,來源=舊碟)
sgdisk -R /dev/disk/by-id/ata-SATA_SSD_256G_SERIAL0002 \
          /dev/disk/by-id/ata-INTEL_SSDSC2BB120G6_SERIAL0001

# 重新產生 GUID
sgdisk -G /dev/disk/by-id/ata-SATA_SSD_256G_SERIAL0002

# 初始化 ESP
proxmox-boot-tool format /dev/disk/by-id/ata-SATA_SSD_256G_SERIAL0002-part2
proxmox-boot-tool init   /dev/disk/by-id/ata-SATA_SSD_256G_SERIAL0002-part2
proxmox-boot-tool refresh

# 加入鏡像
zpool attach rpool \
  /dev/disk/by-id/ata-INTEL_SSDSC2BB120G6_SERIAL0001-part3 \
  /dev/disk/by-id/ata-SATA_SSD_256G_SERIAL0002-part3

# 等待 resilver 完成
zpool status rpool

PVE 8.x 與 9.x 的差異

  • 整體流程在 8.x、9.x 通用,proxmox-boot-tool、sgdisk、zpool 的用法一致
  • 9.x 的 ZFS 版本比較新,完成後 zpool status 可能會提示可以執行 zpool upgrade。升級後舊版的開機環境就無法讀取這個 pool,請先確認開機載入程式支援,非必要不要執行

結論

ZFS root 鏡像換碟,最容易出錯的地方有三個:sgdisk -R 的方向寫反、用了 /dev/sdX 結果操作到錯的碟、resilver 還沒跑完就把舊碟拔掉。另外,只做 zpool replace 是不夠的,開機分割要用 proxmox-boot-tool 一起處理,新碟才能開機。

實際執行前,務必先用 zpool status 確認 rpool 裡的實際裝置名稱,並確定 resilver 完成再移除舊碟。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀