如何阻止人们干扰仅用于接收的 ZFS 数据集?

如何阻止人们干扰仅用于接收的 ZFS 数据集?

我有两台机器,“发送器”和“接收器”。

发送者每晚运行以下命令:

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所以这就是我更喜欢这种方法的原因)。

相关内容