在创建 ZFS 池后恢复它

在创建 ZFS 池后恢复它

我重新安装了 Ubuntu 14.04 系统,并尝试安装现有的 zfs 驱动器。这是一个包含所有数据的单个驱动器。操作系统位于另一个驱动器上,zfs 驱动器仅保存数据。

池名称为crystal

我很匆忙(是的),我做到了zpool create crystal /dev/disk-by-id/...etc...

该池现在已空。

有什么方法可以恢复原始池和/或检索数据吗?

答案1

很遗憾:不,不是真的。

ZFS 中主要有两种破坏性操作,有点不直观:zfs destroyzpool create。具体来说,命令zpool destroy 不是具有破坏性,事实上如果你能迅速认识到自己的错误,错误是很容易逆转的;它只是设置一个标志,在这种情况下它zpool import -D是你的朋友。

这些命令由于类似但略有不同的原因而具有破坏性:

  • zfs destroy是破坏性的,因为它会删除对被破坏的数据集的引用,因此无法使用任何标准工具在磁盘上找到它。(但另请参阅这个问题
  • zpool create具有破坏性,因为它会覆盖池中的所有超级块,这意味着 ZFS 代码无法找到磁盘上 Merkle 树数据结构的开头。一旦找不到树的根,其余数据将无法访问。

ZFS 复杂的磁盘格式加剧了这两种情况,进一步增加了恢复尝试的难度。对于大多数其他文件系统,文件将一般来说连续,或位于少数几个不同的位置。使用 ZFS,数据完全有可能分散在整个磁盘上,在执行上述任何命令后,没有任何东西可以指示哪些部分属于哪里。更糟糕的是,您肯定在寻找压缩的数据块,也可能寻找重复数据删除之类的东西。(在您的场景中,重复数据删除不太可能发生,但在一般情况下,这肯定是可能的。)

可能可以聘请一些 ZFS 专家来恢复您的数据,但普通的数据恢复服务不太可能在这一点上帮助您,而且常见的文件系统恢复软件甚至不了解 ZFS。假设您可以找到愿意与您合作的人,那么非常昂贵;我看到过提到价格开始在类似情况下,成本在五位数美元范围内。

此时,您最好的选择可能是恢复最近的数据备份并继续生活。

说实话,我有点困惑,为什么你能用类似于问题中所述的命令覆盖池。在我的系统上,使用 ZFS On Linux 0.6.4,构建了类似的场景,zpool拒绝create操作,并出现“无效的 vdev 规范”错误,指出支持设备is part of exported pool '...'。你应该得到类似的错误,除非你明确传递-f给 zpool 来强制操作,在这种情况下,你告诉 ZFS,是的,你确实真的做到这一点。尤其对于 ZFS 来说,通常不是你想做什么。

相关内容