我有两台机器,“发送器”和“接收器”。
发送者每晚运行以下命令:
zfs send -i bpool/backups@2018-09-04 bpool/backups@2018-09-05 | ssh receiver /sbin/zfs receive bpool/backups
将最新的 bpool/备份从发送方发送到接收方。 (日期每晚自动生成。)
如果某人(在接收器上)只做以下事情:
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
(我认为这是因为更新了 atime,或类似的原因。)
我怎样才能阻止这种情况发生? (如果我将receiver:/bpool/backups 设置为只读,接收将如何工作?)
答案1
你确实可以将目标数据集设置为只读(通过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
答案2
zfs recv -F
将强制接收数据集回滚到之前接收到的快照。关闭 atime 只会解决人们检查备份上的文件的问题,但如果有任何其他更改,您将需要使用 -F 标志。
答案3
关闭访问时间更新应该足够了:
zfs set atime=off bpool/backup
答案4
就我个人而言,我更喜欢直接将快照挂载为只读,这样我们甚至不会通过构造来修改快照。
如果您使用的是加密数据集,请首先运行以下命令来加载密钥:
$ sudo zfs load-key -a
然后挂载即可,例如如下(不需要-o ro
选项):
$ mkdir /tmp/zp
$ sudo mount -t zfs zpool_my_passport/backup/2020_Dell_laptop@2021_01_05_-_test_update /tmp/zp/
但如果发生修改,确实zfs recv -F
非常实用(我只是有点担心数据丢失,-F
所以这就是我更喜欢这种方法的原因)。