我前段时间买了两台OVH独立服务器,其中这台KS-LE-E各种问题不断,刚拿到手的时候就发现少了16GB内存,连IPMI上去发现确实是有一根内存条有问题:



当时就只想着解决这个内存的问题去了,发了个工单让他们给我把内存换了一根就好了。其他的硬件,比如硬盘的信息就简单看了下没发现什么大问题就没管它了,直接装了个PVE就拿来用了。这两天看邮箱的垃圾箱突然发现PVE给我发了很多封SMART错误的邮件:



登录服务器一看还真是,这块/dev/sdb的盘确实是有点问题了:



虽然这块盘现在还是能用的,但出于谨慎的态度我还是发了个工单问了下,OVH那边也不墨迹,二话不说直接就把这块盘给换了。在换之前我也没有在服务器上特别设置什么,就是简单看了下硬盘的分区以及当时的ZFS池状态:





OVH那边换完之后,我再次登录服务器查看,可以看到/dev/sdb这块盘是新换的了,没有了之前的分区表:



查看ZFS池状态,变成降级状态了,因为我这个是RAID10阵列,挂了一块盘也能正常运行:



关于在ZFS中更换硬盘,主要分为两种情况:系统盘(bootable device)、非系统盘。

如果是更换系统盘,则需要复制硬盘的分区表、生成GUID、以及重建EFI分区。而非系统盘的话不需要这些操作,直接更换就好了。

我现在的情况是属于更换系统盘,所以现在我需要把一块健康硬盘的分区表复制到这块新的/dev/sdb。现在我的服务器上除了sdb外还有sda、sdc、sdd三块盘,这些硬盘都是健康的,随便选一个复制就行:

sgdisk /dev/sda -R /dev/sdb


生成随机的GUID:

sgdisk -G /dev/sdb


然后更换ZFS池中的硬盘:

zpool replace -f rpool /dev/sdb3 /dev/sdb3


这个命令可能具有迷惑性,为什么新旧硬盘的分区都是/dev/sdb3?因为新盘的分区表是按照原来的分区表原封不动复制过来的,又因为新换的硬盘设备名正好还是sdb,所以完全相同。如果不是很明白,看看这个命令就懂了:

zpool replace -f [pool] [old zfs partition] [new zfs partition]


再次查看ZFS池状态可以看到在重建了,因为问题发现的早,我也没存多少数据,重建是非常快的:



重建完成后再次查看,全部都在线了:



现在还需要重建EFI分区:

proxmox-boot-tool format /dev/sdb2
proxmox-boot-tool init /dev/sdb2


更新配置:

proxmox-boot-tool refresh


重新生成/etc/kernel/proxmox-boot-uuids:

proxmox-boot-tool clean


查看状态:

proxmox-boot-tool status


如有下回显说明一切正常:



至此就全部完成了,可以重启一下测试服务器是否能够正常引导:

systemctl reboot


这个方法是通用的,不限于RAID10阵列,无论是RAIDZ-1、RAIDZ-2,或者RAID1,都可以用这个办法在ZFS中更换硬盘。

参考资料:

https://pve.proxmox.com/pve-docs/chapter-sysadmin.html#sysadmin_zfs_change_failed_dev

https://forum.proxmox.com/threads/how-to-regenerate-etc-kernel-proxmox-boot-uuids.99333/

https://pve.proxmox.com/pve-docs/chapter-sysadmin.html#sysboot_proxmox_boot_tool