我有一个由两个镜像驱动器组成的 zpool,用于存储我的所有个人数据。我想添加另一个镜像驱动器,因为其他驱动器已经使用了好几年了。然而,我却设法破坏了该池,无法再将其导入。
在我做任何事情之前,这是游泳池(称为“保险库”)的原始布局:
vault
mirror-0
sdd
sdh
我尝试通过发出 来添加另一个驱动器zpool add vault /dev/sdc
,并收到来自 zpool 的警告(关于期望 vdev,但 scd 是磁盘)。我忽略了警告,并强制执行操作-f
(是的,这很愚蠢……)
我最终得到以下池配置:
vault
mirror-0
sdd
sdh
sdc
注意到 sdc 不是镜像的一部分,我再次尝试将其从池中移除,但意识到这是不可能的。我忽略了额外的驱动器并重新启动,并假设我的数据在镜像 0 中已经很安全,于是决定使用重新利用 sdc 并使用另一个驱动器,用零覆盖 sdc 的前 100MB:(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
,所以我假设文件系统的元数据已被清除,并且有办法以某种方式访问原始数据。但我不知道从哪里开始。
谁能帮我这个?
答案1
我已设法通过将 debian 升级到 bullseye(以便能够访问较新版本的 zdb)来恢复部分数据,并且导入缺少 vdev 的 zpool:
echo 1 >> /sys/module/zfs/parameters/zfs_max_missing_tvds
zpool import -o readonly=on vault
不过,zpool 上的一些文件系统已损坏。我已将完整的数据复制到新的 zpool,并进行了先前的探测泰兴市找到一个没有引发任何错误的值:
zdb -e vault -ul | grep ' txg' | sed 's/.*= //' | sort | head
zdb -deG -o zfs_max_missing_tvds=1 -T 5102203 vault # <- errors
zdb -deG -o zfs_max_missing_tvds=1 -T 5102202 vault # <- errors
zdb -deG -o zfs_max_missing_tvds=1 -T 5102201 vault # <- worked!
然后我能够在完整的事务组 ID 处导入 zpool:
zpool import -o readonly=on -T 5102201 vault
对于我的 2x4TB 镜像,此命令大约花费了 15 个小时,但我可以再次访问所有文件。此后,数据已复制到新的 zpool 中,我再也不会在睡眠不足的状态下碰它了。