ZFS 发送单个快照,包括后代文件系统

ZFS send single snapshot including descendent file systems

有没有办法发送包含后代文件系统的单个快照? 'zfs send' 即使快照是使用“-r”创建的,也只发送顶级文件系统。 'zfs send -R' 发送后代文件系统但包括所有以前的快照,如果灾难恢复池中不需要以前的快照,那么出于灾难恢复目的会消耗不必要的 space。

猫/sys/module/zfs/version 0.8.3-1ubuntu12.5

没有

如果你想要整个文件系统用于灾难恢复,你需要整个文件系统。

ZFS 快照不是完整的文件系统。它实际上是它与前一个快照之间的区别,并且该链通过所有快照一直延续到文件系统的“基本”副本。

您可以发送增量快照,这只会发送差异。每 Oracle ZFS documentation:

...

If you are sending the snapshot stream to a different system, pipe the zfs send output through the ssh command. For example:

host1# zfs send tank/dana@snap1 | ssh host2 zfs recv newtank/dana

When you send a full stream, the destination file system must not exist.

You can send incremental data by using the zfs send -i option. For example:

host1# zfs send -i tank/dana@snap1 tank/dana@snap2 | ssh host2 zfs recv newtank/dana

Note that the first argument (snap1) is the earlier snapshot and the second argument (snap2) is the later snapshot. In this case, the newtank/dana file system must already exist for the incremental receive to be successful.

第一个zfs命令

host1# zfs send tank/dana@snap1 | ssh host2 zfs recv newtank/dana

发送整个文件系统。

这次只发区别:

host1# zfs send -i tank/dana@snap1 tank/dana@snap2 | ssh host2 zfs recv newtank/dana

然后可以跟

host1# zfs send -i tank/dana@snap2 tank/dana@snap3 | ssh host2 zfs recv newtank/dana

我完全理解你的用例。虽然我经常面临相反的情况,我有一个远程备份池,我想从中恢复本地系统上的最新快照。

无论如何,虽然你不能直接达到你想要的,但你可以达到你想要的状态。这个想法是修剪您的恢复集,以便它只有最新的快照。 您首先发送初始快照:

host# zfs snapshot -r tank/data@initial_snapshot
host# zfs send -R tank/data@initial_snapshot | \
 ssh recovery-host zfs recv tank/data

这将发送所有降序文件系统,并将发送 initial_snapshot 和所有在它之前创建的文件系统。 如果您之前创建了任何快照,您可以删除它们:

recovery-host# zfs list -H -o name -t snapshot tank/data | head -n -1 \
 | xargs -r -n 1 zfs destroy -r -v

然后你发送增量更新和修剪,

host# zfs snapshot -r tank/data@${LATEST_LOCAL_SNAPSHOT}
host# zfs send -R -i tank/data@${LATEST_REMOTE_SNAPSHOT} \
 tank/data@${LATEST_LOCAL_SNAPSHOT} | ssh recovery-host zfs recv tank/data
recovery-host# zfs list -H -o name -t snapshot tank/data | head -n -1 \
 | xargs -r -n 1 zfs destroy -r -v

假设 LATEST_LOCAL_SNAPSHOTLATEST_REMOTE_SNAPSHOT 已正确设置。

请注意,这是一个最小的 seatbelt-less 示例。你应该关心你的 send-receives 是否成功。如果不小心达到恢复池没有任何与源匹配的快照的状态,您将无法再发送增量,因此需要重新开始。