如何正确使用 btrfs 中的子卷?

如何正确使用 btrfs 中的子卷?

过去,我一直使用三个ext4分区来满足我的需求:

  • /dev/sda2/
  • /dev/sda3/home
  • /dev/sda4/mnt/Data

目前,我正在使用带有btrfs文件系统的 Ubuntu 15.04。安装后,我得到了一个大分区,其中包含三个分区:

  • /dev/sda2延长
    • /dev/sda5/
    • /dev/sda6/home
    • /dev/sda7/mnt/Data

当我从实时 USB 浏览这些分区时,发生了一些奇怪的事情:每个分区的根目录都称为@。我怀疑这与名为子卷btrfs

我想充分利用这些子卷。例如,我使用单独的/home分区来简化新安装。这仍然有必要吗?或者我是否可以将每个分区放在一个具有不同子卷的大分区中以实现相同的目的?

答案1

这将取决于你想用磁盘做什么,但就我的情况而言是的我转而使用 btrfs,并且完全按照你说的做了 -使用子卷而不是分区


btrfs 维基百科

btrfs 中的子卷与 LVM 逻辑卷或 ZFS 子卷不同。对于 LVM,逻辑卷本身就是一个块设备(例如,它可以包含任何其他文件系统或容器,如 dm-crypt、MD RAID 等)——而 btrfs 则不是这样。

btrfs 子卷不是块设备(也不能被视为块设备),相反,btrfs 子卷可以被视为 POSIX 文件命名空间。此命名空间可以通过文件系统的顶级子卷访问,也可以在其自身中挂载。

因此,给定一个如下的文件系统结构:

toplevel
+-- dir_1           (normal directory)
|   +-- file_2      (normal file)
|   \-- file_3      (normal file)
\-- subvol_a        (subvolume)
    +-- subvol_b    (subvolume, nested below subvol_a)
    |   \-- file_4  (normal file)
    \-- file_5      (normal file)

可以挂载顶级子卷 (ID5)(可以将其视为文件系统的根),并且完整的文件系统结构将在挂载点上可见;或者可以挂载任何其他子卷(使用挂载选项 subvol 或 subvolid,例如 subvol=subvol_a),并且只有该子卷下方的任何内容(在上面的例子中为子卷 subvol_b、它的内容和文件 file_4)才会在挂载点上可见。

子卷可以嵌套,每个子卷(顶级子卷除外)都有一个父子卷。挂载子卷还会使其嵌套的任何子卷在相对于挂载点的各自位置可用。

btrfs 文件系统有一个默认子卷,该子卷最初设置为顶级子卷,如果没有指定 subvol 或 subvolid 选项,则会挂载该子卷。

使用 btrfs subvolume default 更改默认子卷将导致文件系统的顶层无法访问,除非使用 subvol=/ 或 subvolid=5 挂载选项。

子卷可以在文件系统中移动。


我的理解是,Ubuntu 安装程序(如果您选择 btrfs)将在您的 btrfs 文件系统中创建@@home作为子卷。然后它将@作为文件系统根目录挂载,并@home/home

这开启了更多的可能性,其中之一就是快照。我使用apt-btrfs-snapshot它来管理每次使用时apt(例如安装或删除软件包)创建快照。这样,如果出现问题,我可以恢复对系统的所有更改。我还为系统上的每个用户设置了子卷,尽管这几乎肯定是不必要的。关键是我不再有单独的根分区和主分区,并且不会浪费空间尝试为每个分区分配足够的空间。

我最近在 14.04 安装的基础上全新安装了 Ubuntu 15.10,该安装的主磁盘为 btrfs - 并且我能够保持@home子卷完好无损,同时仅使用图形安装程序用新安装替换根目录@。这是使用单独分区的主要原因,而且似乎最近的 Ubuntu 版本以同样的方式支持 btrfs - 因此我建议,如果您已配置 btrfs,则不再需要分区。

相关内容