我在单磁盘 ZFS 池中造成了一个愚蠢的事故,看起来和这个邮件列表线程中的人一样,即我似乎覆盖了重要的元数据。这可以从实际有效负载中恢复,还是有办法在没有元数据的情况下检索有效负载?
这就是我所做的,确切地说:
- 有一个 ZFS 池在一台机器上运行一个磁盘
- 想将它迁移到另一台机器上的新 ZFS 池
zpool export
在第一台机器上忘记了- 当
zpool create
抱怨设备正在使用时,我想“没问题,我只是把主机取下来了,它不再使用了”并做了zpool create -f
我应该做的(正如我在 RTFM 之后意识到的那样)import
而不是create
在新主机上。现在我有一个工作的 zfspool,但文件系统已经消失/不可见。
我尝试在旧主机上重新导入设备,后来又尝试了import -D
,但很明显,两者都不起作用。
好吧,首先我会在尝试任何事情之前获得磁盘的位流副本。
a
zpool import -D
有什么作用吗?老实说,我不这么认为,因为新池已经覆盖了原始池的所有标签、块和指针块。
磁盘/分区的顶部和底部 512 KB 包含标签,其中包括最后几个超级块的列表(用于恢复和回滚)和池的 RAID 几何结构(更具体地说是磁盘所属的 vdev)。通过建立一个新的游泳池,您几乎可以肯定已经消灭了旧标签。这意味着您需要知道池的确切几何结构(RAID-Z 配置与磁盘顺序),并努力寻找超级块。
zpool create 会覆盖设备上的所有标签(这就是您必须添加“-f”的原因,这实质上意味着“如果一切都出错了,请怪我”)。由于 vdev 标签包含根块指针(指向整个池对象树的根块),并且该块指针中的值随着新数据的添加(由于 COW 语义)而移动,因此您的数据消失了