ZFS:使用加密数据集一次重组多个池的最佳实践

ZFS:使用加密数据集一次重组多个池的最佳实践

高级描述

因此,我目前有一个复杂的 ZFS 设置,并希望对其进行重组,重用一些现有的硬件。

我知道做这样的事情的推荐方法是备份所有数据,销毁旧池,创建新池并恢复数据,问题在于如何最好地做到这一点

设置和细节

我当前的设置由 3×1TB 和 3×4TB 驱动器组成,按以下方式设置其中两个 4TB 驱动器分别格式化为一个 1TB 和一个 3TB 分区。

  • media_pool是一个由 5×1TB 磁盘/分区组成的 raidz1 池(-> 4TB 可用,已用 3.26TB)
  • three_t_pool是由 2 个 3TB 分区组成的镜像(-> 3TB 可用,1.93TB 已使用)
  • non_redundant是一个仅包含一个 4TB 驱动器的池(已使用 1.07TB)

这些池中的每一个都只有一个跨越整个池的加密数据集。 media_pool/media_encryptedthree_t_pool/backups, 和non_redundant/nr_encrypted


我未来的设置将淘汰 1TB 驱动器并添加 12TB 驱动器,如下所示:

  • media_and_backups一个 raidz1 池,由 3 个 4TB 驱动器和 12TB 驱动器的 4TB 分区组成((4-1)×4TB = 12TB 可用)
  • non_redundant_foo大驱动器的剩余 8TB。

以及加密数据集 media_and_backups/media_encryptedmedia_and_backups/backups、 和non_redundant_foo/nr_encrypted

(尽管将媒体和备份数据集分开并不是必须的,因为这会使事情变得复杂)


现在我的迁移过程可能如下所示(所有 7 个驱动器都连接到同一台计算机):

  • 在所需的 4 TB 和 8 TB 分区中格式化 12 TB 驱动器
  • 将现有池/数据集的数据备份到 8TB 分区
  • 销毁旧的三个池,创建media_and_backups池和相应的数据集(media_and_backups/media_encryptedmedia_and_backups/backups),从备份中恢复它们
  • [甚至可以选择将nr_encrypted数据移动到media_and_backups,销毁 8TB 分区上的文件系统,在那里创建一个新池并将nr_encrypted数据集恢复到那里]

但就像我上面提到的,我不确定的部分是备份和恢复进度

  • 我能想到的一种简单方法是仅使用 rsync,为每个数据集创建一个文件夹,同步所有数据,创建我想要的池和数据集,然后 rsync 回这些数据集。
    • 一个明显的缺点是数据将在备份时被解密并在恢复时重新加密
    • 只是感觉错误的例如,我如何识别传输中的数据损坏
  • zfs send似乎zfs receive是要走的路。但是...我实际上该怎么做呢?
    • 我读了答案ZFS 发送/接收完整快照但我的设置和他们的设置之间存在一些关键差异:
      • 他们直接在新服务器上创建新池我想首先存储备份,然后在同一服务器上恢复它
      • 我有来自三个不同池的三个数据集,我想存储在同一个池中
    • 还有关于可用存储的问题:8TB (= 7.28TiB) 应该足以容纳 3.26+1.93+1.07=6.26TiB 的已用数据,但当然 8TB 池无法托管 4+3+价值 4TB 的数据集
  • 因此,我认为我应该将zfs send当前数据集分别放入 8TB 池中的一个大文件中(或以某种方式将它们拆分成块),然后当完成后销毁旧池并创建新池,并将zfs recv文件复制到池中

这是执行此操作的最佳方法,还是有更好/推荐的方法?或者使用zfs send/ 的任何最佳实践zfs receive。如果我这样做的话,有什么需要注意的地方吗?

答案1

所以我发现错误纠正发生在接收时,所以创建中间文件不是一个好主意。

我还发现我的数据集没有设置卷大小(使用 进行检查zfs get volsize),因此我只需注意总使用大小,而不是池大小。

我也走过 如何将整个 zfs 池单向镜像到另一个 zfs 池据我所知,我可以使用-d(丢弃)选项,zfs receive以便文件系统路径与新池匹配。

我还需要--raw打开该标志,zfs send因为由于我的数据集已加密,我想避免解密和重新加密它们。

最后,由于我将来自不同池的多个数据集全部发送到同一个目标池,因此我必须注意仅发送数据集快照,而不是池快照,否则我会收到有关池上冲突快照的错误。

总的来说,我的传输命令如下所示:

zfs send -R --raw origin_pool/dataset@transfer_some_timestamp | pv -Wbraft | zfs receive -Fduv destination_pool

  • zfs send
    • -R生成复制流包以保留所有属性、快照……
    • --raw对于加密数据集,发送的数据与磁盘上存在的数据完全相同。避免重新加密
  • pv -Wbraft监控状态
  • zfs receive
    • -F` 扩展目标池
    • -d丢弃origin_pool部分文件系统名称并destination_pool使用
    • -u不要安装
    • -v 打印有关流的详细信息以及执行接收操作所需的时间。 (事后看来,我可能不需要两者pv-v选项,但哦好吧)

以上是一般要点,但为了完整起见,我采取了以下步骤

  • 先决条件:设置打开tmux会话,以便可以轻松断开连接而无需停止正在运行的进程
  • 将 12T 驱动器格式化为 4T 和 8T,注意 4T 分区的大小与其他 4T 驱动器的大小完全相同(通过使用查看现有分区表之一fdisk -l /dev/sdX
  • non_redundant_two在8T分区上创建池
  • 在第一个源池上创建递归快照zfs snap -r drei_t_pool@transfer_$(date '+%Y%m%d%H%M%S')
  • 转移到non_redundant泳池:(zfs send -R --raw drei_t_pool@transfer_20231210194637| pv -Wbraft | zfs receive -Fduv non_redundant_two请注意,这并不理想,见下文)
  • 创建下一个源池的快照zfs snap -r media_pool@transfer_$(date '+%Y%m%d%H%M%S')
  • 尝试发送它并收到错误,检查快照 ( zfs list -t snapshot) 发现池中有一个非常小的快照,而数据集有一个巨大的快照。删除池快照:zfs destroy non_redundant_two@transfer_20231210194637
  • 我还考虑并尝试创建一个“持有者”数据集并将整个池快照发送给它
    • zfs create non_redundant_two/media_holder
    • zfs send -R --raw media_pool@transfer_20231210232518 | pv -Wbraft | zfs receive -Fduv non_redundant_two/media _holder
    • 这似乎也有效,但我取消了+破坏了它的尝试,因为我有一个更好的想法:
  • 仅发送数据集:zfs send -R --raw media_pool/media_encrypted@transfer_20231210232518 | pv -Wbraft | zfs receive -Fduv non_redundant_two
  • 对最后一个池/数据集执行相同的操作zfs snap -r non_redundant@transfer_$(date '+%Y%m%d%H%M%S'),然后zfs send -R --raw non_redundant/nr_encrypted@transfer_20231211121954 | pv -Wbraft | zfs receive -Fduv non_redundant_two
  • 测试我是否可以打开备份的数据集并读取文件(对所有池都执行此操作):
    • zfs load-key non_redundant_two/backups
    • 检查...
    • 卸载并卸载密钥zfs unmount -azfs unload-key non_redundant/nr_encrypted
  • 在销毁池之前备份池的属性,例如pool get all drei_t_pool > zfs.get.drei_t_pool
  • 销毁原始快照,然后是数据集,然后是池(我知道这可以通过递归标志来完成,但我想非常确定我在做什么)(对于所有源池)
    • zfs destroy drei_t_pool@transfer_20231210194637,zfs destroy drei_t_pool/backups@transfer_20231210194637
    • zfs destroy drei_t_pool/backups
    • zpool destroy drei_t_pool
  • 创建我想要迁移到的新池media_and_backups
  • 将数据集传输到那里(不需要再次创建快照,因为数据没有改变)
    • zfs send -R --raw non_redundant_two/backups@transfer_20231210194637 | pv -Wbraft | zfs receive -Fduv media_and_backups
    • zfs send -R --raw non_redundant_two/media_encrypted@transfer_20231210232518 | pv -Wbraft | zfs receive -Fduv media_and_backups
  • 检查解密和安装工作是否按预期进行并销毁数据集non_redundant_two
  • 销毁传输快照

另一个好奇心是:NFS 无法正常工作,因此我检查了zfs get sharenfs pool_name/dataset_name它在哪里显示了我设置的首选项,但SOURCE选项卡显示了remote。所以我重新设置了该属性,之后选项SOURCE卡显示local并且 NFS 再次工作

相关内容