我正在用新磁盘替换一些故障磁盘,而不是逐个替换它们,我在新磁盘上创建了一个新的 ZFS 池,并将旧池复制到新池。我在池级别执行此操作,以便复制池中的所有卷。
# zfs snapshot -r oldpool@moving
# zfs send -R oldpool@moving | zfs recv -F -v newpool
这有效,我现在有了@moving
新池的快照:
# zfs list -t snapshots
oldpool@moving
oldpool/vol1@moving
oldpool/vol2@moving
newpool@moving
newpool/vol1@moving
newpool/vol2@moving
现在我已经可以看到挂载点中的所有文件newpool
,甚至可以修改它们,即使它们来自快照(我读到的所有内容都说快照是只读的,必须克隆才能变为可写,所以我不确定是否zfs recv
已经创建了快照的克隆或什么)。
所以我想知道如何丢弃newpool@moving
快照并将该状态提升为新池(即根本没有快照的基本状态)。
我尝试克隆快照,但这似乎只是将快照移动到了不同的路径:
# zfs clone newpool@moving newpool/clone
# zfs promote newpool/clone
# zfs destroy newpool@moving
could not find any snapshots to destroy; check snapshot names.
# zfs list -t snapshots
oldpool@moving
oldpool/vol1@moving
oldpool/vol2@moving
newpool/clone@moving # was newpool@moving
newpool/vol1@moving
newpool/vol2@moving
它似乎已经重命名了顶层卷和快照(但没有重命名其中的任何子卷),并将其保留为快照,而不是将其变成“没有快照的基本卷”。
在事情变得更糟之前,我遗漏了什么?如何通过将所有内容合并到基础卷中来消除快照newpool
,以便它反映出oldpool
我拍摄快照之前的状态,以便将其复制到newpool
?
答案1
我认为我已经解决了这个问题。最初的情况(在我搞砸之前zfs clone
)是复制了文件系统并创建了匹配的快照以协助将来的增量更新(使用zfs send -i
)。就好像文件已被复制然后创建了快照,这意味着任何后续更改都会转移到底层文件系统,并且我可以根据需要将这些更改回滚到快照(就像我在其中创建原始快照的源池一样)。
因为我不需要这个,所以我所要做的就是删除快照:
# zfs destroy -v -r newpool@moving
# zfs destroy -v -r oldpool@moving
现在这两个池子一模一样了。
然而在这种情况下,我首先必须修复我用 造成的混乱zfs promote
。这将数据集根提升为克隆,从而有效地改变了这个结构:
newpool
|
+-- vol1
|
+-- vol2
进入这个结构:
newpool
|
+-- clone
|
+-- vol1
|
+-- vol2
解决方案是撤消克隆的提升,我设法这样做:
# zfs snap -r newpool@s1 # Not sure if this is actually needed or not
# zfs promote newpool
一旦完成,一切都接近于参数之后的样子zfs recv
,我只需要像平常一样删除克隆(zfs destroy newpool/clone
)和额外的@s1
快照。