无法解释rsync后引用的zfs

无法解释rsync后引用的zfs

我有一台老化的 Centos NFS 服务器,其中包含一些不同的 ZFS 数据集。我一直在使用 rsync 将数据迁移到较新的 NFS 服务器。新服务器也是 Centos ZFS 主机。我的问题是,对于一个数据集,新旧服务器之间的引用大小截然不同,我无法确定原因。

我没有使用压缩或重复数据删除。我预计 zfs 属性是相同的,但我注意到旧主机确实为数据集启用了以下属性(设备、exec 和 setuid)。我发现的唯一区别是 CentOS 和 ZFS 版本:

旧主机:zfs 0.6.5,centos 7.3,zfs列表显示引用2.00T

新主机:zfs 0.7.2 centos 7.4,zfs列表显示引用的1.29T

为了复制数据,我将旧的导出安装到新服务器上并使用以下 rsync 选项:-avhH --delete。查看 df,inode 计数相同,但 df 确实显示已用空间存在很大差异(1.3T 与 2T)。我使用“查找”来构建数据集中所有文件的 csv 及其大小和磁盘使用情况。两台主机之间的行数和大小列的总和相同(大小总和约为 1.29TB) 两台主机之间的磁盘使用量仅略有不同,与 1.3T 密切匹配。我还尝试在旧服务器上运行 lsof 来查看是否有一些未链接的文件消耗了容量差异,但没有任何内容作为“(已删除)”返回...任何其他可能解释差异的想法或建议?

答案1

禁用压缩时,ZFS 不会查找填充零的块(这发生在zio_compress_data()代码中)。因此,在您的旧系统上,磁盘上可能有一堆归零的块。

我不是rsync专家,但我猜这rsync可能不会发送归零块以节省时间/网络带宽。在您的目标系统上,这意味着您最终会使用更少的空间,因为那些清零的块从未被写入。

如果您出于某种原因希望系统彼此精确复制,则可以使用 ZFS 的内置复制工具zfs send(在源系统上)和zfs receive(在目标系统上)。它也更高效,rsync因为它只需要遍历文件系统树中发生更改的部分,而不像rsync它必须检查每个文件的元数据,并读取已更改文件的完整内容,以查看有什么不同。

相关内容