zfs received -F 做什么?

zfs received -F 做什么?

当我阅读时,man zfszfs receive看到

     -F      Force a rollback of the file system to the most recent snap-
             shot before performing the receive operation. If receiving an
             incremental replication stream (for example, one generated by
             "zfs send -R -Fi -iI"), destroy snapshots and file systems
             that do not exist on the sending side.

但我不太明白-F实际上会做什么。

如果我zfs receive tank/pool那么接收的快照就会在目标端文件系统上回滚,这正是我想要的。

我想在什么情况下使用-F

答案1

如果您在接收目标数据集后对其进行了修改,则 -F 开关会派上用场。一旦对其进行了任何更改(包括执行目录列表等无害操作,因为这有时会更改),它就不再处于初始传输后的状态。尝试zfs receive从另一方创建的增量数据流运行纯文本zfs send -i tank/dataset@old tank/dataset@new将导致错误。在这种情况下,您在接收方有两个选项:

  • 您可以使用以下方式手动恢复到最后一个快照zfs rollback
  • 或者提供-F开关zfs receive让它自动处理

当然,这可能是一种破坏性操作,因此在使用它之前,您必须了解它在做什么。但如果您所做的只是将快照复制到非实时“备份”目的地,而没有其他数据写入您可能会错过,那么它应该是安全的。

答案2

其他人都是 ZFS 方面的专家,如果您还没有看到,我就简单地发布一下。

当文件系统在回滚发生和启动接收之间被修改时,可能需要使用此选项。

从: Solaris - 新的 zfds 接收 -F 选项

答案3

现在已经过去七年了,但我终于可以补充一些内容了。在已接受的答案下方,有一个关于是否zfs receive -F从目标中删除源中不存在的快照的讨论。

来自man zfs(Linux 上带有 ZFS 的 debian buster,在撰写本文时是 vanilla 并且是最新版本),在关于的部分中zfs receive

-F 在执行接收操作之前强制将文件系统回滚到最新的快照。如果接收增量复制流(例如,由 zfs send -R [-i|-I] 生成的复制流),则销毁发送端不存在的快照和文件系统。

据此,如果-F已给予zfs receive,快照如果源中不存在,则在目标处删除当且仅当 -R已由发送方指定。在这种情况下,不仅快照,而且文件系统(如果在源中不存在)也会在目标中被删除。

另外需要说明的是,如果收到的流是完整流(与增量流相反),则会在目标上创建一个新的文件系统。这相当于首先销毁目标上的文件系统(如果该文件系统存在),然后重新创建它,这当然也会删除所有现有快照和后代文件系统。

摘自man zfs

创建一个快照,其内容与标准输入提供的流中指定的一致。如果收到完整的流,则还会创建一个新的文件系统。流是使用 zfs send 子命令创建的,默认情况下会创建一个完整的流。

相关内容