从 Ext 到 F2FS,Linux 文件系统与存储技术全面解析

与 Windows 和 macOS 操作系统不同,Linux 是由爱好者社区开发的大型开源项目。它的代码始终可供那些想要做出贡献的人使用,任何人都可以根据个人需求自由调整它,或在其基础上创建自己的发行版本。这就是为什么 Linux 存在如此多的变体,它的文件系统也是如此。该内核支持多种存储格式,但最常用的是 Ext 系列、XFSBtrfsF2FS、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 可以动态添加、删除或更换阵列中的驱动器,而无需使系统脱机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:3210. 找出加密后的字符串(python3解法)

难度:简单 给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串: 对于字符串 s 中的每个字符 c,用字符串中 c 后面的第 k 个字符替换 c(以循环方式)。 返回加密后的字符串。 示例 1: 输入&#xff…

JVM详解(曼波脑图版)

(✪ω✪)ノ 好哒!曼波会用最可爱的比喻给小白同学讲解JVM,准备好开启奇妙旅程了吗?(๑˃̵ᴗ˂̵)و 📌 思维导图 ━━━━━━━━━━━━━━━━━━━ 🍎 JVM是什么?(苹果式比…

ZStack文档DevOps平台建设实践

(一)前言 对于软件产品而言,文档是不可或缺的一环。文档能帮助用户快速了解并使用软件,包括不限于特性概览、用户手册、API手册、安装部署以及场景实践教程等。由于软件与文档紧密耦合,面对业务的瞬息万变以及软件的飞…

Git创建分支操作指南

1. 创建新分支但不切换&#xff08;仅创建&#xff09; git branch <分支名>示例&#xff1a;创建一个名为 new-feature 的分支git branch new-feature2. 创建分支并立即切换到该分支 git checkout -b <分支名> # 传统方式 # 或 git switch -c <分支名&g…

package.json 中的那些版本数字前面的符号是什么意思?

1. 语义化版本&#xff08;SemVer&#xff09; 语义化版本的格式是 MAJOR.MINOR.PATCH&#xff0c;其中&#xff1a; MAJOR&#xff1a;主版本号&#xff0c;表示不兼容的 API 修改。MINOR&#xff1a;次版本号&#xff0c;表示新增功能但保持向后兼容。PATCH&#xff1a;修订号…

如何有效防止服务器被攻击

首先&#xff0c;我们要明白服务器被攻击的危害有多大。据不完全统计&#xff0c;每年因服务器遭受攻击而导致的经济损失高达数十亿。这可不是一个小数目&#xff0c;就好比您辛苦积攒的财富&#xff0c;瞬间被人偷走了一大半。 要有效防止服务器被攻击&#xff0c;第一步就是…

Chainlit 快速构建Python LLM应用程序

背景 chainlit 是一款简单易用的Web UI goggle&#xff0c;它支持使用 Python 语言快速构建 LLM 应用程序&#xff0c;提供了丰富的功能&#xff0c;包括文本分析&#xff0c;情感分析等。 这里我们以官网openai提供的例子&#xff0c;快速的开发一个带有UI的聊天界面&#xf…

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品…

【数据结构_6】双向链表的实现

一、实现MyDLinkedList&#xff08;双向链表&#xff09; package LinkedList;public class MyDLinkedList {//首先我们要创建节点&#xff08;因为双向链表和单向链表的节点不一样&#xff01;&#xff01;&#xff09;static class Node{public String val;public Node prev…

做Data+AI的长期主义者,加速全球化战略布局

在Data与AI深度融合的新纪元&#xff0c;唯有秉持长期主义方能真正释放数智化的深层价值。2025年是人工智能从技术爆发转向规模化落地的关键节点&#xff0c;也是标志着袋鼠云即将迎来十周年的重要里程碑。2025年4月16日&#xff0c;袋鼠云成功举办了“做DataAI的长期主义者——…

构建基于PHP和MySQL的解梦系统:设计与实现

引言 梦境解析一直是人类心理学和文化研究的重要领域。随着互联网技术的发展,构建一个在线的解梦系统能够帮助更多人理解自己梦境的含义。本文将详细介绍如何使用PHP和MySQL构建一个功能完整的解梦系统,包括系统架构设计、数据库模型、核心功能实现以及优化策略。 本文源码下…

【桌面】【系统应用】Samba共享文件夹

目录 场景一&#xff1a;银河麒麟桌面与银河麒麟桌面之间共享文件夹 环境准备 实现目标 操作步骤 &#xff08;一&#xff09;配置主机A共享文件夹 1、环境准备 2、在主机A创建共享文件夹 3、设置共享文件密码 &#xff08;二&#xff09;主机B访问主机A 场景二&…

OpenCV 图形API(37)图像滤波-----分离过滤器函数sepFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用一个可分离的线性滤波器到一个矩阵&#xff08;图像&#xff09;。 该函数对矩阵应用一个可分离的线性滤波器。也就是说&#xff0c;首先&a…

webpack理解与使用

一、背景 webpack的最初目标是实现前端工程的模块化&#xff0c;旨在更高效的管理和维护项目中的每一个资源。 最早的时候&#xff0c;我们通过文件划分的方式实现模块化&#xff0c;也就是将每个功能及其相关状态数据都放在一个JS文件中&#xff0c;约定每个文件就是一个独立…

rac环境下,增加一个控制文件controlfile

先关闭节点二&#xff0c;在节点一上操作 1、查看控制文件个数和路径 SQL> show parameter control 2、备份参数文件 SQL> create pfile/home/oracle/orcl.pfile20250417 from spfile; 3、修改控制文件参数 SQL> alter system set contr…

git安装(windows)

通过网盘分享的文件&#xff1a;资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用&#xff0c;所以不用创建。 用vscode&#xff0c;所以这么选择。

Spring Boot整合难点?AI一键生成全流程解决方案

在当今的软件开发领域&#xff0c;Spring Boot 凭借其简化开发流程、快速搭建项目的优势&#xff0c;成为了众多开发者的首选框架。然而&#xff0c;Spring Boot 的整合过程并非一帆风顺&#xff0c;常常会遇到各种难点。而飞算 JavaAI 的出现&#xff0c;为解决这些问题提供了…

Python批量处理PDF图片详解(插入、压缩、提取、替换、分页、旋转、删除)

目录 一、概述 二、 使用工具 三、Python 在 PDF 中插入图片 3.1 插入图片到现有PDF 3.2 插入图片到新建PDF 3.3 批量插入多张图片到PDF 四、Python 提取 PDF 图片及其元数据 五、Python 替换 PDF 图片 5.1 使用图片替换图片 5.2 使用文字替换图片 六、Python 实现 …

山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到

在开发中医知识问答历史对话查看功能的时候&#xff0c;出现了前后端信息获取异同的问题&#xff0c;在经过非常非常非常艰难的查询之后终于解决了这一问题&#xff0c;而这一问题的罪魁祸首就是后端没有setter和getter方法&#xff01;&#xff01;&#xff01;&#xff01;&a…

Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)

目录 应用全局UI状态存储和持久化V2版本 AppStorageV2 connect remove keys 示例 使用限制 PersistenceV2 connect remove keys save notifyOnError 示例 使用限制 Type 使用限制 应用全局UI状态存储和持久化V2版本 以下实例AppStorageV2、PersistenceV2和装饰…