当我阅读时,man zfs
我zfs 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
答案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 子命令创建的,默认情况下会创建一个完整的流。