我有一个由两个镜像驱动器组成的 zpool,用于存储我的所有个人数据。我想添加另一个镜像驱动器,因为其他驱动器已经使用了好几年了。相反,我设法削弱了池,无法再导入它。
这是在我做任何事情之前池(称为“保险库”)的原始布局:
vault
mirror-0
sdd
sdh
我尝试通过发出来添加另一个驱动器zpool add vault /dev/sdc
,并从 zpool 收到警告(关于期待 vdev,但 scd 是磁盘)。我忽略了警告,并强制操作-f
(是的,这很愚蠢......)
我最终得到了以下池配置:
vault
mirror-0
sdd
sdh
sdc
注意到 sdc 不是镜像的一部分,我尝试再次将其从池中删除,并意识到这是不可能的。我忽略了额外的驱动器并重新启动,并假设我的数据在 mirror-0 中已经是安全的,并决定使用重新利用 sdc 并改用另一个驱动器,用零覆盖前 100MB 的 sdc:(dd if=/dev/zero of=/dev/sdc bs=1MB count=100
是的,我今天特别愚蠢... )
现在,当我尝试导入我的 zpool 时,我收到以下错误:
root@atlas:~# zpool import
pool: vault
id: 3553551207657826252
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://zfsonlinux.org/msg/ZFS-8000-6X
config:
vault UNAVAIL missing device
mirror-0 ONLINE
sdd ONLINE
sdh ONLINE
Additional devices are known to be part of this pool, though their
exact configuration cannot be determined.
这些驱动器上镜像中的数据对我来说非常重要,我真的希望有一种方法可以从“部分”池中恢复数据。由于我在虚假操作后几分钟重新启动add
,我假设文件系统的元数据已被擦除,并且有一种方法可以以某种方式访问原始数据。但我不知道从哪里开始。
谁能帮我这个?
通过将 debian 升级到 Bullseye(以便访问更新版本的 zdb)并导入缺少 vdevs 的 zpool,我设法恢复了部分数据:
但是,zpool 上的某些文件系统已损坏。我已经将完整的数据复制到一个新的 zpool 上,并探测了早期的txg值以找到一个没有引发任何错误的值:
然后我能够以完整的事务组 ID 导入 zpool:
对于我的 2x4TB 镜像,这个命令大约需要 15 个小时,但我可以再次访问我的所有文件。数据已被复制到一个新的 zpool 上,我再也不会在睡眠不足的状态下触摸它了。