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]
Run Code Online (Sandbox Code Playgroud)
区域文件系统有几个快照:
$ 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] -
[...]
Run Code Online (Sandbox Code Playgroud)
关于基础映像,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
Run Code Online (Sandbox Code Playgroud)
备份
为了创建区域根目录的备份,我创建了一个快照和一个复制流。
zfs snapshot zones/[ZONE]@[DATE]
zfs send -R zones/[ZONE]@[DATE] > [ZONE]_[DATE].zfs
Run Code Online (Sandbox Code Playgroud)
检查它会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)
[...]
Run Code Online (Sandbox Code Playgroud)
恢复
为了恢复灾难,我使用vmadm createvm 描述的备份(ZONE保留了-uuid)重新创建了该区域。vmadm拉取映像并zones/[IMAGE]使用快照创建相应的 zfs 文件系统,作为重新创建的区域文件系统的克隆源zones/[ZONE]。
所以结构和崩溃前一样:
$ zfs list -r -o name,origin zones/[ZONE]
NAME ORIGIN
zones/[ZONE] zones/[IMAGE]@[ZONE]
Run Code Online (Sandbox Code Playgroud)
然而,图像快照的 guid(由 创建vmadm)是不同的 - 正如预期的那样。流期望0x9b5a943fae511b1d(或11194422825011190557),但实际上是12464070312561851369:
: zfs list -r -o name,guid zones/[IMAGE]
NAME GUID
zones/[IMAGE] 5616748063181666458
[...]
zones/[IMAGE]@[ZONE] 12464070312561851369
[...]
Run Code Online (Sandbox Code Playgroud)
那就是 - 我想 --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
Run Code Online (Sandbox Code Playgroud)
(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
Run Code Online (Sandbox Code Playgroud)
题
我对-o origin=-parameter 的解释是否正确?
为什么不能按预期工作?
如果这是错误的方式,我如何创建备份并恢复克隆的 zfs 文件系统?
非常感谢阅读和帮助!
您似乎偶然发现了一个 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
Run Code Online (Sandbox Code Playgroud)
此后,在最新备份的快照和源中的最新快照之间只需要 -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
Run Code Online (Sandbox Code Playgroud)
另一个相同的错误报告在这里:
https://github.com/openzfs/zfs/issues/10935
| 归档时间: |
|
| 查看次数: |
749 次 |
| 最近记录: |