物理机PVE虚拟机故障硬盘更换,ZFS阵列raidz2-0系统盘替换实操笔记

一、使用zpool status命令或者PVE面板查看zfs存储池情况

zpool status


二、查看磁盘列表

路径、分区和id号,并记录下来,除了需要更换的硬盘,还需要记录一个好硬盘的,等下复制分区用

ls -la /dev/disk/by-id


三、使用zpool offline 命令使坏盘脱机(可选)

(这步在多次测试没发现有什么用,并且热插拔也没什么用,热插拔无效不确定什么原因)

zpool offline ata-XXXXXXXXXX-part3


四、更换硬盘并初始化

移除要替换的硬盘并插入新的硬盘,如果热插拔不识别,重启后查看。


五、运行zpool replace命令

(这边官方文档写得很抽象,“更改故障设备”“在使用 systemd-boot 时更换故障的系统磁盘”“使用 proxmox-boot-tool”"使用 grub"并列的目录结构容易误导人,如果我没理解错的话,应该是分数据盘和系统盘的更换的,只有在系统盘的情况下,才区分proxmox-boot-tool引导还是grub引导)

1.更改故障设备(非系统盘)

zpool replace -f <pool> <old device> <new device>

如果是数据盘的话,网上很多教程都先让在面板上清理数据,然后格式化,实操时感觉并没有什么用。这边<pool>是zfs池的名称没什么争议,<old device>输入旧硬盘数据分区id号ata-WDC_XXXXXXX-part3,<new device>输入新硬盘完整id号,新硬盘会自动分成part1和part9两个分区。以下是错误示例

zpool replace -f rpool ata-WDC_XXXXXXX-part3 ata-Hitachi_XXXXXXX //系统引导分区不要这样做,还是要先复制分区。

因为我是系统分区,所以这样直接替换,新硬盘就缺了引导,raidz2其中一块硬盘没引导问题也不大,不过强迫症必须重新换。


2.在使用systemd-boot时更换故障的(系统盘)

查看引导状态,会提示拔掉的旧硬盘id在引导列表里面已失效,等替换完硬盘,根据提示自行到etc目录下删除即可

proxmox-boot-tool status

zfs阵列中系统盘更换,下面三步比较关键,分别是:①复制分区、②格式化硬盘、③还原数据。

sgdisk <healthy bootable device> -R <new device>
sgdisk -G <new device>
zpool replace -f <pool> <old zfs partition> <new zfs partition>

官方文档写的依然很抽象,实操的时候的<healthy bootable device><new device><old zfs partition> <new zfs partition>这四个值,输入硬盘id一直都是报错,后来参考https://pve.proxmox.com/wiki/Host_Bootloader这篇文档,输入分区标识/dev/sdX、/dev/sdY,大部分情况可以正常还原损毁硬盘了。当然也遇到了输入分区标识也不行的情况,最后输入了完整路径/dev/disk/by-id/wwn-XXXXXX-part1才成功运行命令的。以下是示例:

sgdisk /dev/sdX -R /dev/sdY                                               //①复制分区,这边的sdX就是之前”二、查看磁盘列表“中让记录下来的好硬盘标识别
sgdisk -G /dev/sdY                                                        //②格式化硬盘
zpool replace -f rpool ata-XXXXXX-part9 ata-YYYYYY-part3                  //③还原数据,输入硬盘id,有时不起作用
zpool replace -f rpool /dev/sdX9 /dev/sdY3                                //③还原数据,输入分区标识,有时不起作用
zpool replace -f rpool /dev/disk/by-id/wwn-XXXXXX-part1 wwn-YYYYYY-part3  //③还原数据,输入完整路径,以上无效时,可以试试。

如果还是提示错误 cannot offline /dev/disk/by-id/sdX-part3: no such device in pool

因为坏硬盘在系统中完全无法识别导致路径失效,对此可以采用填写硬盘GUID的方式进行,

使用 zdb 命令查看损坏硬盘路径对应的GUID。

zpool replace -f rpool 1096XXXXXX946 /dev/disk/by-id/sdY-part3

# 注意 !! 确保硬盘选择正确。

# 使用 zpool status -v查看 同步状态


(1)使用 proxmox-boot-tool:

proxmox-boot-tool format <new disk's ESP>
proxmox-boot-tool init <new disk's ESP>

正常直接执行就行,有一次format的时候,提示了要加--force参数。以下是示例:

proxmox-boot-tool format /dev/sdY2
proxmox-boot-tool init /dev/sdY2
proxmox-boot-tool refresh  # 验证EFI


(2)使用 grub:(未用grub引导,所以未测试)

grub-install <new disk>


参考网址1:PVE8- ZFS 阵列重组 替换硬盘,修复efi 启动引导(全部折腾完才看到这篇,这篇最靠谱)

参考网址2:Proxmox VE Administration Guide(version 8.3.1, Wed Nov 20 21:19:42 CET 2024 英文官方手册)

参考网址3:Synchronizing the content of the ESP with proxmox-boot-tool

参考网址4:Promxox VE 中文文档


更新时间 2025-02-03 00:55:29