如何在复制后用快照替换 ZFS 池根

如何在复制后用快照替换 ZFS 池根

我正在用新磁盘替换一些故障磁盘,而不是逐个替换它们,我在新磁盘上创建了一个新的 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快照。

相关内容