ZFS硬盘替换

起因

去年《配置smartmontools监控硬盘状态》这就派上用场了,前几天收到告警说服务器硬盘的smart自检有问题:

SMART error (FailedHealthCheck) detected on host: xxx
=====

This message was generated by the smartd daemon running on:

   host name:  xxx
   DNS domain: xxx

The following warning/error was logged by the smartd daemon:

Device: /dev/sda [SAT], not capable of SMART self-check

Device info:
Micron_M600_xxxx, S/N:xxxx, WWN:x-xxxx-xxxx, FW:MU05, 1.02 TB

For details see host's SYSLOG.

You can also use the smartctl utility for further investigation.
Another message will be sent in 24 hours if the problem persists.

这块大船货的镁光M600号称库存全新实则清零的盘果然靠不住,才用了两年不到就出问题了……

赶紧下单买了一块机械硬盘,SSD还是风险大啊。结果到货一看,居然跟我之前报错的那块是同一型号的日立。这回似乎真的是库存全新货,看看这块能不能用上5年3个月吧。

替换

本来想直接做成zmirror,然后把旧盘换下来:

zpool list  # 看了一下当前zpool名字: ztank,当前状态已经是degraded了
zpool status  # 看一下现有的盘: /dev/sda
lsblk # 看一下新硬盘的路径: /dev/sdb
zpool attach ztank /dev/sda /dev/sdb  # 新旧硬盘组mirror
zpool status  # 显示状态为resilvering状态
zpool detach ztank /dev/sda  # 同步完成后就可以移除旧硬盘了

结果在attach时报错了:device is too small,因为这个SSD是1.02T的,比1T的机械硬盘大了一点,镜像组建失败。

只好手工迁移数据:

zpool create znew /dev/sdb  # 创建一个新的pool
zfs snapshot -r ztank@mig  # 创建快照
zfs send -R ztank@mig | zfs recv -F znew  # 迁移数据
zfs list -r znew  # 检查迁移结果
# 暂停ZFS的使用,断开所有mountpoint
zfs snapshot -R ztank@mig1  # 创建差异快照
zfs send -RI ztank@mig ztank@mig1 | zfs recv -F znew  # 迁移差异数据
zpool export ztank  # 导出旧的zpool
zpool import znew ztank  # 用原来的名字导入新的zpool

这样就完成了迁移。之所以要先做一次完全数据迁移,再做一次差异数据迁移,是为了减少中断服务的时间。

推送到[go4pro.org]