Btrfs 一般概念

0 阅读7分钟

本文是详细介绍 Btrfs 的系列文章的一部分。

介绍

文件系统是现代计算机的基础之一。它们是每个操作系统的重要组成部分,通常不引人注意。然而,现代文件系统(如 Btrfs)提供了许多出色的功能,使使用计算机更加方便。除了其他功能之外,它们还可以为您透明地压缩文件或为增量备份构建坚实的基础。

本文将为您概述 Btrfs 文件系统的工作原理及其部分功能。本文不会深入介绍技术细节,也不会介绍具体实现。本系列的后续文章将对一些重点功能进行更详细的解释。

什么是文件系统?

如果您之前已经听说过文件系统最基本的工作原理,那么这对您来说并不新鲜,您可以跳到下一节。否则,请先阅读关于文件系统的简短介绍。

简单来说,文件系统可让您的 PC 找到其存储在磁盘上的数据。这听起来像是一项微不足道的任务,但从本质上讲,当今任何类型的非易失性存储设备(如 HDD、SSD、SD 卡等)基本上仍与 1970 年 PC 发明时的样子一样:一组(巨大的)存储块。

块是最精细的可寻址存储单元。PC 上的每个文件都存储在一个或多个块中。一个块的大小通常为 4096 字节。这取决于您的硬件和其上的软件(即文件系统)。

文件系统使我们能够从大量可用的存储块中找到文件的内容。这是通过所谓的_inode_实现的。inode 包含有关特殊格式的存储块中的文件的信息。这包括文件的大小、在哪里可以找到组成文件内容的存储块、其访问规则(即谁可以读取、写入或执行文件)等等。

下面是一个示例:

文本文件“myfile.txt”及其在磁盘上的表示的假设示例。所有方块都是单独的存储块。

inode 的结构对文件系统的功能有很大影响,因此它是任何文件系统的核心数据结构之一。因此,每个文件系统都有自己的 inode 结构。如果您想了解更多信息,请查看下面链接的 Btrfs 文件系统的 inode 结构[1]。有关各个字段含义的更详细说明,您可以参考 ext4 文件系统的 inode 结构[2]

写时复制## (copy-on-Write)文件系统

例如,与 ext4 相比,Btrfs 的一个突出特点是它是一个 CoW(写时复制)文件系统。当文件被更改并写回到磁盘时,它不会故意写回到之前的位置。相反,它会被复制并存储在磁盘上的一个全新位置。从这个意义上讲,将 CoW 视为一种“重定向”可能更简单,因为文件写入被重定向到不同的存储块。

这听起来可能很浪费,但实际上并非如此。这是因为无论文件系统如何工作,修改后的数据无论如何都必须写回磁盘。Btrfs 仅确保将数据写入以前未占用的块,因此旧数据保持不变。唯一真正的缺点是,这种行为可能导致文件碎片化的速度比其他文件系统更快。在常规桌面使用场景中,您不太可能注意到差异。

CoW 有什么好处?简单来说:可以保留修改和编辑文件的历史记录。Btrfs 会将对旧文件版本 (inode) 的引用保存在可以轻松访问的地方。此引用是快照_:_某个时间点的文件系统状态映像。这将是本系列中另一篇文章的主题,因此暂时就此打住。

除了保存文件历史记录之外,CoW 文件系统始终处于一致状态,即使之前的文件系统事务(如写入文件)由于断电等原因未完成。这是因为文件系统元数据更新也是 CoW:文件系统本身永远不会被覆盖,因此中断不会使其处于部分写入状态

文件的写入时复制(copy-on-Write)

您可以将文件名视为指向其所属文件的 inode 的指针。写入文件时,Btrfs 会创建修改后的文件内容(数据)的副本以及新的 inode(元数据),然后使文件名指向这个新的 inode。旧 inode 保持不变。下面是另一个假设示例来说明这一点:

继续上面的例子:又添加了 3 个字节的数据

这里“myfile.txt”附加了三个字节。传统文件系统会更新中间的“数据”块以包含新内容。CoW 文件系统保持旧块完整(灰色),并将更改的数据和元数据写入(复制)到新位置。需要注意的是,只会复制更改的数据块,而不是整个文件。

如果没有更多未使用的块来写入新内容,Btrfs 将从旧文件版本占用的数据块中回收空间(除非它们是快照的一部分,请参阅本系列的后续文章)。

文件夹的写入时复制

从文件系统的角度来看,文件夹是一种特殊类型的文件。与常规文件不同,文件系统直接解释底层内容。文件夹具有一些与之关联的元数据(如上文中文件的 inode),用于控制访问权限或修改时间。在最简单的情况下,存储在文件夹中的数据(所谓的“目录条目”)是 inode 引用列表,其中每个 inode 依次是另一个文件或文件夹。但是,现代文件系统至少将文件名以及对相关文件 inode 的引用存储在目录条目中。

之前有人指出,写入文件会创建前一个 inode 的副本并相应地修改内容。本质上,这会产生一个与其前身无关的新 inode。为了使修改后的文件显示在文件系统中,所有包含对它的引用的目录条目也会更新。

这是一个递归过程!由于文件夹本身就是一个具有 inode 的文件,因此修改其任何文件夹条目都会为文件夹文件创建一个新的 inode。此递归一直沿文件系统树向上进行,直到到达文件系统根目录。

因此,只要保留对任何旧目录的引用,并且这些目录没有被删除或覆盖,文件系统树就可以在以前的状态下遍历。这又一次是快照所做的。

未来文章中期待什么

Btrfs 不仅仅是一个 CoW 文件系统。它旨在实现“高级功能,同时注重容错、修复和易于管理”(参见[3])。本系列的后续文章将特别介绍这些功能:

  • 子卷 – 文件树中的文件树
  • 快照——回到过去
  • 压缩——透明地节省存储空间
  • Qgroups – 限制文件系统大小
  • RAID – 替换 mdadm 配置

这还远远不是 Btrfs 功能的详尽列表。如果您想要了解可用功能的完整概述,请查看 Wiki [4]和文档[3]

结论

我希望我能够激发您对了解 PC 文件系统的兴趣。如果您目前有任何疑问,请留下评论,说明您的想法,以便在未来的文章中讨论。与此同时,请随意研究文本中链接的资源。如果您偶然发现一个特别有趣的 Btrfs 功能,也请在下面添加评论。如果对某个特定主题有足够的兴趣,也许我会为该系列添加一篇文章。下一篇文章见!