我一直通过 并将服务器 A 中的 ZFS 池备份到服务器 B(备份服务器)zfs send/recv
,并使用每日增量快照。
服务器 B 充当备份服务器,分别为服务器 A 和服务器 C 保留 2 个池 (zfs41
和zfs49/tank
)
由于硬件问题,服务器 A 中的 ZFS 池现已消失 - 我想尽快恢复/恢复它。
目前我的服务器B中的快照列表如下:
NAME USED AVAIL REFER MOUNTPOINT
zfs41@2021Nov301205 14.9G - 3.74T -
zfs41@2021Dec011205 3.87G - 3.74T -
zfs41@2021Dec021205 3.77G - 3.74T -
zfs41@2021Dec031205 0B - 3.74T -
zfs49/tank@2021Nov301705 368G - 3.52T -
zfs49/tank@2021Dec011705 65.2G - 3.52T -
zfs49/tank@2021Dec021705 66.4G - 3.52T -
zfs49/tank@2021Dec031705 0B - 3.52T -
zfs49/tank@2021Dec031705
服务器 B 的最新版本在哪里
我想将整个池(包括快照)发送回服务器 A,但我不确定要运行的确切命令。
问题:在服务器 B 上,这样做是否zfs send zfs49/tank@2021Dec031705 | ssh <Server A host ip> zfs recv tank
足以接收服务器 A 上的完整 ZFS 池 + 所有快照(以便我可以继续增量发送/接收备份)?
答案1
首先,您需要在服务器 A 上创建一个空池。 zfs recv
无法创建新池。所以在服务器A上:
zpool create -R /mnt zfs49 [ mirror diskID1 diskID2 ]
...或您选择的其他 VDEV 结构。服务器 A 上的 VDEV 结构不需要与您丢失的池的旧结构相匹配。它只需要足够大来容纳数据。因此,如果您从上次所做的选择中获得了经验,那么这次创建池时可以随意做出更好的选择。但是,是的,如果您使用 4k 原生驱动器,您仍然需要ashift=12
等。
另外,我从下面的评论中得知,池和文件系统名称将相同,因此我们将服务器 B 上的池zfs49
文件系统恢复到服务器 A 上的池文件系统。tank
zfs49
tank
与其显式地传输每个文件系统,不如说明如何使用 arecursive snapshot
来传输整个池(包括所有文件系统及其快照)可能会更有益。
在上面的服务器 A 上创建空池后,下一步是在服务器 B 上创建最新的递归快照。该快照主要用于一次性恢复作业,因此不需要匹配您的命名方案YYYYMonDDHHMM
。事实上,由于此恢复作业快照可能是短暂的,因此将其从其他作业快照中脱颖而出可能会有所帮助。
我建议您在服务器 B 上创建一个递归快照并将其命名为xfer
,以用于此一次性传输的特定目的。所以在服务器B上:
zfs snap -r zfs49@xfer
现在,由于您在服务器 A 上有一个名为 的原始(空的)池zfs49
,因此您可以将该递归快照从服务器 B 传输到服务器 A(从服务器 B 开始):
zfs send -R zfs49@xfer | ssh <Server A ip> zfs recv -Fuv zfs49
我倾向于-Fuv
经常使用选项,zfs recv
因为:
-u
确认我想要在服务器 A 上保留新恢复的文件系统(暂时)未安装。将ZFS
池从一个系统传输到另一个系统并破坏(覆盖)现有安装点很容易遇到麻烦。步骤-R /mnt
上的选项也zfs create
可以防止这种情况,所以也许这就是“吊带和腰带”的情况,但在传输和恢复备份时,很难过于谨慎。-v
为我提供一些有关工作进展情况的反馈,因为每个已完成的快照将依次列出。
至于进度指示,您可能还会发现zfs
传输是利用 Andrew Wood 强大的管道查看器的绝佳机会pv(1)
:
(来自服务器B:)
zfs send -R zfs49@xfer |
pv -Wbraft |
ssh <Server A ip> zfs recv -Fuv zfs49/tank
调整pv
选项以满足您的品味和需求。
传输完成后,检查服务器 A 上的池,特别密切关注挂载点,请记住,/mnt
由于您的zpool create ...
语法,它们将带有前缀。如果您愿意,您可以(在服务器 A 上):
zpool export zfs49
zpool import -N zfs49
zfs list
这将导入池以显示本机安装点,但该zpool import -N
命令告诉zpool
您实际上不安装任何东西。这有助于对池的安装点实际所在位置进行逐一比较。确保池的挂载点不会覆盖服务器 A 上的任何现有挂载点,否则您可能会无法访问可能关键的文件系统。这种使用zpool import -N
与上述使用相吻合,zpool recv -u
试图最大限度地减少将新创建的文件系统安装在错误位置的风险。
最后,一旦您对服务器 A 上池的外观感到满意,您就可以xfer
从两个系统中删除快照。从服务器A:
zfs destroy -rv zfs49@xfer
ssh <Server B> zfs destroy -rv zfs49@xfer
我没有一个好的解决方案的一个警告是,备份和恢复池本身的属性并不简单,也就是说,必须通过zpool
而不是读取和写入选项zfs
。这包括诸如 、 之类的属性,以及向您展示的bootfs
所有其他花絮。zpool get all zfs49
大多数默认值可能是合理的,如果您过去更改过其中任何默认值,希望您能识别它们,并可以手动更改服务器 A 的新池上的属性以满足您的需求。否则,如何备份和恢复池属性的主题可能值得单独提出一个问题(如果还没有)。