插入驱动器时Zpool会降级

为了测试添加ZFS日志设备对ZFSarrays会产生什么影响,我决定创建一个zpool并执行一些基准测试,然后再插入SSD作为ZIL。

不幸的是,无论何时我在创建zpool之后插入SSD,或者在创建池之后拔出SSD(在创建池之后导致驱动器号发生变化的任何东西),然后重新启动,我的池将会降级,因为可以通过运行sudo zpool status

  pool: zpool1 state: DEGRADED status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: http://zfsonlinux.org/msg/ZFS-8000-4J scan: none requested config: NAME STATE READ WRITE CKSUM zpool1 DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 sda ONLINE 0 0 0 1875547483567261808 UNAVAIL 0 0 0 was /dev/sdc1 

我怀疑问题源于我使用驱动器字母创建池这样的事实:

 sudo zpool create -f zpool1 mirror /dev/sdb /dev/sdc 

问题

幸运的是,这只是一个测试而且没有丢失数据的风险,但是如果这种情况发生在现实世界的场景中,那么从这个问题中恢复的最佳方法是什么? 显然驱动器仍然存在并准备好了。

有没有更好的方法来创建zpool而不使用像/dev/sda这样的驱动器号来避免将来出现这个问题? 我注意到Ubuntu文档声明以与我相同的方式创建zpool。

额外信息

  • 操作系统:Ubuntu 16.04 Server 4.10
  • 从安装zfsutils-linux软件包安装zfs

在1级技术论坛上获得Dexter_Kane的帮助之后,答案是在创建池时使用/dev/disk/by-id/...路径。

例如

 sudo zpool create zpool1 mirror \ /dev/disk/by-id/ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N0PKS6S7 \ /dev/disk/by-id/ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N7VXZF6H 

转换和修复现有池

好消息是,您可以将现有的ZFS RAIDarrays“转换”为使用这些标签,以防止将来发生这种情况,如果已经发生这种情况,甚至可以解决降级后的arrays。

 sudo zpool export [pool name] sudo zpool import -d /dev/disk/by-id [pool name] 

您只需确保池数据集未被使用。 例如,不要在池内执行命令,并确保它们不通过NFS等共享。

执行转换后, sudo zpool status输出应类似于:

  pool: zpool1 state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zpool1 ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N0PKS6S7 ONLINE 0 0 0 ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N7VXZF6H ONLINE 0 0 0 

测试执行

我确保测试一下:

  • 使用by-id路径确实可以防止问题发生。
  • 在池处于降级状态时写入一些数据后,我仍然可以在执行导出/导入后读取所有文件,并且sudo zpool status报告没有错误。