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

我在一个单磁盘ZFS池中造成了一个愚蠢的意外,看起来就像这个邮件列表线程中的人一样,也就是说,我似乎已经覆盖了重要的元数据。 这可以从实际的有效载荷恢复,还是有没有办法检索有效载荷没有元数据?

这就是我所做的,确切地说:

  • 有一台ZFS池在一台机器上运行一个磁盘
  • 希望将其迁移到另一台计算机上的新ZFS池
  • 忘记将zpool export到第一台机器上
  • zpool create抱怨设备正在使用,我想“没问题,我只是把主机,不再使用”,做了zpool create -f

我应该做的(就像我在RTFM后意识到的那样)是import而不是在新主机上create的。 现在我有一个工作zfspool,但文件系统已经消失/不可见。

我尝试重新导入旧主机上的设备,后来尝试import -D ,但是,显然,两者都不起作用。

首先要做的事情是在尝试任何事情之前先得到磁盘的位stream拷贝。

做一个zpool import -D做什么?

如果我是诚实的,我不认为这是因为新的池已经覆盖原池中的所有标签,块和指针块。

磁盘/分区的顶部和底部512千字节包含标签,其中包括最后几个uberblocks(用于恢复和回滚)以及池的RAID几何(更具体地,磁盘是vdev的一部分)的列表。 通过build立一个新的游泳池,你几乎可以肯定地消灭了旧的标签。 这意味着你需要知道池的确切几何形状(使用磁盘顺序的RAID-Zconfiguration),并以艰难的方式去寻找uberblocks。

一个zpool创build覆盖设备上的所有标签(这就是为什么你必须添加“-f”,这意味着“如果所有错误都怪我”)。 由于vdev标签包含根块指针(指向整个池对象树的根块),并且在添加新数据(由于COW语义)的情况下,块指针中的值会左右移动,因此数据不见了