我想将现有的全磁盘 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
或任何其他安装作业。
如果这实际上是系统的/,则可能需要重新安装引导加载程序