如何用收到的快照替换 btrfs 根子卷?

如何用收到的快照替换 btrfs 根子卷?

我想将现有的全磁盘 btrfs(未分区)文件系统转换为 bcache。
为此,我需要移动数据并重新格式化驱动器。
我有足够的硬盘空间,只需几个步骤即可完成此操作。

由于我使用的是 btrfs,我认为btrfs send并且btrfs receive会让这变得容易。

我已经创建了我想要首先转换的文件系统的只读快照,并开始将其发送到另一个文件系统中的子卷中。

我不清楚的是,一旦发生超级块转换,我将如何将该重复的子卷恢复到原始磁盘。

联机btrfs receive帮助页表明它只能创建新的子卷,并且一旦该过程完成,它也会使它们只读。

那么如何从收到的快照中替换新的可写根子卷呢?

答案1

那么如何从收到的快照中替换新的可写根子卷呢?

你不能。

在您的情况下,顶级(根)子卷(ID 5)是/您的 Linux 文件系统的;没有任何东西可以与其相邻。正如您所发现的,btrfs-receive创建一个只读子卷,因此您需要做的是从只读子卷创建一个读写快照子卷,为此您需要能够在外部创建一个子卷/;这就是为什么你不能替换顶级子卷的原因。

请注意,您说:

我创建了一个只读快照FS我想先转换并开始将其发送到子卷在另一个fs中。

不过,您所做的是创建一个只读快照子卷,而不是整个 BTRFS 文件系统。我不明白你如何能够创建顶层的快照。诡异的。

最好的选择是使用诸如partclone备份整个文件系统之类的工具,然后从中恢复。否则,您必须更改子卷布局平坦的,这就是你所拥有的嵌套的。使用嵌套布局,您将得到如下所示的内容:

/ (top-level)
|
|__ /rootfs (subvolume)
|   |
|   _/home
|
|__ /rootfs-backup (read-only subvolume, which you can delete later)
|   |
|   _/home

嵌套布局使您能够创建文件系统中任何子卷的快照(顶层除外,您无论如何都不需要这样做)。然后您只需将rootfs子卷挂载到 上/,而不是整个文件系统。例如:mount -t btrfs /dev/sda1 -o defaults,subvol=/rootfs

答案2

无论我收到什么,都将是一个新的只读子卷,这就是 Btrfs 的工作原理。正如伊曼纽尔在另一个答案中暗示的那样,可能没有一种干净直观的方法来以不同的方式做到这一点。

以下是使接收到的子卷充当根卷的步骤:

cd /mnt/drv/receivedvolume
btrfs property set -ts . ro false # make it writeable
btrfs subvolume list . # take note of the ID of the volume, i'll use 123 here
btrfs subvolume set-default 123 /mnt/drv

此外,为了更加安心,可以添加subvolid=123安装选项/etc/fstab或任何其他安装作业。

如果这实际上是系统的/,则可能需要重新安装引导加载程序

相关内容