Proxmox VE 安裝時選了 ZFS RAID1,開機碟就是鏡像的 rpool。但不管是硬碟故障要更換,還是當初只裝了一顆、現在要補上第二顆做鏡像,步驟都比一般的資料碟多:除了 ZFS 本身,開機分割與開機載入程式也要一起處理,不然換完之後新碟是不能開機的。
這篇整理 PVE 8.x、9.x 的 ZFS root 鏡像換碟與補碟步驟,以及幾個容易出錯的地方。

執行前務必確認
sgdisk -R的方向是「目的在前、來源在後」:sgdisk -R <新碟> <舊碟>。方向寫反的話,會把空白新碟的分割表蓋到舊碟上,造成資料毀損,這是整個流程風險最高的一步- 一律使用
/dev/disk/by-id/路徑:不要用/dev/sdX,重新開機後代號可能變動,容易操作到錯誤的磁碟 - 先確認開機模式:執行
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 完成再移除舊碟。
參考資料
- Proxmox VE 官方文件:ZFS on Linux(Changing a failed bootable device)
https://pve.proxmox.com/wiki/ZFS_on_Linux - Proxmox VE 官方文件:Host Bootloader
https://pve.proxmox.com/wiki/Host_Bootloader



