【问题标题】:Receive incremental ZFS stream of clone and overwrite origin接收克隆和覆盖源的增量 ZFS 流
【发布时间】:2021-02-02 16:17:56
【问题描述】:

tldr; 我正在尝试接收一个 ZFS 流,该流已被创建为来自克隆文件系统的复制 (-R)。使用zfs recv -o origin=[clone-origin] 只会给出cannot receive: local origin for clone [...] does not exist

前提条件

我有一个 SmartOS 区域 ZFS 文件系统,它是从特定映像克隆的。 (为了更好的可读性,IMAGE-uuid 和 ZONE-uuid 已被替换)

$ zfs list -r -o name,origin zones/[ZONE]
NAME          ORIGIN              
zones/[ZONE]  zones/[IMAGE]@[ZONE]

区域文件系统有多个快照:

$ zfs list -r -t all -o name, origin zones/[ZONE]
NAME                  ORIGIN              
zones/[ZONE]          zones/[IMAGE]@[ZONE]
zones/[ZONE]@[SNAP0]  -
zones/[ZONE]@[SNAP1]  -
zones/[ZONE]@[SNAP2]  -
[...]

关于基础镜像,SmartOS(更好的vmadm)会为新创建的区域创建镜像快照。区域根目录创建为基于此快照的克隆(此处使用 guid 11194422825011190557)。

$ zfs list -r -o name,origin,guid zones/[IMAGE]
NAME                        ORIGIN  GUID
zones/[IMAGE]               -       5616748063181666458
zones/[IMAGE]@[OTHER-ZONE]  -       11174377117517693115
zones/[IMAGE]@[OTHER-ZONE]  -       5587104570997150836
zones/[IMAGE]@[OTHER-ZONE]  -       535244446308996462
zones/[IMAGE]@[OTHER-ZONE]  -       12527420623439849960
zones/[IMAGE]@[ZONE]        -       11194422825011190557
zones/[IMAGE]@[OTHER-ZONE]  -       18143527942366063753
zones/[IMAGE]@[OTHER-ZONE]  -       15066902894708043304
zones/[IMAGE]@[OTHER-ZONE]  -       16574922393629090803
zones/[IMAGE]@[OTHER-ZONE]  -       818178725388359655
zones/[IMAGE]@[OTHER-ZONE]  -       11867824093224114226
zones/[IMAGE]@[OTHER-ZONE]  -       9357513766021831186

备份

为了创建我的区域根目录的备份,我创建了一个快照和一个复制流。

zfs snapshot zones/[ZONE]@[DATE]
zfs send -R zones/[ZONE]@[DATE] > [ZONE]_[DATE].zfs

使用zstreamdump 检查它会显示预期的来源。它是十六进制的,但0x9b5a943fae511b1d11194422825011190557

$ zstreamdump < [ZONE]_[DATE].zfs
BEGIN record
        hdrtype = 2
        features = 4
        magic = 2f5bacbac
        creation_time = 0
        type = 0
        flags = 0x0
        toguid = 0
        fromguid = 0
        toname = zones/[ZONE]@[DATE]
nvlist version: 0
        tosnap = [DATE]
        fss = (embedded nvlist)
        nvlist version: 0
                0xf19ec8c66f3ca037 = (embedded nvlist)
                nvlist version: 0
                        name = zones/[ZONE]
                        parentfromsnap = 0x0
                        origin = 0x9b5a943fae511b1d
                        props = (embedded nvlist)
                        nvlist version: 0
                                devices = 0x0
                                compression = 0x2
                                quota = 0x500000000
                        (end props)
[...]

恢复

为了恢复灾难,我使用 vmadm create 重新创建了区域,并备份了 vm 描述(ZONE-uuid 被保留)。 vmadm 拉取映像并使用快照创建相应的 zfs 文件系统 zones/[IMAGE],作为重新创建的区域文件系统 zones/[ZONE] 的克隆源。

所以结构和崩溃前一样:

$ zfs list -r -o name,origin zones/[ZONE]
NAME          ORIGIN              
zones/[ZONE]  zones/[IMAGE]@[ZONE]

但是,图像快照的 guid(由 vmadm 创建)是不同的 - 正如预期的那样。流需要0x9b5a943fae511b1d(或11194422825011190557),但实际上是12464070312561851369

: zfs list -r -o name,guid zones/[IMAGE]
NAME                  GUID
zones/[IMAGE]         5616748063181666458
[...]
zones/[IMAGE]@[ZONE]  12464070312561851369
[...]

这就是 - 我想 - zfs recv-o origin= 参数出现的地方。

问题

接收zfs流恢复实际数据,报错:

$ zfs recv -vF zones/[ZONE] < [ZONE]_[DATE].zfs
cannot receive: local origin for clone zones/[ZONE]@[SNAP0] does not exist

(其中SNAP0 是备份文件系统的第一个快照,参见上面的“前提条件”)

这是意料之中的,因为 guid 已更改。所以我用新的 guid (12464070312561851369) 将原点强制为图像快照,但错误仍然存​​在:

$ zfs recv -vF -o origin=zones/[IMAGE]@[ZONE] zones/[ZONE] < [ZONE]_[DATE].zfs
cannot receive: local origin for clone zones/[ZONE]@[SNAP0] does not exist

问题

我对@9​​87654353@-参数的解释正确吗?

为什么没有按预期工作?

如果这是错误的方法,我该如何创建备份并恢复克隆的 zfs 文件系统?

非常感谢您的阅读和帮助!

【问题讨论】:

    标签: zfs smartos


    【解决方案1】:

    您似乎偶然发现了一个 ZFS 错误,该错误现在才引起了一些关注。

    如果您可以更改流的创建方式

    -R 标志试图保留通常可能不相关的各种关系,例如父克隆等。没有方便的替代方案只能“发送所有增量直到这个”。相反,你必须做两次传球。这不是vdadm特有的,所以对于一般的ZFS来说,逻辑如下:

    zfs send zones/[ZONE]@[EARLIESTDATE] > [ZONE]_[EARLIESTDATE].zfs
    zfs send -I zones/[ZONE]@[EARLIESTDATE] zones/[ZONE]@[DATE] > [ZONE]_[EARLIESTDATE]-[DATE].zfs
    zfs recv -vF zones/[ZONE] < [ZONE]_[EARLIESTDATE].zfs
    zfs recv -vF zones/[ZONE] < [ZONE]_[EARLIESTDATE]-[DATE].zfs
    

    在此之后,在最新备份的快照和源中的最新快照之间只需要 -I 传递。

    如果你必须恢复已经创建的流

    一个建议的解决方案是使用此处描述的 zfs 的修改变体:

    https://github.com/openzfs/zfs/issues/10135

    不过,请确保您知道这会如何影响您的数据集。那么你的命令就是

    FQ_OVERRIDE_GTND=1 .zfs recv vF -o origin=zones/[IMAGE]@[ZONE] zones/[ZONE] < [ZONE]_[DATE].zfs
    

    另一个相同的错误报告在这里:

    https://github.com/openzfs/zfs/issues/10935

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2011-12-22
      • 2016-03-26
      相关资源
      最近更新 更多