【问题标题】:Access checksum of zfs dataset via cli通过 cli 访问 zfs 数据集的校验和
【发布时间】:2017-04-26 21:03:18
【问题描述】:

是否可以读取/访问 zfs 数据集的校验和?我想访问它以验证它在引导之间没有变化。 阅读https://en.wikipedia.org/wiki/ZFS#ZFS_data_integrity:是否可以从用户空间访问类似于 zfs 中的校验和方案的 Merkle 树的顶部校验和?

【问题讨论】:

  • 我希望您不要认为每次系统重新启动时 ZFS 都会重新计算 ZFS 文件系统中所有文件的校验和。即使确实如此,您会将校验和与什么进行比较?如果你随后发现了不同之处,你怎么知道你保存的校验和是正确的值?
  • 不,我希望有一些不断更新的竞争数据集的校验和。可以提供“dd if=/dev/sda of=/tmp/a ; md5sum /tmp/a”的功能,但不是在整个高清上进行校验和,而是可能有一个不断更新的校验和。我问这个是因为我记得一些幻灯片显示了分层更新的校验和。
  • en.wikipedia.org/wiki/ZFS#ZFS_data_integrity 我想问题是天气可以从用户空间访问 Merkle Tree 顶部校验和。
  • zdb -uuu poolname 是否为您提供了足够的信息?我想你可以在之后阅读特定的块。如果您知道要查找的内容,也许 ZFS 源代码也会有所帮助。
  • 不确定“zdb -uuu”的 chsum 实际反映了什么。即使它包含的所有数据集都标记为只读并且除了安装数据集之外我不访问任何文件,chsum 条目似乎在重新启动之间发生了变化。我幼稚的想法会假设 chsum 是持久的,并且将数据集标记为只读会保护它,但也许元数据还是会被写入。反正rdb是个有趣的工具……

标签: checksum zfs


【解决方案1】:

有一个名为zdb 的工具(主要面向开发人员)可以做到这一点。它很难使用,而且它的格式并不总是向后兼容:-)

但是,如果您只想确保文件系统没有更改,则可以为此目的使用快照。首先,在您想稍后与zfs snapshot <pool>/<fs>@<before-reboot-snap> 比较的位置创建一个快照。然后有两种不同的方法可以稍后将文件系统与该快照进行比较:

  1. 重启后,运行zfs diff <pool>/<fs>@<before-reboot-snap> <pool>/<fs>。这将显示快照和当前文件系统之间的“差异”列表:

    # ls /tank/hello
    file1  file2  file3  file4  file5
    # zfs snapshot tank/hello@snap
    # zfs diff tank/hello@snap tank/hello
    # touch /tank/hello/file6
    # zfs diff tank/hello@snap tank/hello
    M       /tank/hello/
    +       /tank/hello/file6
    # rm /tank/hello/file6
    # zfs diff tank/hello@snap tank/hello
    M       /tank/hello/
    

    请注意,即使我删除了新文件,它所在的目录仍然标记为已修改。

  2. 重新启动后拍摄另一个快照,然后使用zfs send -i @<before-reboot-snap> <pool>/<fs>@<after-reboot-snap> 创建这些快照之间发生的所有更改的流,并使用另一个名为zstreamdump 的工具对其进行分析:

    zfs send -i @snap tank/hello@snap2 | zstreamdump
    BEGIN record
            hdrtype = 1
            features = 4
            magic = 2f5bacbac
            creation_time = 59036f98
            type = 2
            flags = 0x4
            toguid = 2f080aca53bff68e
            fromguid = 66a1da82cd5f1571
            toname = tank/hello@snap2
    END checksum = 91043406e5/38f3c4043049b/ed0867661876670/1e265bea2b6c3315
    SUMMARY:
            Total DRR_BEGIN records = 1
            Total DRR_END records = 1
            Total DRR_OBJECT records = 12
            Total DRR_FREEOBJECTS records = 5
            Total DRR_WRITE records = 1
            Total DRR_WRITE_BYREF records = 0
            Total DRR_WRITE_EMBEDDED records = 0
            Total DRR_FREE records = 17
            Total DRR_SPILL records = 0
            Total records = 37
            Total write size = 512 (0x200)
            Total stream length = 13232 (0x33b0)
    

    上面的示例表明存在大量差异——WRITEFREEOBJECTFREEOBJECTS 之类的任何内容都表示与原始快照的更改。

【讨论】:

  • 好吧,也许快照可以提供足够的信心。我试图从 zdb 中获取一些有用的信息,但找不到一个只有在写入某些内容时才会改变的神奇数字。不了解 zfs heather 的内部结构,所以我实际上不知道我应该寻找什么。
  • 是的,zdb 几乎是难以理解的,除非您是一名 ZFS 开发人员,并且已经花费了大量时间使用磁盘格式。这就是为什么我建议改用其中一种快照方法。
  • 鉴于所有的“这是纯粹的魔法!!!”炒作 Sun 在早期就发布了 ZFS,当zdb 发布时,我真的很惊讶,所以我并不惊讶它仍然坚不可摧。 (请记住诸如“ZFS 在磁盘上始终一致,因此没有fsck 或调试工具将永远需要!!!”?嗯,是的,当然。几乎我们所有 Sun/Solaris 社区的人都笑得很开心...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2018-12-18
  • 1970-01-01
  • 2014-10-03
  • 2018-05-22
  • 1970-01-01
相关资源
最近更新 更多