如何恢复 ZFS 池中覆盖的标签、指针块和 ueberblocks?

如何恢复 ZFS 池中覆盖的标签、指针块和 ueberblocks?

我在单磁盘 ZFS 池中造成了一次愚蠢的事故,似乎和此邮件列表主题也就是说,我似乎覆盖了重要的元数据。这可以从实际有效载荷中恢复吗?或者有没有办法在没有元数据的情况下检索有效载荷?

这正是我所做的:

  • 在一台机器上使用单个磁盘运行一个 ZFS 池
  • 希望将其迁移到另一台机器上的新 ZFS 池
  • 忘记zpool export在第一台机器上
  • zpool create有人抱怨设备正在使用时,我想“没问题,我刚刚关闭了主机,它不再使用”,然后就这么做了zpool create -f

我应该做的(正如我在阅读手册后意识到的那样)是在新主机上import 进行操作create。现在我有一个可以运行的 zfspool,但是文件系统不见了/不可见了。

我尝试在旧主机上重新导入该设备,后来又尝试import -D,但很明显,两者都没有起作用。

答案1

好吧,首先,在尝试任何事情之前我会获取磁盘的位流副本。

zpool import -D做什麼嗎?

说实话,我不这么认为,因为新池已经覆盖了原始池的所有标签、块和指针块。

答案2

磁盘/分区的顶部和底部 512 千字节包含标签,其中包括最后几个超级块的列表(用于恢复和回滚)和池的 RAID 几何结构(更具体地说是磁盘所属的 vdev)。通过创建新池,您几乎肯定会清除旧标签。这意味着您需要知道池的确切几何结构(带有磁盘顺序的 RAID-Z 配置)并以困难的方式寻找超级块。

zpool create 会覆盖设备上的所有标签(这就是为什么你必须添加“-f”,这本质上意味着“如果一切都出错,那就怪我吧”)。由于 vdev 标签包含根块指针(指向整个池对象树的根块),并且此块指针中的值会随着新数据的添加而移动(由于 COW 语义),因此你的数据已经消失了

相关内容