我有两台机器,“发送者”和“接收者”。
发件人每晚运行以下命令:
zfs send -i bpool/backups@2018-09-04 bpool/backups@2018-09-05 | ssh receiver /sbin/zfs receive bpool/backups
将最新的 bpool/backups 从发送者发送到接收者。(日期每晚自动生成。)
如果有人(在接收器上)做的很少:
cd /bpool/backups
ls
它破坏了每晚的备份作业,并出现以下错误:
root@sender:~# zfs send -i bpool/backups@2018-09-04 bpool/backups@2018-09-05 | ssh recevier /sbin/zfs receive bpool/backups
cannot receive incremental stream: destination bpool/backups has been modified
since most recent snapshot
warning: cannot send 'bpool/backups@2018-09-04': Broken pipe
(我认为这是因为更新时间或类似情况。)
我怎样才能阻止这种情况发生?(如果我将接收器:/bpool/backups 设为只读,接收将如何工作?)
zfs recv -F
将强制接收数据集回滚到之前接收到的快照。关闭 atime 只会解决人们检查备份文件的问题,但如果有任何其他更改,您将需要使用 -F 标志。关闭访问时间更新就足够了:
您确实可以将目标数据集设置为只读(通过
readonly=on
直接在目标数据集或其父数据集之一上设置 zfs 属性)。这不会妨碍您接收更新的快照,因为readonly
对于数据集仅意味着您无法更改其中的文件(、目录和属性)。readonly=on
这与导入池时的设置不同。使用池readonly
意味着,该 IO 无法将任何内容写入池的后端。我对接受的答案不太满意,因为从原则上讲,任何人都不应该对本来只能接收的数据集进行任何更改。
我反对切换的另一个原因是,
-F
当您收到增量快照zfs send -i data@older-snap data@newer-snap
数据(设计您的服务总是好的,以便它们在遇到意外情况时失败(并报告错误)(而不是仅仅忽略错误)。-F
对于备份池/数据集,您可能还想设置
atime=off
,因为这也与其目的相矛盾。编辑:啊,应该补充一点,您可以通过使用仅在接收数据集上设置这些属性(如果它们直接在源数据集中设置,则会被覆盖)
zfs receive -o atime=off -o readonly=on
就个人而言,我更喜欢直接将快照挂载为只读,这样我们甚至不会通过构造来修改快照。
如果您使用的是加密数据集,请首先运行以下命令来加载密钥:
然后挂载它,例如如下(不需要
-o ro
选项):但是如果发生修改,确实
zfs recv -F
非常实用(我只是有点害怕丢失数据,-F
所以我更喜欢这种方法)。