通过 cli 访问 zfs 数据集的校验和
Access checksum of zfs dataset via cli
是否可以read/access zfs 数据集的校验和?我想访问它以验证它在引导之间没有变化。
正在阅读 https://en.wikipedia.org/wiki/ZFS#ZFS_data_integrity:是否可以从用户空间访问 zfs 中类似校验和方案的 Merkle 树的顶部校验和?
有一个名为 zdb
的工具(主要针对开发人员)可以执行此操作。它很难使用,而且它的格式并不总是向后兼容:-)
但是,如果您只想确保文件系统未更改,则可以为此目的使用快照。首先,在您想要稍后与 zfs snapshot <pool>/<fs>@<before-reboot-snap>
进行比较的点创建一个快照。然后有两种不同的方法可以稍后将文件系统与该快照进行比较:
重启后,运行zfs diff <pool>/<fs>@<before-reboot-snap> <pool>/<fs>
。这将向您显示快照和当前文件系统之间的 "diffs" 列表:
# 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/
请注意,即使我删除了新文件,它所在的目录仍标记为已修改。
重新启动后拍摄另一个快照,然后使用 zfs send -i @<before-reboot-snap> <pool>/<fs>@<after-reboot-snap>
创建这些快照之间发生的所有更改的流,并使用另一个名为 [=16= 的工具对其进行分析]:
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)
上面的示例显示存在大量差异——任何类似 WRITE
、FREE
、OBJECT
或 FREEOBJECTS
的内容都表示从原始快照.
是否可以read/access zfs 数据集的校验和?我想访问它以验证它在引导之间没有变化。 正在阅读 https://en.wikipedia.org/wiki/ZFS#ZFS_data_integrity:是否可以从用户空间访问 zfs 中类似校验和方案的 Merkle 树的顶部校验和?
有一个名为 zdb
的工具(主要针对开发人员)可以执行此操作。它很难使用,而且它的格式并不总是向后兼容:-)
但是,如果您只想确保文件系统未更改,则可以为此目的使用快照。首先,在您想要稍后与 zfs snapshot <pool>/<fs>@<before-reboot-snap>
进行比较的点创建一个快照。然后有两种不同的方法可以稍后将文件系统与该快照进行比较:
重启后,运行
zfs diff <pool>/<fs>@<before-reboot-snap> <pool>/<fs>
。这将向您显示快照和当前文件系统之间的 "diffs" 列表:# 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/
请注意,即使我删除了新文件,它所在的目录仍标记为已修改。
重新启动后拍摄另一个快照,然后使用
zfs send -i @<before-reboot-snap> <pool>/<fs>@<after-reboot-snap>
创建这些快照之间发生的所有更改的流,并使用另一个名为 [=16= 的工具对其进行分析]: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)
上面的示例显示存在大量差异——任何类似
WRITE
、FREE
、OBJECT
或FREEOBJECTS
的内容都表示从原始快照.