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

Ste*_*ski 7 backup zfs

我正在使用 ZFS 运行 FreeBSD 主机。

让我们假设我正在使用zfs send以下命令在远程主机上存储一系列增量 ZFS 快照图像:

zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago > /nfs/backups/foo.zfs
Run Code Online (Sandbox Code Playgroud)

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

% ftp backup
ftp> put "| zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago" /backups/foo.zfs
Run Code Online (Sandbox Code Playgroud)

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

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

我已尝试zfs receive使用-nv(no-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
Run Code Online (Sandbox Code Playgroud)

Ste*_*ski 7

更现代的 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)
Run Code Online (Sandbox Code Playgroud)

以及来自 FTP 的示例:

ftp> get /backups/foo.zfs "| zstreamdump"
BEGIN record
 hdrtype = 1
 ...
 toname = zpool/data/foo@04hoursago
 END checksum = 123123123123123123/123123123123123123/asdasdasdasdasd/zxczxczxczxczxc
 ...
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你在一篇文章中教会了我两件事。验证 zfs 转储并将 ftp 文件存储到管道中。在忘记如何做之后,我会记得这一天很长时间:) (2认同)