还是之前搭建的那个抽象的 PVE 服务器,最近发现默认的 ZFS Pool 居然 Degraded 了。
可以很明显地看到一个硬盘应该是损坏了。
因为我创建的是 RaidZ1,所以允许一块硬盘损坏,按理来说就是换一块硬盘就行了。
查询了一下文档和其他人的经验,基本操作就是:
- 先对原有硬盘进行下线
- 然后插上新硬盘
- 用 zpool replace 替换原来的硬盘
- 在新硬盘上重新构建数据
- 更换完成
因为目前硬盘已经是 Degraded 的状态,和 Offline 性质一致,所以就不再需要进行 offline 的操作,如果硬盘只是有错,没有彻底被 Degrade,是需要手动先下线的。
zpool offline poolname XXXXXXXX
目前首当其冲是弄块新硬盘,因为这个 PVE 服务器本身就是老古董,查询了硬盘配件编号是:581311-001,很容易就在闲鱼上找到了大量卖家,大部分都是拆服务器的二手贩子,我对硬盘要求不高,能撑一阵就行,最后谈了谈 30 块钱弄了一块。
接下来另一个问题就是要找到损坏的硬盘的位置,因为我是把硬盘每个单独创建一个 Raid0 模拟 HBA 的作用的,所以常理的命令行读取序列号的方式是无效的,建议关机进入 Raid 卡界面,根据 Raid 卡创建的 Raid 编号顺序,对应 PVE 里的编号,比如这个在 PVE 中是第五个硬盘,而 Raid 卡里也是第五个,查询服务器的 Slot ,可以定位第五块的位置。更换新硬盘即可。
更换新硬盘之后,重启进入系统,可以看到已经识别,创建 Raid0,进入 PVE,对原有硬盘进行 Wipe,就可以使用 zpool 进行 replace 了,一般来说只需要输入原有的 disk-id 就行了。
zpool replace poolname XXXXXXXX NEWXXXXXXX
replace 后可以看到重建的进度,有可能速度比较慢,但是我这里是越来越快,大概 10 个小时就重建完毕了。
至此硬盘更换完成。
最后不得不说, RaidZ1 还是有风险的,虽然允许损坏一块硬盘,一旦发现有硬盘异常,还是应该尽快处理,不要拖着,否则你更换硬盘重建的时候(有时候重建会很久,甚至数以天计),还有一块也碰巧坏了,那就完蛋了。
参考:
https://www.rockylinux.cn/notes/diy-nas-series-32-zfs-storage-pool-failure-and-recovery.html
https://tomjamescn.github.io/post/2019-06-13-zfs-replace-bad-disk/
https://pve.proxmox.com/wiki/ZFS:_Tips_and_Tricks#Replacing_a_failed_disk_in_the_root_pool