如何被动检查 ZFS 发送流的内容?

rui*_*ief 2 zfs zfsonlinux

我有一些存储的 ZFS“发送流”(即,它们是通过将输出重定向zfs send到文件来创建的)。我想检查这些流的内容而不接收它们并将它们写入文件系统 - 例如,我想查看流中的文件名列表。有没有办法做到这一点?

我已经做了一些阅读和搜索,但没有找到任何看起来像我在说什么的东西。我在ZFS 的 Linux实现中同时使用FreeBSD和ZFS。

kwo*_*orr 5

您可以通过将它们zstreamdump -d传送到 中来获取一些信息,但这不会直接提供有关文件名的任何信息,因为流中没有文件。流是块中描述的两棵树之间的绝对差异。但是代码是公开的,所以如果您设法添加 ZFS 结构检测和解析,您可以从中获得更多。

ZFS 内部结构内部一棵树,所有操作都在该树上完成。文件、目录、文件名、属性和其他一切都只是该树中的数据。快照、卷和 FS 是树根,当您拍摄另一个快照时,您只是将当前根存储在某处。实时系统正在为每个事务生成新的根,不断地远离旧的根,同时保持大量数据从前一棵树“离开”完好无损。流表示应该在树 A 上执行以变为 B 的操作列表。

我只是想说,您可能看不到流中要查找的数据,因为它们不需要在那里。当文件被删除时,相应的块就会被释放,所以你无法知道文件名或内容是什么。当文件被更改时,它由对象 ID 引用,因此即使文件从头开始重写但目录条目尚未更新,您也不会从流中获得任何内容。

如果流不是差分流,或者您有一些关于其先前状态的数据,那么您将很幸运。但这只是因为完整的流将空根转换为目标树,从而包含所有必需的数据。因此,您可以将块解析代码添加到zstreamdump以检测和处理 ZFS 内部数据。

  • 它确实显示文件名,但您需要自己在转储的数据中找到它们。 (2认同)