我正在尝试缩小 zfs 分区。我读到过你不能直接这样做。唯一的方法是先将分区镜像到临时磁盘,删除并重新创建新的、较小的分区来代替原始分区,然后将内容复制回来。
源分区标识为分区类型“Solaris Boot”和“Solaris Root”,两个内容都是 zfs。第一个有一个名为“bpool”的 zpool,第二个名为“rpool”。我可以在
- 我在临时磁盘上创建了新分区,但无法使用 gparted 将分区类型设置为“Solaris Boot/Root”。有什么办法吗?
- 我尝试了
zfs send -R bpool | zfs receive -F tempbpool
类似方法,用于 rpool。这些命令立即完成。我完全没有信心这些 TB 级的数据确实复制到了临时磁盘。 - 我还尝试创建快照 bpool@today。发送/接收也立即完成。
- 一些 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 数据集恢复到与拍摄快照时完全相同的状态。使用快照备份和恢复数据以保留文件系统状态,我相信这是处理此问题最正确的方法。
上述方法对于其他快照和备份也普遍有用。