高级描述
因此,我目前有一个复杂的 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 发送/接收完整快照但我的设置和他们的设置之间存在一些关键差异:
- 他们直接在新服务器上创建新池我想首先存储备份,然后在同一服务器上恢复它
- 我有来自三个不同池的三个数据集,我想存储在同一个池中
- 还有关于可用存储的问题:8TB (= 7.28TiB) 应该足以容纳 3.26+1.93+1.07=6.26TiB 的已用数据,但当然 8TB 池无法托管 4+3+价值 4TB 的数据集
- 我读了答案ZFS 发送/接收完整快照但我的设置和他们的设置之间存在一些关键差异:
- 因此,我认为我应该将
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 -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 再次工作