通过 cli 访问 zfs 数据集的校验和

Kon*_*ele 5 checksum zfs

是否可以读取/访问 zfs 数据集的校验和?我想访问它以验证它在靴子之间没有改变。阅读https://en.wikipedia.org/wiki/ZFS#ZFS_data_integrity:是否可以从用户空间访问像 zfs 中的校验和方案一样的 Merkle 树的最高校验和?

Dan*_*Dan 2

有一个(主要针对开发人员)工具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/
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    上面的示例显示存在大量差异 - 类似WRITEFREEOBJECT或 之类的内容FREEOBJECTS表示与原始快照相比的更改。