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

fad*_*bee 8 zfs

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

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

zfs send -i bpool/backups@2018-09-04 bpool/backups@2018-09-05 | ssh receiver /sbin/zfs receive bpool/backups
Run Code Online (Sandbox Code Playgroud)

将最新的 bpool/备份从发送方发送到接收方。(日期每晚自动生成。)

如果某人(在接收器上)只做以下事情:

cd /bpool/backups
ls
Run Code Online (Sandbox Code Playgroud)

它破坏了夜间备份作业,并出现以下错误:

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
Run Code Online (Sandbox Code Playgroud)

(我认为这是因为更新了 atime,或类似的原因。)

我怎样才能阻止这种情况发生?(如果我将receiver:/bpool/backups 设置为只读,接收将如何工作?)

Joh*_*ith 7

您确实可以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


小智 6

zfs recv -F将强制接收数据集回滚到之前接收到的快照。关闭 atime 只会解决人们检查备份上的文件的问题,但如果有任何其他更改,您将需要使用 -F 标志。