同时挂载两个 btrfs 子卷

Man*_*our 4 linux btrfs

这是最近的 linux 内核的假设设置:

/dev/sda1 is formatted as btrfs
Run Code Online (Sandbox Code Playgroud)

然后我运行以下命令在 /dev/sda1 的根目录上创建两个子卷:

$ mount /dev/sda1 /mnt
$ btrfs subvolume create /mnt/a
$ btrfs subvolume create /mnt/b
$ umount /mnt
Run Code Online (Sandbox Code Playgroud)

现在我希望在两个不同的挂载点上同时挂载这两个子卷:

$ mount -o subvol=a /dev/sda1 /a
$ mount -o subvol=b /dev/sda1 /b
Run Code Online (Sandbox Code Playgroud)

这就是问题所在。我用一个文件作为块设备(使用循环)尝试了这个,它工作正常(至少对于每个文件中的两个文件)。但是,在安装了一个完整的系统后,将根目录放在一个子卷中,将主目录放在另一个子卷中,在启动时都挂载,我收到一个错误,告诉我底层设备是“写保护的”,并且第一次尝试读取主目录目录内容导致内核崩溃。

我想知道我想要做什么(使用不同的挂载选项多次挂载一个块设备)实际上是否被 btrfs 或 os.

小智 5

您可以定义子卷 a 作为默认的根。
在这种情况下,它将自动挂载而不是 btrfs 根目录。

假设你的 btrfs 树看起来像这样

/
|
|----a(包含/目录的子卷)
|
|----b(包含主目录的子卷)

为了将 a 设置为默认值:

mount /dev/sda1 /mnt
btrfs subvolume create /mnt/a
btrfs subvolume set-default /mnt/a
Run Code Online (Sandbox Code Playgroud)

现在你可以挂载你的 btrfs 文件系统,然后是子卷 b

mount -o defaults /dev/sda1 /a
mount -o defaults,subvol=b /dev/sda1 /b
Run Code Online (Sandbox Code Playgroud)