识别同一个文件的两个ZFS快照之间更改的字节数

假设我有一个包含虚拟机磁盘映像的ZFS文件系统,例如

/tank/examplevm/examplevm-flat.vmdk 

让我们进一步假设我每天拍摄那个ZFS文件系统的快照,例如

 $ zfs snapshot tank@20120716 $ zfs snapshot tank@20120717 

显然,在每个每日快照之间的时间段内,对我的examplevm-flat.vmdk进行了更改(大多数情况下,图像的大小保持不变,但虚拟磁盘中的块被修改)。

因此,ZFS diff命令现在将报告在两个快照之间修改的文件:

 $ zfs diff tank/@20120716 tank@20120717 M /tank/examplevm/examplevm-flat.vmdk 

虽然知道该文件已被修改是一件好事,但我更感兴趣的是在vmdk中修改过的字节数/块数。

因此,我会对以下问题的任何提示感兴趣:

  • ZFS是否有任何function报告两个快照之间的特定文件中更改的块的数量?
  • 是否有任何其他工具,将二进制比较两个文件系统的图像,并报告更改块或字节的数量? 我意识到cmp –l file1 file2 | wc –l cmp –l file1 file2 | wc –l做到这一点,但是这是可怕的,可怕的缓慢。

然而,ZFS没有特性可以报告,可以使用未logging的zdb工具来获取特定数据集(文件系统或快照)中某个文件所使用的块,因此通过一点脚本来实现您的目标是可行的,尽pipe处理zdb输出可能需要很长时间。

这是一个博客,展示如何使用zdb来提取文件的块。