我的小型家庭服务器在具有 ZFS 的发行版上运行。在那个系统上,我实现了一个滚动快照方案:
我想将一些文件系统的异地备份存储在我办公室的 USB 驱动器上。计划是每隔一周更新一次驱动器。但是,由于滚动快照方案,我在实现增量快照时遇到了麻烦。
给你一个说明,这是我想要的程序:
zfs snap tank/fs@snap0
zfs send tank/fs@snap0 | zfs recv -Fduv backup_tank
backup_tank
异地商店zfs snap tank/fs@snap1
,
zfs snap tank/fs@snap2
zfs destroy tank/fs@snap0
backup_tank
并对文件系统进行增量更新zfs send -I snap0 tank/fs@snap2 | zfs recv -Fduv backup_tank
由于snap0
不再存在而失败tank
。长话短说:
是否有巧妙的解决方案将快照链的细化和增量send
/相结合recv
?每次我连接驱动器并运行一些命令时,我都希望在那个时间点有一份文件系统的副本。在此示例中,backup_tank
应包含快照fs@snap1
和fs@snap2
.
你不能完全按照你的意愿去做。
无论何时创建zfs send
流,该流都会创建为两个快照之间的增量。(这是目前实现 ZFS 的唯一方法。)为了将该流应用于不同的数据集,目标数据集必须包含流的起始快照;如果不是,则两者没有共同的参考点。当您销毁源数据集上的 @snap0 快照时,会造成 ZFS 无法协调的情况。
执行您所要求的方法是始终保持两个数据集之间的一个快照相同,并使用该公共快照作为下一个发送流的起点。
因此,您可能会在第 1 步中创建快照 @backup0,然后在第 6 步左右创建并使用快照 @backup1 以用于更新异地备份。然后传输作为@backup0 和@backup1(将包括所有中间快照)之间的增量的流,然后删除@backup0但保留@backup1(成为新的公分母)。下次刷新备份时,您可以创建@backup2(而不是@backup1)并在@backup1 和@backup2(而不是@backup0 和@backup1)之间传输增量,然后删除@backup1(而不是@backup0),然后很快。