如何将 zfs 分区从一个磁盘复制到较小的磁盘?

如何将 zfs 分区从一个磁盘复制到较小的磁盘?

我正在尝试缩小 zfs 分区。我读到过你不能直接这样做。唯一的方法是先将分区镜像到临时磁盘,删除并重新创建新的、较小的分区来代替原始分区,然后将内容复制回来。

源分区标识为分区类型“Solaris Boot”和“Solaris Root”,两个内容都是 zfs。第一个有一个名为“bpool”的 zpool,第二个名为“rpool”。我可以在

  1. 我在临时磁盘上创建了新分区,但无法使用 gparted 将分区类型设置为“Solaris Boot/Root”。有什么办法吗?
  2. 我尝试了zfs send -R bpool | zfs receive -F tempbpool类似方法,用于 rpool。这些命令立即完成。我完全没有信心这些 TB 级的数据确实复制到了临时磁盘。
  3. 我还尝试创建快照 bpool@today。发送/接收也立即完成。
  4. 一些 zfs 文档暗示我可以在原始池处于活动状态时复制这些分区。这是真的吗?及时快照可能很好。

那么,复制这些磁盘的内容的正确方法是什么?

我确实需要缩小 zfs 分区,以便我可以扩大磁盘上的第一个分区。如果有更好的方法,请告诉我。

谢谢

答案1

免责声明:如果您有特殊的 ZFS 启动分区,此答案将不予考虑。将恢复的 zpool 配置为用作启动分区或根文件系统超出了此答案的范围。

在我看来,对这一问题的规范回答应满足 3 个标准:

  • 逻辑步骤最少
  • 遵循 ZFS 设计理念
  • 在不同配置和分布中具有弹性

对于我提出的答案,我将调用旧的 zpoololdpool和新的 zpool newpool,并且快照被称为@today

首先,创建旧 zpool/dataset 的快照:

zfs snap oldpool@today

然后,将快照写入文件:

zfs send -R oldpool@today > gzip /tmp/oldpool.gz

现在销毁旧的 zpool,调整分区大小,并使用你喜欢的参数创建一个新的 zpool(不是问题也不是答案的一部分)

然后按照相反的顺序重复前两个步骤。

从文件恢复快照:

zcat /tmp/oldpool.gz | zfs recv -F newpool@today

最后将快照回滚到新的 zpool/dataset:

zfs rollback newpool@today

现在,您已将 zpool 数据集恢复到与拍摄快照时完全相同的状态。使用快照备份和恢复数据以保留文件系统状态,我相信这是处理此问题最正确的方法。

上述方法对于其他快照和备份也普遍有用。

相关内容