从丢失设备的 zpool 中恢复数据

从丢失设备的 zpool 中恢复数据

我有一个由两个镜像驱动器组成的 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 中,我再也不会在睡眠不足的状态下碰它了。

相关内容