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
拉取映像并zones/[IMAGE]
使用快照创建相应的 zfs 文件系统,作为重新创建的区域文件系统的克隆源zones/[ZONE]
。
所以结构和崩溃前一样:
$ zfs list -r -o name,origin zones/[ZONE]
NAME ORIGIN
zones/[ZONE] zones/[IMAGE]@[ZONE]
然而,图像快照(由 创建)的 guidvmadm
是不同的 - 正如预期的那样。流期望0x9b5a943fae511b1d
(或11194422825011190557
),但实际上是12464070312561851369
:
: zfs list -r -o name,guid zones/[IMAGE]
NAME GUID
zones/[IMAGE] 5616748063181666458
[...]
zones/[IMAGE]@[ZONE] 12464070312561851369
[...]
这就是 - 我想 --o origin=
参数的zfs recv
来源。
问题
通过接收 zfs 流恢复实际数据,最终会出现错误:
$ zfs recv -vF zones/[ZONE] < [ZONE]_[DATE].zfs
cannot receive: local origin for clone zones/[ZONE]@[SNAP0] does not exist
(SNAP0
备份文件系统的第一个快照在哪里,请参阅上面的“前提条件”)
这是意料之中的,因为指南发生了变化。因此,我使用新的 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
问题
我对-o origin=
-parameter 的解释是否正确?
为什么没有按预期工作?
如果这是错误的方法,我该如何创建备份并恢复克隆的 zfs 文件系统?
非常感谢阅读和帮助!