就我浅薄的使用经验来看,Btrfs 可以大大减轻 Linux 安装时分区的痛苦,此外切换 Linux 发行版更加容易!

什么是 Btrfs?

Btrfs 是一个新型的文件系统,由 Linux 社区主导开发,一般被认为是由 Oracle 实际控制的 ZFS 的替代品。

在我眼中, Btrfs 的特点是:

  • 不稳定性(!):Btrfs 终究是一个新的文件系统,尚未得到广泛测试,在生产环境中使用需要格外小心。
  • 易用性:一个小小的 btrfs 命令,可以管理 Btrfs 的方方面面。
  • 先进性:Btrfs 对 SSD 硬盘有优化。

那么 Btrfs 如何使 Linux 生活更轻松呢?其他功能可能都不重要,重要的是 Btrfs 的子卷功能!Btrfs 的子卷是可以动态伸缩的,这意味着,如果你给 Btrfs 分配足够大的空间,那么在里面分多少个子卷,这些子卷原则上都可以任意享用这些空间,只要占用总空间不超过 Btrfs 的所有空间就行了。

Btrfs 的使用

创建 Btrfs

创建 Btrfs 和创建其他文件系统是一样的

mkfs.btrfs <block device>

基础的子卷管理

首先我们假设你已经创建好了一个 Btrfs 文件系统,其在 /dev/sdaX 块设备中。

mkdir /mnt/top
mkdir /mnt/myfs

mount /dev/sdaX /mnt/top        # 把分区挂载到 /mnt/top 中
cd /mnt
btrfs subvol create myfs        # 创建一个 myfs 子卷
touch myfs/success              # 表现为一个目录,你可以对其进行任何操作
btrfs subvol list .             # 列出所有子卷

mount -o subvol=myfs /dev/sdaX /mnt/myfs
                                # 把 myfs 子卷单独挂载到 /mnt/myfs
                                # 这时其他子卷被隐藏
umount /mnt/myfs

cd /mnt/top
btrfs subvol del myfs           # 删除 myfs 子卷
umount /mnt/top
rmdir /mnt/myfs
rmdir /mnt/top

挂载选项中 subvolsubvolid 是非常重要的。

删除子卷时会删除掉子卷里面所有内容。有时候会遇到「目录非空」错误,可能因为子卷里面还有一个子卷,而删除子卷并不会递归地删掉嵌套子卷,可以使用btrfs subvol list 进行检查。

我个人非常不建议你使用 「默认子卷」设置,因为这会使得子卷管理变得麻烦。

安装 Linux 发行版

Btrfs 的一大优点就是安装 Linux 发行版变得非常简单。

安装 AOSC OS

AOSC OS 是安同开源社区(Anthon Open Source Community)推出的 Linux 发行版,自称「暴力简化的 Linux 发行版」。目前其官方的安装方法 也的确很「暴力」,就是把 tar 解包到文件系统里面!= =b

对,现在你知道怎么做了吗?创建一个子卷,然后把归档文件解包到里面去,接着就可以顺利 chroot 进去。

安装 Arch Linux

最好的文档是 Arch Wiki

首先建立一个子卷,任意选用一个 bootstrap 脚本,比如 arch-bootstrap,把里面填满,就相当于得到了一个 Arch。

Home 分区

过去我一直很头疼 Home 分区问题。因为我一直不知道到底 / 和 /home 哪个我可能用得更多,也许以前我经常看电影,所以 /home 占用多,也许不久后我迷上了大型软件,于是 /opt 里面就塞满了各种奇奇怪怪的商业大型软件。

现在有了子卷,一切都不是问题!只要把 / 和 /home 分别放到两个子卷里面就行了。

引导与挂载

Btrfs 虽然号称挺新的,实际上也是开发了好几年,各种配套工具也挺丰富了。

首先就是大家最关心的引导问题。当然没有问题,GRUB2 早已支持 Btrfs 和子卷,grub-mkconfig 可以正确识别出子卷并在 grub.cfg 填上正确的 subvolid 和 subvol 参数,比如我这里:

linux   /vmlinuz-linux root=UUID=3fc0a297-c5df-41d5-a82a-f7edc299747a rw rootflags=subvol=archfs  quiet

其次就是挂载。/etc/fstab 中可以写上挂载参数,这当然也不是问题:

/dev/sda3 /home btrfs rw,relatime,ssd,space_cache,subvolid=258,subvol=/homefs,subvol=homefs 0 0