通过使用 zfs send 命令,可以将 ZFS 文件系统或卷的快照转换为快照流。然后,可以使用快照流重新创建 ZFS 文件系统或卷(通过 zfs receive 命令)。
根据用于创建快照流的 zfs send 选项,将生成不同类型的流格式。
完整流-包含从创建数据集时开始到指定的快照为止的所有数据集内容。
zfs send 命令生成的缺省流是完整流。它包含一个文件系统或卷,直到并包括指定的快照。流不会包含在命令行上指定的快照之外的快照。
增量流-包含一个快照与另一个快照之间的差异。
流数据包是包含一个或多个完整流或增量流的流类型。存在以下三种类型的流数据包:
复制流数据包-包含指定的数据集及其后代。它包括所有的中间快照。如果克隆数据集的源不是在命令行上指定的快照的后代,则该源数据集将不包括在流数据包中。要接收流,源数据集必须存在于目标存储池中。
请考虑以下列表中的数据集及其源。假定它们是按如下所示顺序创建的。
NAME ORIGIN pool/a - pool/a/1 - pool/a/1@clone - pool/b - pool/b/1 pool/a/1@clone pool/b/1@clone2 - pool/b/2 pool/b/1@clone2 pool/b@pre-send - pool/b/1@pre-send - pool/b/2@pre-send - pool/b@send - pool/b/1@send - pool/b/2@send -
使用以下语法创建的复制流数据包:
# zfs send -R pool/b@send ....
包含以下完整流和增量流:
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@pre-send - incr pool/b@send pool/b@pre-send incr pool/b/1@clone2 pool/a/1@clone incr pool/b/1@pre-send pool/b/1@clone2 incr pool/b/1@send pool/b/1@send incr pool/b/2@pre-send pool/b/1@clone2 incr pool/b/2@send pool/b/2@pre-send
在上面的输出中,pool/a/1@clone 快照未包括在复制流数据包中。因此,只能在已具有 pool/a/1@clone 快照的池中接收此复制流数据包。
递归流数据包-包含指定的数据集及其后代。与复制流数据包不同,除非中间快照是流中包括的克隆数据集的源,否则将不包括它们。缺省情况下,如果数据集的源不是在命令行上指定的快照的后代,则行为类似于复制流。但是,下面所述的自包含递归流在创建过程中不存在外部依赖项。
使用以下语法创建的递归流数据包:
# zfs send -r pool/b@send ...
包含以下完整流和增量流:
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@send - incr pool/b/1@clone2 pool/a/1@clone incr pool/b/1@send pool/b/1@clone2 incr pool/b/2@send pool/b/1@clone2
在上面的输出中,pool/a/1@clone 快照未包括在递归流数据包中。因此,只能在已具有 pool/a/1@clone 快照的池中接收此递归流数据包。此行为与上面所述的复制流数据包情况类似。
自包含递归流数据包-不依赖于流数据包中未包括的任何数据集。此递归流数据包是使用以下语法创建的:
# zfs send -rc pool/b@send ...
包含以下完整流和增量流:
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@send - full pool/b/1@clone2 incr pool/b/1@send pool/b/1@clone2 incr pool/b/2@send pool/b/1@clone2
可以看到,该自包含递归流具有 pool/b/1@clone2 快照的完整流,这使得接收没有外部相关项的 pool/b/1 快照成为可能。