Linux 上 btrfs 入门

B-tree 文件系统是一个集文件系统和卷管理器于一体的系统。它有望为 Linux 提供一套先进的文件系统功能。
108 位读者喜欢这篇文章。
Filing cabinet for organization

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),以便清晰地查看驱动器布局,就像出厂时一样。

从这一点来看,它与您习惯的并没有太大不同; 事实上,您可以像往常一样使用该系统,甚至可能不会注意到文件系统是 Btrfs。 但是,拥有这个新的默认设置使您能够利用几个很酷的功能。

检查 Btrfs 文件系统

我不知道有任何 Btrfs 专用的图形工具,尽管它的一些功能已 incorporated 到现有的磁盘管理工具中。

从命令行,您可以更仔细地查看 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 上的默认设置就证明了这一点。

接下来阅读什么
标签
Alan Formy-Duval Opensource.com Correspondent
Alan 拥有 20 年的 IT 经验,主要在政府和金融领域。 他最初是一名增值经销商,之后转行从事系统工程。 Alan 的背景是高可用性集群应用程序。 他在 Oracle Press/McGraw Hill 的《Oracle Solaris 11 系统管理》一书中撰写了“用户和组”以及“Apache 和 Web 堆栈”章节。

5 条评论

关于 Btrfs 子卷,我感到困惑的一件事是; 当使用像 ext3/ext4 这样的常规文件系统时,我会创建一个单独的 /home 分区(加上交换分区和/或 /boot 分区,具体取决于特定代的硬件或操作系统需要什么)。 这样,我可以完全重新安装操作系统,但保持我的主目录完好无损。

如果您将 /home 创建为子卷,您可以在进行全新安装时保持其完好无损,还是仍然需要为 /home 保留一个单独的 Btrfs 分区?

建议查看 openSUSE 如何支持您所要求的,openSUSE 已经将 BTRFS 作为其默认文件系统大约 6 年了,但直到当前的 LEAP 15.2 版本才最终将 /home 作为根卷的子卷。 您可以在技术帮助论坛中提出任何问题

回复,作者:jelabarre59

好文章。 但是,根据您安装的应用程序(您的 Wildfly 示例),因为它位于 /opt 中的较高级别目录中,您可能还需要考虑快照的后果,并可能需要排除。

既然您已经体验了 Fedora,我建议您尝试 openSUSE,它具有 Snapper 快照管理和 YaST GUI 管理工具,包括对 BTRFS 的支持。
相同的 YaST 卷管理工具同时支持 LVM 和 BTRFS 卷。
YaST 分区器支持包括 BTRFS 在内的所有文件系统。
YaST 用户和组模块可以完成您描述的所有操作,包括创建新用户、创建 /home 子卷以及成为默认组的成员或您想要的任何自定义、安全策略等。

这是第二条评论提到 openSUSE 和 YaST/Snapper。 我想我需要去看看! 谢谢

回复,作者:Tsu2

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.