高级描述
因此,我目前有一个复杂的 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_encrypted
,three_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_encrypted
、media_and_backups/backups
、 和non_redundant_foo/nr_encrypted
。
(尽管将媒体和备份数据集分开并不是必须的,因为这会使事情变得复杂)
现在我的迁移过程可能如下所示(所有 7 个驱动器都连接到同一台计算机):
- 在所需的 4 TB 和 8 TB 分区中格式化 12 TB 驱动器
- 将现有池/数据集的数据备份到8TB分区
- 销毁旧的三个池,创建
media_and_backups
池和相应的数据集(media_and_backups/media_encrypted
,media_and_backups/backups
),从备份中恢复它们 - [甚至可以选择将
nr_encrypted
数据移动到media_and_backups
,销毁 8TB 分区上的文件系统,在那里创建一个新池并将nr_encrypted
数据集恢复到那里]
但就像我上面提到的,我不确定的部分是备份和恢复进度
- 我能想到的一种简单方法是仅使用 rsync,为每个数据集创建一个文件夹,同步所有数据,创建我想要的池和数据集,然后 rsync 回这些数据集。
- 一个明显的缺点是数据将在备份时被解密并在恢复时重新加密
- 只是感觉不对,例如我如何识别传输中的数据损坏
zfs send
似乎zfs receive
是要走的路。但是...我实际上该怎么做呢?- 我阅读了ZFS send/recv full snapshot的答案,但我的设置和他们的设置之间存在一些关键差异:
- 他们直接在新服务器上创建新池我想首先存储备份,然后在同一服务器上恢复它
- 我有来自三个不同池的三个数据集,我想存储在同一个池中
- 还有关于可用存储的问题:8TB (= 7.28TiB) 应该足以容纳 3.26+1.93+1.07=6.26TiB 的已用数据,但当然 8TB 池无法托管 4+3+价值 4TB 的数据集
- 我阅读了ZFS send/recv full snapshot的答案,但我的设置和他们的设置之间存在一些关键差异:
- 因此,我认为我应该将
zfs send
当前数据集分别放入 8TB 池上的一个大文件(或以某种方式将其拆分为块),然后在完成后销毁旧池并创建新池,然后zfs recv
从文件到池
这是执行此操作的最佳方法,还是有更好/推荐的方法?或者使用zfs send
/的任何最佳实践zfs receive
。如果我这样做的话,有什么需要注意的地方吗?
所以我发现错误纠正发生在接收时,所以创建中间文件不是一个好主意。
我还发现我的数据集没有设置卷大小(使用 进行检查
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
-d
丢弃origin_pool
部分文件系统名称并destination_pool
使用-u
不要安装-v
打印有关流的详细信息以及执行接收操作所需的时间。(事后看来,我可能不需要两者pv
和-v
选项,但哦好吧)以上是一般要点,但为了完整起见,我采取了以下步骤
tmux
会话,以便可以轻松断开连接而无需停止正在运行的进程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 -a
,zfs 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 再次工作