Btrfs 已经可以在 Linux 上使用多年了,所以您可能已经熟悉它了。 如果不熟悉,您可能会对它有疑问,特别是如果您使用 Fedora Workstation(Btrfs 现在是其默认文件系统)。 本文旨在帮助您熟悉它及其高级功能,例如 写入时复制 和 校验和。
Btrfs,是 B-Tree 文件系统(B-Tree Filesystem)的缩写,实际上是一个集文件系统和卷管理器于一体的系统。它通常被视为对 ZFS 的回应,ZFS 最初于 2005 年在 Sun Microsystem 的 Solaris 操作系统中引入,现在很大程度上被一个名为 OpenZFS 的开源实现所取代。Ubuntu Linux 和 FreeBSD 经常采用 OpenZFS。其他具有类似功能的例子包括 Red Hat 的 Stratis 和 Linux 逻辑卷管理器 (LVM)。
安装
为了尝试 Btrfs,我 下载 了 Fedora 33 Workstation ISO 文件,并将其安装到一个新的虚拟机 (VM) 中。安装过程与之前的版本没有变化。我没有自定义任何设置,包括驱动器分区和格式化,以保持本教程准确的“开箱即用”设置。虚拟机启动并运行后,我安装并运行了 GNOME 分区编辑器 (GParted),以便清晰地查看出厂时的驱动器布局。

(Alan Formy-Duvall, CC BY-SA 4.0)
从这一点来看,它与您习惯的没有太大区别; 事实上,您可以像往常一样使用该系统,甚至可能不会注意到文件系统是 Btrfs。 但是,拥有这个新的默认设置使您能够利用一些很酷的功能。
检查 Btrfs 文件系统
我不知道有任何 Btrfs 专用的图形工具,尽管它的一些功能已被整合到现有的磁盘管理工具中。
从命令行,您可以更仔细地查看 Btrfs 格式
# btrfs filesystem show
Label: 'fedora_localhost-live' uuid: f2bb02f9-5c41-4c91-8eae-827a801ee58a
Total devices 1 FS bytes used 6.36GiB
devid 1 size 10.41GiB used 8.02GiB path /dev/vda3
更改 Btrfs 标签
我注意到的第一件事是安装程序设置的文件系统标签:fedora_localhost-live
。 这不准确,因为它现在是一个已安装的系统,不再是 Live CD。所以我使用 btrfs filesystem label
命令更改了它。
更改 Btrfs 文件系统标签很简单
# btrfs filesystem label /
fedora_localhost-live
# btrfs filesystem label / fedora33workstation
# btrfs filesystem label /
fedora33workstation
管理 Btrfs 子卷
子卷看起来像是一个可以由 Btrfs 管理的标准目录。我的新 Fedora 33 Workstation 上有几个子卷
# btrfs subvolume list /
ID 256 gen 2458 top level 5 path home
ID 258 gen 2461 top level 5 path root
ID 265 gen 1593 top level 258 path var/lib/machines
使用 btrfs subvolume create
命令创建一个新的子卷,或使用 btrfs subvolume delete
删除一个子卷
# btrfs subvolume create /opt/foo
Create subvolume '/opt/foo'
# btrfs subvolume list /
ID 256 gen 2884 top level 5 path home
ID 258 gen 2888 top level 5 path root
ID 265 gen 1593 top level 258 path var/lib/machines
ID 276 gen 2888 top level 258 path opt/foo
# btrfs subvolume delete /opt/foo
Delete subvolume (no-commit): '/opt/foo'
子卷允许诸如设置配额、创建快照以及复制到其他位置和主机之类的操作。系统管理员如何利用这些功能?用户主目录又如何呢?
添加用户
自古以来就是这样,添加一个新的用户帐户会为该帐户创建一个主目录以供使用
# useradd student1
# getent passwd student1
student1:x:1006:1006::/home/student1:/bin/bash
# ls -l /home
drwx------. 1 student1 student1 80 Oct 29 00:21 student1
传统上,用户的主目录是 /home
的子目录。 所有权和权限是为所有者量身定制的,但是没有用于管理它们的特殊功能。 企业服务器环境是另一种场景。 通常,会为一个特定的应用程序及其用户保留一个目录。 您可以利用 Btrfs 来管理这些目录并应用约束。
为了适应 Btrfs 子卷作为用户主目录,useradd
命令有一个新的选项:--btrfs-subvolume-home
。 尽管手册页尚未更新(截至撰写本文时),但您可以通过运行 useradd --help
查看该选项。 通过在添加新用户时传递此选项,将创建一个新的 Btrfs 子卷。 它的功能就像 -d
选项创建常规目录一样
# useradd --btrfs-subvolume-home student2
Create subvolume '/home/student2'
使用 getent passwd student2
验证用户,它看起来会很正常。 但是,运行 btrfs subvolume
命令列出子卷,您会看到一些有趣的东西:新用户的主目录!
# btrfs subvolume list /
ID 256 gen 2458 top level 5 path home
ID 258 gen 2461 top level 5 path root
ID 265 gen 1593 top level 258 path var/lib/machines
ID 272 gen 2459 top level 256 path home/student2
探索企业服务器环境的第二种场景。 假设您需要在 /opt
中安装一个 WildFly 服务器并部署一个 Java Web 应用程序。 通常,您的第一步是创建一个 wildfly
用户。 使用新的 --btrfs-subvolume-home
选项以及 -b
选项来指定 /opt
作为基本目录来执行此操作
# useradd -b /opt --btrfs-subvolume-home wildfly
Create subvolume '/opt/wildfly'
现在,wildfly
用户可以登录并在 /opt/wildfly
中完成安装。
删除用户
当您删除用户时,有时您希望同时删除该用户的文件和主目录。 userdel
命令有 -r
选项用于此目的,它也会删除 Btrfs 子卷
# userdel -r student2
Delete subvolume (commit): '/home/student2'
设置磁盘使用配额
在我的计算机科学课程中,一位学生运行了一个失控的 C 程序,该程序一直写入磁盘,直到部门的 Unix 系统上的整个 /home
都被填满! 服务器变得不可用,直到管理员终止了失控进程并清理了一些空间。 上述场景也是如此; 该 Wildfly 企业应用程序将为其用户提供越来越多的日志文件和内容存储。 如何防止服务器因磁盘已满而停止运行? 设置磁盘使用约束是一个好主意。 幸运的是,Btrfs 通过配额支持这一点。
配置配额需要几个步骤。 第一步是在 Btrfs 文件系统上启用 quota
# btrfs quota enable /
确保您知道每个子卷的配额组 (qgroup) ID 号,该 ID 号由 btrfs subvolume list
命令显示。 每个子卷都需要一个基于其 ID 号的关联 qgroup。 这可以通过 btrfs qgroup create
单独完成,但是,方便的是,Btrfs wiki 提供了以下命令来加快为文件系统上的子卷创建 qgroup 的速度
>btrfs subvolume list \<path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup destroy 0/{} \<path>
在一个新安装的 Fedora 33 工作站系统中,您正在根文件系统路径 /
上操作。 将 \<path>
替换为根路径
# btrfs subvolume list / | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} /
然后运行 btrfs quota rescan
并查看新的 qgroup
# btrfs quota rescan /
quota rescan started
# btrfs qgroup show /
qgroupid rfer excl
-------- ---- ----
0/5 16.00KiB 16.00KiB
0/256 272.04MiB 272.04MiB
0/258 6.08GiB 6.08GiB
0/265 16.00KiB 16.00KiB
0/271 16.00KiB 16.00KiB
0/273 16.00KiB 16.00KiB
现在您可以为其中一个 qgroup 分配配额,配额会应用于其关联的子卷。 因此,如果您想将 student3 的主目录使用量限制为 1GB,请使用 btrfs qgroup limit
命令
# btrfs qgroup limit 1G /home/student3
确认特定子卷的配额
# btrfs qgroup show -reF /home/student3
qgroupid rfer excl max_rfer max_excl
-------- ---- ---- -------- --------
0/271 16.00KiB 16.00KiB 1.00GiB none
稍有不同的选项将显示所有 qgroup 和任何已设置的配额
# btrfs qgroup show -re /
qgroupid rfer excl max_rfer max_excl
-------- ---- ---- -------- --------
0/5 16.00KiB 16.00KiB none none
0/256 272.04MiB 272.04MiB none none
0/258 6.08GiB 6.08GiB none none
0/265 16.00KiB 16.00KiB none none
0/271 16.00KiB 16.00KiB 1.00GiB none
0/273 16.00KiB 16.00KiB none none
其他功能
这些示例提供了一些关于 Btrfs 功能的想法。 运行 btrfs --help
查看完整的命令列表。 还有许多其他值得注意的功能; 例如,快照和发送/接收是两个值得学习的功能。
最终想法
Btrfs 为 Linux 提供高级文件系统功能集带来了很多希望。 它不是第一个; 我将 ZFS 归功于我大约 15 年前对这种类型的文件系统的介绍,但是 Btrfs 是完全开源的,并且不受专利的限制。
如果您想探索这个文件系统,我建议从虚拟机或备用系统开始。
我希望看到为喜欢在 GUI 世界中操作的系统管理员制作一些图形管理实用程序。 幸运的是,Btrfs 具有强大的开发活动,Fedora 项目决定将其作为 Workstation 33 的默认设置就证明了这一点。
5 条评论