如何验证驻留在备份系统上的 ZFS 快照映像?

如何验证驻留在备份系统上的 ZFS 快照映像?

我正在运行带有 ZFS 的 FreeBSD 主机。

假设我正在使用以下方式在远程主机上存储一系列增量 ZFS 快照映像zfs send

zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago > /nfs/backups/foo.zfs

或者也许我想通过 FTP 服务器发送流:

% ftp backup
ftp> put "| zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago" /backups/foo.zfs

我想验证此远程映像。我想打印此映像中的快照列表,或者选择性地提取校验和或其他元数据,以帮助检查映像是否有效并包含我预期的快照。

我如何查询图像文件并查看里面的内容?

我曾尝试zfs receive使用-nvno-opverbose)标志列出图像中的快照,但这可能不适用于实时系统:

# zfs receive -nv zpool < /nfs/backups/foo.zfs
cannot receive new filesystem stream: destination 'zpool' exists
must specify -F to overwrite it
# zfs receive -nv -F zpool < /nfs/backups/foo.zfs
cannot receive new filesystem stream: destination has snapshots (eg. zpool@09hoursago)
must destroy them to overwrite it

答案1

ZFS 的较新版本提供了一个名为的命令zstreamdump,可以从流中提供人类可读的信息(或图像)使用创建zfs send

这是使用命令行的示例:

host # zstreamdump < foo.zfs 
BEGIN record
    ...
    toname = zpool/data/foo@04hoursago
    END checksum = 123123123123123123/123123123123123123/asdasdasdasdasd/zxczxczxczxczxc
    ...
    Total write size = 54784 (0xd600)

以下是来自 FTP 的一个例子:

ftp> get /backups/foo.zfs "| zstreamdump"
BEGIN record
 hdrtype = 1
 ...
 toname = zpool/data/foo@04hoursago
 END checksum = 123123123123123123/123123123123123123/asdasdasdasdasd/zxczxczxczxczxc
 ...

这为我提供了实际快照的名称以及该快照的校验和。当然,它不会为我提供快照内的文件列表,因为该信息存在于不同的层。

我实际上还没有在使用创建的增量快照上尝试过这一点zfs send -i,但这可能就是我想要的。

答案2

我认为你的方法的问题-nv在于,在使用 接收时不会创建中间文件系统-n,因此每次都会失败,而没有 no-op 标志时它可以工作(但扩展完整的文件系统可能需要很长时间)。不幸的是,大多数在线文档/博客都不使用此标志,因此他们从未像你(和我)那样遇到过此错误。

另外还有一句警告Solaris Internals ZFS 最佳实践指南

如果您将 ZFS 发送流存储在文件或磁带上,并且该文件已损坏,则将无法接收它,并且任何数据都无法恢复。但是,Nevada 版本 125 添加了 zstreamdump(1m) 命令来验证 ZFS 快照发送流。另请参阅 RFE 6736794。

特别是对于大型数据集来说,这意味着三件事:

  • 如果您的流存储在您不信任位安全性的存储器中,您几乎需要一直进行检查,并且仍然面临单个位错误抹去整个备份的风险。
  • 如果您的流位于您信任的存储上(例如,在作为 NFS 导出的 ZFS 卷上),那么您就相对安全,但您会错过zfs list -rzfs diff
  • 如果您可以访问本机存储(例如,通过 SSH 访问的 ZFS 卷),则可以扩展接收的文件系统并使用上述工具。在这种情况下,交换机也能-v按预期工作,并且可以轻松解析。

相关内容