与 Windows 和 macOS 操作系统不同,Linux 是由爱好者社区开发的大型开源项目。它的代码始终可供那些想要做出贡献的人使用,任何人都可以根据个人需求自由调整它,或在其基础上创建自己的发行版本。这就是为什么 Linux 存在如此多的变体,它的文件系统也是如此。该内核支持多种存储格式,但最常用的是 Ext 系列、XFS、Btrfs、F2FS、JFS 和 ReiserFS 的格式。
内容:
- Ext
- XFS
- Btrfs
- F2FS
- JFS
- ReiserFS
- Linux 的其他存储技术
Ext
Ext(扩展文件系统)是第一个专门为 Linux 设计的格式。但是,它存在严重的性能限制,并很快被 Ext2 取代。此文件系统及其后来的修订版 (Ext3 和 Ext4) 成为大多数 Linux 发行版的默认选择。
Ext2 因其基于 inode 概念的结构而被证明效率更高。这样的索引描述符保留特定对象(如文件或目录)的属性,并指向其底层数据的位置。Ext2 中的空间被划分为多个块,这些块形成更大的单元,称为块组。有关所有块组的信息由位于 Superblock 后面的 Descriptor Table 维护。每个块组将 inode 保留在自己的 inode 表中。它还使用 Block 和 Inode Bitmaps 监控其块和 inode 的状态。同时,文件或目录的名称并不构成其 inode 的一部分 – 名称通过目录映射到相应的 inode 编号,实现为一种特殊类型的文件。
大多数 Linux 文件系统都类似,因为名称不被视为属性,而是定义为某个目录中文件的别名。文件对象可以从多个位置链接,并以不同的名称存在(所谓的硬链接)。这可能会导致在文件删除或逻辑损坏后恢复文件名时出现严重甚至无法克服的困难。
Ext3 实际上是支持日志功能的 Ext2 的升级版本。Ext3 中的日志被组织为日志文件,它记录了对文件系统的所有更改,并在发生崩溃时保护它免受损坏。
Ext4 是对 Ext4 的改进,它将数据分配方法从单个块更改为扩展数据块。它背后的想法是将文件的大部分数据写入一个连续的区域,然后只记下它第一个块的地址和序列中的块数。最多可以将四个扩展数据块直接存储在 inode 中,而其余扩展数据块则以 B+树的形式排列。此外,Ext4 会推迟作,直到数据实际提交到磁盘,从而能够最大限度地减少碎片。
总的来说,它被认为是最灵活的通用文件系统类型之一,也获得了坚实稳定性的声誉。
XFS 系列
XFS(扩展文件系统)是另一种非常成熟的文件系统,最初由 Silicon Graphics 创建并应用于该公司的 IRIX 服务器。2001 年,它进入 Linux 内核,现在大多数 Linux 发行版都支持它,其中一些发行版(如 Red Hat Enterprise Linux)甚至默认使用它。
此 FS 类型针对在单个主机上存储非常大的文件和卷进行了优化。它将存储空间拆分为大小相等的区域,称为 Allocation Groups。它们中的每一个都像一个不同的文件系统,即有自己的 Superblock,管理自己的结构和空间使用。后者是在 B+树的帮助下控制的,其中一个记录连续自由空间区域中的第一个块,另一个 - 它组成的块数。存储块使用相同的基于范围的方法分配给文件。XFS 中的所有文件和目录都由其单独的 inode 表示。扩展的分配可以直接存储在 inode 中,或者由链接到它的另一个 B+tree 跟踪,以防文件非常大或碎片化。就像 Ext 中的 inode 一样,它们不包含名称,这些名称仅在相应的目录条目中可用。
XFS 为其元数据的任何更新部署日志原则。在实际块被修改之前,所有更改都会先写入日志,这样可以在发生任何事故时立即恢复。通常,这种文件系统类型设计为具有高度可扩展性,并且在服务器硬件上运行得非常好。
Btrfs
Btrfs(B-tree 文件系统)由 Oracle 开发,是 Linux 最流行的新一代格式之一。
Btrfs 经过调整,可在多种设备中运行,从智能手机到高端服务器。此外,它还包含逻辑卷管理器的功能,能够分布在多个存储中,以及无数其他高级可能性。
Btrfs 严重依赖 B 树结构,每个结构都由内部节点和叶子组成。内部节点指向子节点或叶,而叶包含包含一些信息的项。项目的实际布局和内容取决于给定 B 树的类型。根 B 树(其位置在 Superblock 中可用)具有对其余 B 树的引用。块 B 树管理逻辑到物理地址的映射,而设备 B 树则相反地将底层设备上的物理块链接到它们的虚拟地址。文件系统 B 树负责文件和文件夹的分配。小文件就存储在内部范围项目中。较大的数据块放置在外部的连续区域(称为扩展数据块)中。在这种情况下,区项将引用保存文件数据的所有区。目录项包括文件名并指向其 inode 项。反过来,inode 项用于其他属性,如大小、权限等。
Btrfs 是一种写入时复制 (CoW) 文件系统。它不使用日志,而是在修改块之前复制块,然后将此数据写入不同的空闲位置。此机制有助于消除更新中断(例如,由于断电)时数据损坏的风险。多亏了它和各种其他吸引人的功能,Btrfs 在现代 Linux 用户中找到了越来越多的追随者。
F2FS 系列
F2FS(Flash 友好文件系统)专为基于 NAND 闪存的存储设备而设计,因此在现代智能手机和可移动存储介质中的应用最为广泛。
F2FS 基于对数结构文件系统方法 (LFS) 工作,并考虑了闪存存储的特性,例如恒定访问时间和有限数量的数据重写周期。F2FS 不是创建一个大块进行写入,而是将这些块组装成并发写入的单独块(最多 6 个)。
它将其存储空间划分为固定大小的段。连续的分段构成一个区域,多个分段构成一个区域。其中的数据分配是在节点的帮助下执行的。后者有三种类型:直接、间接和 inode。inode 存储元数据,包括名称、大小和其他文件的属性;直接节点指示其数据块的位置,而间接节点指向其他节点中的块。这些节点的物理地址可以在节点地址表 (NIT) 中找到。内容本身存储在 Main Area 中。其中的部分将数据块与包含服务信息的节点块分开。所有块的使用状态都由区段信息表 (SIT) 记录。Segment Summary Area (SSA) 指定将哪些数据块分配给哪个节点。
当可用分段用完时,F2FS 会在系统处于非活动状态时在后台自行清理。清理算法根据 SIT 或其使用时间的块数选择受害者段。
所描述的组织使 F2FS 在固态存储上表现相当不错。然而,到目前为止,它主要应用于便携式设备,很少在台式机和服务器机器上遇到。
JFS
JFS(日志文件系统)由 IBM 于 1990 年创建,在开源后发布并移植到 Linux。
JFS 卷由称为 Allocation Groups 的区域组成,每个区域都包含一个或多个 FileSet。所有文件和目录都由其各自的 inode 描述,而数据内容则由一个或多个扩展数据块表示。所有盘区都由专用的 B+tree 编制索引。小型目录的内容存储在其 inode 中,而较大的目录则组织为 B+树。B+树还控制存储空间的使用:第一个树存储可用扩展的起始块,第二个树 - 可用扩展的数量。JFS 还包含一个单独的日志区域,并在元数据发生更改时写入该区域。
通常,JFS 被认为是一种快速可靠的文件系统。然而,它很少看到任何增强功能,现在已经不再使用,被更现代的选择所超越。
ReiserFS 系列
ReiserFS 是一种替代 Linux 格式,针对存储大量小文件进行了优化。它最初由 Namesys 于 2001 年设计,并带来了许多新功能,这些功能在推出时非常具有创新性。然而,由于某些技术问题,最终它的维护工作被移交给了志愿者。
ReiserFS 围绕 S+tree 进行组织,该树由内部节点和叶节点组成。此结构用于管理所有文件、目录和元数据。它包含四种基本类型的项目:直接、间接、目录和统计项目。直接项保存实际数据,间接项仅链接到某些数据块,目录项表示目录中的条目,统计项包含文件和文件夹的属性。每个项目都有其唯一的键,用于在树中查找它。此键包括项目的标识符、地址和类型。
不占用整个块的文件和文件片段被合并,并直接存储在 S+tree 的叶节点中。这种机制称为尾部包装,它有助于减少空间浪费和碎片的数量。此外,ReiserFS 不会直接对 S+tree 进行任何更改 – 它首先将它们写入 Journal,然后复制到存储上所需的位置。
总而言之,ReiserFS 具有良好的搜索功能,并支持小文件的紧凑分配。但是,这种格式不再受到积极支持,并且在不久的将来不太可能保持相关性。
Linux 的其他存储技术
Linux 文件系统通常是自包含的,与普通独立驱动器一起使用时,直接在分区上运行。但是,其他技术也可能在物理存储和 Linux 文件系统之间分层,以提供更高级的功能。其中一些,如 Btrfs,通过将某些功能集成到其核心功能中来更进一步,最大限度地减少对额外层的需求。
以下是 Linux 文件系统可能结合使用的一些最常见的存储技术:
- 逻辑卷管理器 (LVM) – 一种磁盘管理技术,与传统分区相比,可实现更灵活、更高效的存储容量分配。它与大多数 Linux 文件系统兼容,包括 Ext2、Ext3、Ext4、XFS、Btrfs、F2FS、JFS 和 ReiserFS。在它的帮助下,可以创建跨越多个物理存储设备的存储池,并在它们之上设置可调节的逻辑卷。精简配置是 LVM 的一项特殊功能,它允许通过动态分配空间来优化存储使用,但仅当实际数据写入卷时。在这种情况下,使用专用的 “thin pool” 作为源,并在其中创建的卷称为 “thin volumes”。此类卷的虚拟大小可能超过精简池中的实际可用空间量。
- mdadm – 用于创建和管理软件 RAID 的 Linux 实用程序。它将多个物理驱动器组合到一个逻辑单元中,可以提高存储性能和/或实现容错能力。mdadm 支持各种 RAID 级别,包括 RAID 0(条带化)、RAID 1(镜像)、RAID 5(带奇偶校验的条带化)、RAID 6(双奇偶校验)和 RAID 10(条带镜像)。生成的 RAID 集在 Linux 中显示为单个逻辑块设备,并且可以使用内核支持的任何文件系统进行格式化。
- LUKS(Linux 统一密钥设置) – 在 Linux 中加密块设备的标准,如果没有正确的加密密钥,就无法访问存储在它们上的数据。LUKS 与广泛的 Linux 文件系统兼容,包括 Ext2、Ext3、Ext4、XFS、Btrfs、F2FS、JFS 和 ReiserFS。此外,它还可以与其他 Linux 存储技术(如 LVM 或 mdadm)结合使用,以便在这些系统管理的卷之上提供分层加密。
- eCryptfs – 一种 Linux 原生加密文件系统。它允许加密卷中的单个目录或文件,而无需应用全盘加密。作为“堆叠”文件系统运行,eCryptfs 将其加密分层在现有文件系统之上,同时保留底层 FS 结构。这样,标准的 Linux 文件系统(如 Ext2、Ext3、Ext4、XFS、Btrfs、F2FS、JFS 或 ReiserFS)仍然负责管理数据块和其他元数据,而 eCryptfs 确保在访问文件时对文件的内容进行加密或解密。
- Btrfs-RAID – 嵌入到 Btrfs 文件系统中的 RAID 功能。它允许用户从多个存储设备配置灵活的容错存储卷。Btrfs 支持多种 RAID 级别,包括 RAID 0(条带化)、RAID 1(镜像)、RAID 5(带奇偶校验的条带化)、RAID 6(双奇偶校验)和 RAID 10(条带镜像)。与传统 RAID 不同,Btrfs-RAID 可以动态添加、删除或更换阵列中的驱动器,而无需使系统脱机。