由于 FreeBSD 10.4 机器上的 2 个愚蠢的系统管理员技巧,我有一个处于这种状态的不可导入的 zpool:
# zpool import
pool: v
id: 5630710617833891462
state: UNAVAIL
status: One or more devices are missing from the system.
action: The pool cannot be imported. Attach the missing
devices and try again.
see: http://illumos.org/msg/ZFS-8000-6X
config:
v UNAVAIL missing device
raidz2-0 ONLINE
gpt/vault_R0_Row3_Col1.eli ONLINE
gpt/vault_R0_Row2_Col2.eli ONLINE
gpt/vault_R0_Row1_Col1.eli ONLINE
gpt/vault_R0_Row3_Col3.eli ONLINE
gpt/vault_R0_Row1_Col2.eli ONLINE
gpt/vault_R0_Row3_Col2.eli ONLINE
gpt/vault_R0_Row3_Col4.eli ONLINE
gpt/vault_R0_Row2_Col3.eli ONLINE
gpt/vault_R0_Row1_Col3.eli ONLINE
gpt/vault_R0_Row4_Col1.eli ONLINE
gpt/vault_R0_Row2_Col1.eli ONLINE
Additional devices are known to be part of this pool, though their
exact configuration cannot be determined.
丢失的设备名义上存在,但 ZFS 标签已被清除,因此 ZFS 不会接受它。最初的错误是添加最后一个仍然可见的顶层设备,并将丢失的设备作为顶层设备,而不是添加到 raidz2-0 vdev 中。此外,还试图通过销毁并重新创建现在丢失的 geli 设备来让 ZFS 接受删除,这让情况更加复杂。
问题是 raidz2-0 vdev 中有大量数据没有备份(由于一系列不同的错误),虽然这不是很关键,但我会喜欢才能恢复。此外,是备份位于加密的 ZFS 发送流的磁带上,因此恢复是一项漫长的任务。
据我从文档以及尝试使用“-F”和“-FX”选项但未成功的情况来看zfs import
,zfs clear
我基本上运气不佳。但我是吗?真的?真的没有办法告诉 ZFS 我不在乎那 2 个意外添加的顶层设备,因为这些设备从未写入任何实际数据吗?也许有办法编辑 ZFS 标签,让它认为 zpool 只有一个子节点?
答案1
如果您的 ZFS 版本足够新,则可以导入缺少顶层 vdev 的 ZFS 池。为此,您需要设置vfs.zfs.max_missing_tvds
缺少的顶层 vdev 的数量(在本例中为 1)。缺少的 vdev 越多,“体验”就越差。
您应该能够在运行时使用以下命令调整此值sysctl
:
sudo sysctl vfs.zfs.max_missing_tvds=1
然后,您可以以只读方式导入池:
sudo zpool import -o readonly=on your-pool
如果运气好的话,所有数据集都会被装载。然后你应该能够备份大部分数据。
此后,您可以重新创建该池。
如果您不了解 ZFS 池检查点,我建议您查阅一下。它们允许您恢复 ZFS 池上的大多数操作,包括添加 vdev。