升级到 Ubuntu 22 后,ZFS 发送/接收能帮助我恢复部分池丢失吗?

升级到 Ubuntu 22 后,ZFS 发送/接收能帮助我恢复部分池丢失吗?

我在 Ubuntu 下有一个长期运行的 ZFS 池,它经历了多次升级。从 Ubuntu 20 升级到 22 后,加密文件系统拒绝挂载,但其余的似乎没问题。 zpool status -v报告永久错误西门子ZFS-8000-8A在加密文件系统的根目录下。我注意到 zfsutils-linux 软件包版本从 0.8.3 大幅升级到了 2.1.5。

该池仍可导入到 Ubuntu 20 系统,并且加密文件系统仍可挂载在那里。看起来没问题。更重要的是,我能够zfs send从 Ubuntu 20 和zfs receiveUbuntu 22 上进行操作,显然是成功的。

如果我将zfs send整个池(或部分池)从 Ubuntu 20(ZFS 0.8.3)升级到 Ubuntu 22(ZFS 2.1.5),并且操作成功,那么我是否创建了一个没有升级问题的池?也就是说,接收操作是否会构建一个与 ZFS 完全同步的池?或者兼容性问题是否会出现在链接中?

我对 zfs 发送/接收操作的级别了解不够,无法确保在 Ubuntu 22 下不会出现进一步的损坏。

如果有必要,我很乐意重新加密加密的文件系统,而不是发送原始文件。一切都将在本地发生。在这种情况下,Ubuntu 20 在连接了磁盘设备的 LXD VM 中运行,并且发送/接收管道不会跨越任何网络。

请注意,我知道建议废弃整个池并从备份中恢复。我正尝试在不诉诸此方法的情况下进行恢复,因为我似乎能够读取池。

所有磁盘都通过了长时间的 SMART 测试,并且在 Ubuntu 20 下清理池没有显示任何错误。

我很高兴被告知(并附有引文),错误仅限于加密文件系统,我可以替换它们并继续操作而无需重建整个池,但我对 ZFS 内部机制了解不够,无法确定这一点。我很想知道如何找出答案。

答案1

首先,虽然从 0.8.3 升级到 2.1.5 肯定是一个大问题,但它不应该以池(部分)损坏而告终。因此我建议打开 GitHub 问题(或写信给 zfs-discuss 邮件列表)。

也就是说,发送不带--raw--compress选项的池肯定是取回所有数据的好策略:完整操作zfs send与逻辑上遍历整个池非常相似,例如rsync(在记录大小处理方面存在重要差异,但对于加密而言并不重要)。

rsync如果失败了,您可以在两个池/数据集之间使用一个简单的。

答案2

我已经解决了这个问题,在 zfs-discuss 邮件列表上发布了详细信息。我会在这里发布信息,希望它能帮助其他人。我的解决方案确实涉及长时间的服务器停机。有可用的补丁Ubuntu 错误 #1987190如果你不能容忍这一点,那可能会更好。

我在 GitHub 上发现了几个与我的问题相关的 ZFS 问题:

该错误与使用旧版 ZFS 本机加密创建的文件系统中的元数据有关。

我是这样修复游泳池的:

  1. 在具有新 ZFS 池的外部驱动器上安装了 Ubuntu 22,并在其上启动了服务器。

  2. 在该系统的 VM 中运行 Ubuntu 20,并将服务器的池成员磁盘连接到该 VM。

  3. 将旧池导入虚拟机。

  4. 在虚拟机中挂载“损坏”的文件系统。

  5. zfs 从虚拟机中的旧池发送到主机系统中新池中的 zfs 接收。这修复了元数据。

  6. 检查、再检查,确认所有数据都已成功。(我在 .zfs/snapshot 中的关键快照上使用了 rsync -n --checksum。)

  7. 扩展 SMART 测试并对旧池进行全面清理。

  8. 将服务器重新启动到 Ubuntu 22。无需回滚。

  9. 从外部磁盘导入新的 ZFS 池。

  10. 销毁受损的文件系统。

  11. zfs 从新池发送到旧池,重新创建损坏的文件系统。

我这样做是因为我怀疑旧池的完整性,不想对其进行不必要的改动。事实上,我认为我可以在 Ubuntu 22 中继续在旧池上运行服务器,并在服务器上启动 Ubuntu 20 VM。但如果操作系统本身位于损坏的文件系统中,这当然会失败。

我希望这可以帮助其他遇到此问题的人。

相关内容