ZFS:使用滚动快照发送/接收

Bay*_*rSe 5 zfs

我的小型家庭服务器在具有 ZFS 的发行版上运行。在那个系统上,我实现了一个滚动快照方案:

  • 每小时创建一个快照
  • 每天一次,链条变细,这样我就有了一组每小时/每天/每周/每月的快照

我想将一些文件系统的异地备份存储在我办公室的 USB 驱动器上。计划是每隔一周更新一次驱动器。但是,由于滚动快照方案,我在实现增量快照时遇到了麻烦。

给你一个说明,这是我想要的程序:

  1. 初始快照: zfs snap tank/fs@snap0
  2. 传输初始快照: zfs send tank/fs@snap0 | zfs recv -Fduv backup_tank
  3. backup_tank异地商店
  4. 拍几张快照: zfs snap tank/fs@snap1zfs snap tank/fs@snap2
  5. 细化链条: zfs destroy tank/fs@snap0
  6. 返回backup_tank并对文件系统进行增量更新
  7. 显然,zfs send -I snap0 tank/fs@snap2 | zfs recv -Fduv backup_tank由于snap0不再存在而失败tank

长话短说:

是否有巧妙的解决方案将快照链的细化和增量send/相结合recv?每次我连接驱动器并运行一些命令时,我都希望在那个时间点有一份文件系统的副本。在此示例中,backup_tank应包含快照fs@snap1fs@snap2.

use*_*ser 6

你不能完全按照你的意愿去做。

无论何时创建zfs send流,该流都会创建为两个快照之间的增量。(这是目前实现 ZFS 的唯一方法。)为了将该流应用于不同的数据集,目标数据集必须包含流的起始快照;如果不是,则两者没有共同的参考点。当您销毁源数据集上的 @snap0 快照时,会造成 ZFS 无法协调的情况。

执行您所要求的方法是始终保持两个数据集之间的一个快照相同,并使用该公共快照作为下一个发送流的起点。

因此,您可能会在第 1 步中创建快照 @backup0,然后在第 6 步左右创建并使用快照 @backup1 以用于更新异地备份。然后传输作为@backup0 和@backup1(将包括所有中间快照)之间的增量的流,然后删除@backup0但保留@backup1(成为新的公分母)。下次刷新备份时,您可以创建@backup2(而不是@backup1)并在@backup1 和@backup2(而不是@backup0 和@backup1)之间传输增量,然后删除@backup1(而不是@backup0),然后很快。