【发布时间】: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 检查它会显示预期的来源。它是十六进制的,但0x9b5a943fae511b1d 是11194422825011190557:
$ 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
问题
我对@987654353@-参数的解释正确吗?
为什么没有按预期工作?
如果这是错误的方法,我该如何创建备份并恢复克隆的 zfs 文件系统?
非常感谢您的阅读和帮助!
【问题讨论】: