我使用ZFS运行FreeBSD主机。
假设我正在使用zfs send在远程主机上存储一系列增量式ZFS快照映像:
zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago > /nfs/backups/foo.zfs
或者,也许我想通过FTP服务器发送stream:
% ftp backup ftp> put "| zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago" /backups/foo.zfs
我想validation这个远程图像。 我想要打印此图像中的快照列表,或者select性地提取校验和或其他元数据,以帮助检查图像是否有效并包含像我期望的那样的快照。
我如何查询图像文件,看看里面是什么?
我已经尝试使用-nv ( no-op和verbose )标志zfs receive以列出映像中的快照,但这可能不适用于实时系统:
# 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
更新的ZFS版本提供了一个名为zstreamdump的命令,它可以从使用zfs send创build的stream (或图像) 提供可读的信息 。
这是一个使用命令行的例子:
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创build的增量快照,但这可能是我想要的。
我认为你的-nv方法的问题是,在用-n接收时不会创build中间文件系统,因此它每次都会失败,而没有no-op标志的情况下它将工作(但是扩展整个文件系统可能需要很长时间)。 不幸的是,大多数文档/博客在线不使用这个标志,因此他们从来没有像你(和我)一样经历这个错误。
另外还有一个来自Solaris内部ZFS最佳实践指南的警告:
如果您将ZFS发送stream存储在文件或磁带上,并且该文件已损坏,则无法接收该文件,并且所有数据都不可恢复。 但是,内build的build 125添加了zstreamdump(1m)命令来validationZFS快照发送stream。 另请参阅RFE 6736794。
特别是对于大数据集,这意味着三件事情:
zfs list -r和zfs diff 。 -v开关按预期工作,可以很容易地parsing。