为了测试添加 ZFS 日志设备会对 ZFS 阵列产生什么影响,我决定创建一个 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
Run Code Online (Sandbox Code Playgroud)
我怀疑问题源于我使用驱动器号创建池的事实,如下所示:
sudo zpool create -f zpool1 mirror /dev/sdb /dev/sdc
Run Code Online (Sandbox Code Playgroud)
对我来说幸运的是,这只是一个测试,没有丢失数据的风险,但如果在现实场景中发生这种情况,从这个问题中恢复的最佳方法是什么?显然驱动器仍然存在并且准备就绪。
有没有更好的方法来创建 zpool 而不使用驱动器号来/dev/sda避免将来出现此问题?我注意到Ubuntu 文档指出以与我相同的方式创建 zpool。
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
Run Code Online (Sandbox Code Playgroud)
好消息是,您可以将现有的 ZFS RAID 阵列“转换”为使用这些标签,从而防止将来发生这种情况,如果这种情况已经发生在您身上,甚至可以解决降级的阵列。
sudo zpool export [pool name]
sudo zpool import -d /dev/disk/by-id [pool name]
Run Code Online (Sandbox Code Playgroud)
您只需确保池数据集未在使用中即可。例如,不要在池内执行命令,并确保它们不会通过 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
Run Code Online (Sandbox Code Playgroud)
我确保测试一下:
sudo zpool status没有报告任何错误。| 归档时间: |
|
| 查看次数: |
2667 次 |
| 最近记录: |