我每天都会使用 zfs send/receive 将 zfs 文件系统复制到另一台服务器。工作流程是标准的发送接收:
# 1. create snapshot on source
zfs snapshot ${source_fs}@${today}
# 2. send incremental update from yesterday to today to target
zfs send -i ${one_day_ago} ${source_fs}@${today} | ssh user@${target_host} "zfs receive ${target_fs}"
# 3. destroy old snapshots from two days ago on source and target
zfs destroy ${source_fs}@${two_days_ago}
ssh user@${target_host} "sudo zfs destroy ${target_fs}@${two_days_ago}"
一段时间内,这种方法运行良好。但是,现在我收到以下错误zfs receive
:
cannot receive incremental stream: destination pool/filesystem has been modified since most recent snapshot
zfs list -t snapshot
目标上USED
的最新快照列中显示一个小值(大约 100K)。这应该是零。文件系统未安装在目标上。
我有一个检查 zpools 和 zfs 配额的脚本。查询当前配额(使用zfs userspace $filesystem -pH -o name,used,quota -s used
)似乎会修改文件系统。这是意料之中的事吗?我不明白为什么查询某些数字会修改文件系统。
我使用来自 Ubuntu 存储库的 Ubuntu 20.04 和 OpenZFS 0.8.3。
答案1
未挂载的 zfs 文件系统不能被任何操作修改,除了接收/销毁和……(好吧,这几乎是所有操作)请求。任何有关文件系统统计信息的 zfs 请求都不应修改 fs 内容。因此,最后,我非常怀疑这zfs userspace
正在修改某些内容(我怀疑您的 zfs 数据集是否已卸载)。但如果我错了(关于zfs userspace
),这显然是一个错误,而且是一个很大的错误。