【Linux篇】深入理解文件系统:从基础概念到 ext2 文件系统的应用与解析

发布于:2025-04-14 ⋅ 阅读:(20) ⋅ 点赞:(0)


本文将介绍文件系统的基本概念及其重要性。文件系统作为操作系统的一部分,负责管理存储设备上的数据存储、读取和组织方式。它提供了一种高效且可靠的方法来存储和检索文件,使得操作系统能够有效地管理大量数据。本文将从文件系统的基本架构、常见类型、以及其在实际应用中的表现和优化策略等方面展开讨论,旨在帮助读者理解文件系统如何支持现代计算环境中的数据存储需求。

💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍
点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力! 🚀
分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对Linux OS感兴趣的朋友,让我们一起进步!

一. 文件系统

打开的文件被内存管理着,实际是进程通过相关数据结构将每个对象进行关联;而未被打开的文件被保存在磁盘上,一般是未被打开的文件占据最多。

1.1 块

文件系统块(也称为磁盘块)是操作系统用来管理磁盘空间的基本单位。它的引入主要解决了两个问题:一个是磁盘的访问效率,另一个是存储空间的管理。块的大小最常见为4KB,即八个扇区组成一个块。块是文件存取的最小单位。

LBA(Logical Block Address)逻辑块地址,本质是线性地址。

在这里插入图片描述
块号=LBA/8,因为LBA是线性的像数组一样,8个扇区是一个块。
LBA=块号*8+n(n指的是指定扇区的第几个位置)。

1.2 分区

文件系统分区是指将磁盘划分为多个逻辑上独立的区域,每个区域可以格式化为独立的文件系统,用于存储数据和文件。分区的引入主要是为了提高磁盘的管理效率,优化存储空间的利用,同时也增强了系统的安全性和可扩展性。通过分区,操作系统能够在同一物理磁盘上为不同类型的数据提供不同的存储环境,例如操作系统、应用程序和用户数据可以分别存储在不同的分区中,从而避免它们之间的相互干扰。每个分区可以使用不同的文件系统格式(如NTFS、FAT32、ext4等),以满足不同需求的性能和功能要求。此外,分区还可以提供数据隔离,一旦一个分区发生故障,其他分区的数据不会受到影响,增加了数据的安全性。通过分区,系统管理员可以更方便地管理磁盘,进行备份、恢复或扩展,也便于磁盘的高效利用和性能优化。

1.3 inode(索引节点)

文件=内容(数据)+ 属性,文件的内容存储在哪里呢???存在inode表中。

查看inode的命令格式:

ls -li

  • 示例:

ls usercode.c -li
1061373 -rw-rw-r-- 1 wch_1 wch_1 404 Apr 12 17:37 usercode.c

  • 1061273:inode编号
  • -rw-rw-r-- :权限
  • 1:硬链接数
  • wch_1 :拥有者
  • wch_1:所属组
  • 404:文件大小
  • Apr 12 17:37:最近修改时间
  • usercode.c:文件名

还有另一个方式:stat 文件名

  • 示例:

stat usercode.c
在这里插入图片描述
inode是文件的唯一标识符,有且仅有一个,叫做inode号。

二. ext2文件系统

前言:文件系统有很多的分类,如:

  • ext3/ext4: Linux 中广泛使用的文件系统,ext4 是其更先进的版本,支持更大的文件系统和更高效的数据存储。
  • JFS(Journaled File System): IBM 开发的日志文件系统,广泛应用于高性能服务器。
  • ReiserFS: 另一个支持日志的文件系统,主要用于 Linux 系统。

虽然文件种类很多,本文章主要以ext2文件系统为例。

2.1 认识文件系统

文件系统的目的是组织和管理硬盘上的文件,确保文件能够在磁盘上高效、安全地存储和访问。格式化硬盘是将硬盘转化为特定文件系统的过程,这样硬盘就能够被操作系统识别并使用。文件系统的设计和选择影响文件存储的性能、安全性以及后续的扩展能力,因此根据应用需求选择合适的文件系统非常重要。

“只要能管理一个分区,就能管理所有分区,也就能管理所有磁盘文件” 这句话的含义是:ext2 文件系统通过将硬盘分区划分成多个相同大小的块组来管理数据,每个块组都有独立的管理机制。只要操作系统能够理解和管理一个分区中的块组结构,它就能通过相同的方式管理其他分区和整个磁盘中的所有文件。这个设计使得文件系统管理的过程更加简洁和高效,便于扩展。
在这里插入图片描述
上面可以看到分区的前面存在Boot Sector。下面将介绍一下它。

  • Boot Sector(启动扇区)

Boot Sector(启动扇区)是计算机存储设备(如硬盘、固态硬盘、U盘等)上的一个特殊区域,用于存放引导操作系统的相关信息。它是系统启动过程中的重要组成部分,负责将操作系统加载到内存并开始执行。

  • Boot Sector 是存储设备上的特殊区域,负责启动操作系统。
  • 在传统的 BIOS 系统中,它通常指的是 MBR,包含引导程序和分区表信息。
  • 在现代的 UEFI 系统中,启动信息存储在 EFI System Partition (ESP) 中。
  • Boot Sector 是计算机启动过程的关键,确保操作系统能够加载并执行。

2.2 Block Group (块组)

Block Group 是一种用于文件系统中存储和组织数据的结构,尤其在 ext2、ext3 和 ext4 等文件系统中应用广泛。它是一种将文件系统数据划分成更小单元的方式,以便提高磁盘访问的效率并确保数据的组织性。

2.2.1 Block Group 的基本概念

在 ext2/3/4 文件系统中,磁盘分区(或硬盘)被划分为多个 Block Group。每个 Block Group 是磁盘上的一个逻辑单位,通常由以下几个部分组成:

  • 数据块(Data Blocks): 存储文件的实际数据。
  • inode 表(Inode Table): 存储文件的元数据,如文件的权限、大小、创建时间等信息。
  • 超级块(Superblock): 存储关于文件系统的总体信息,如文件系统的大小、已用空间、剩余空间等。
  • 块位图(Block Bitmap): 用于标记哪些数据块是空闲的,哪些是已经使用的。
  • inode 位图(Inode Bitmap): 用于标记哪些 inode 是空闲的,哪些是已经使用的。

2.2.2 Block Group 的作用

Block Group 的设计目的有几个,主要包括以下几点:

  1. 提高访问效率: 将硬盘分为多个 Block Group 有助于提高文件系统的性能。每个 Block Group 内的数据结构相对独立,这样操作系统可以更快地定位文件。每个块组中的 inode 表 和 数据块尽量靠近,这样可以减少磁盘寻道时间,提高文件读取速度。
  2. 避免碎片化: 通过将文件的 inode 和 数据块 组织在同一个块组内,ext系列文件系统能有效地减少碎片化。这样,文件的数据和它的元数据被存放在同一块区域,读写操作更加连续,减少了由于寻址不连续带来的磁盘碎片。
  3. 管理和分配空间 :每个 Block Group 都有一个独立的位图,标记数据块和 inode
    的使用情况。这使得文件系统可以灵活地管理磁盘空间,减少不必要的磁盘访问和冲突。在一个文件系统中,如果所有数据都集中在一个大块区域,访问时可能需要更多的寻址和空间管理,使用Block Group 的方法可以使得空间管理更加高效。
  4. 容错性与恢复:由于文件系统是通过多个块组管理磁盘空间,一些块组发生错误时,其他块组仍然能够正常工作,这提高了文件系统的容错性。损坏的块组可以通过文件系统的修复工具进行恢复,而不必影响整个磁盘。

下面将详细介绍块组内部的结构即功能。😆

2.3 块组内部结构

2.3.1 超级块(Super Block)

Superblock(超级块)是文件系统中的一个重要结构,负责存储有关文件系统的元数据。它是文件系统的核心部分之一,用于描述文件系统的总体信息,包括文件系统的大小、空闲空间、块的大小、文件系统的状态等。每个文件系统都有一个 超级块,它是文件系统结构的关键。

Superblock 的作用

Superblock 存储了文件系统的基本信息,这些信息对于文件系统的运行和维护至关重要。它主要包括以下内容:

  1. 文件系统的总大小: 文件系统的总大小(以字节为单位)以及文件系统使用的总块数。
  2. 块大小(Block Size): 文件系统中每个块的大小(通常为 512 字节、1 KB、2 KB、4 KB等)。块大小决定了文件系统数据存储的最小单位。
  3. 空闲空间的信息: 包括文件系统中空闲块的数量、空闲 inode 的数量等。这些信息用于文件分配和空间管理。
  4. inode 信息: 包括文件系统总共有多少个 inode、每个 inode 占用多少空间,以及 inode 表的位置等。
  5. 文件系统状态: 用于记录文件系统的健康状态(如是否需要修复),并存储文件系统的版本信息。
  6. 文件系统的创建时间、最后挂载时间、文件系统的版本等: 用于文件系统管理和维护。
  7. 块位图(Block Bitmap)和 inode 位图(Inode Bitmap)的状态信息: 用于跟踪哪些数据块和 inode是空闲的,哪些已经被分配。

一个超级块存在很多备份,防止丢失,可以系统调用(如 Linux 中的 fsck 命令)来检查和修复文件系统。在文件系统损坏时,fsck 会使用 superblock 中的信息来尝试恢复文件系统的状态。

总结:
Superblock 是文件系统中最重要的数据结构之一,它包含文件系统的总体配置信息、空闲空间、inode 信息等。文件系统的初始化、挂载、空间管理、数据恢复等操作都离不开 superblock 的帮助。在文件系统损坏或异常的情况下,superblock 还提供了修复文件系统所需要的关键数据。

2.3.2 GDT(Group Descriptor Table)

块组描述表(Block Group Descriptor Table) 是在一些文件系统中用于管理块组(Block Group)信息的数据结构,尤其是在 ext2、ext3、ext4 等文件系统中,块组描述表是管理磁盘空间的核心部分之一。

用于描述块组的属性信息,块组与块组描述符一一对应。

块组描述表的结构

在 ext2、ext3 和 ext4 文件系统中,块组描述表的每个条目通常包含以下信息:

  1. 块组的起始地址(Block Group Start Address): 用于表示该块组在磁盘上的物理起始位置。
  2. 数据块位图的地址(Block Bitmap): 存储块组内所有数据块的分配情况。它是一个位图,每一位代表一个数据块,0 表示空闲,1表示已分配。
  3. inode 位图的地址(Inode Bitmap): 存储块组内所有 inode 的分配情况。它同样是一个位图,每一位表示一个inode,0 表示空闲,1 表示已分配。
  4. inode 表的地址(Inode Table): 存储该块组内所有 inode 的数据结构,每个 inode
    包含一个文件的元数据。文件的创建、删除、修改等操作都与 inode 表的管理紧密相关。
  5. 块组的空闲块数(Free Block Count): 记录该块组内空闲数据块的数量。
  6. 块组的空闲 inode 数量(Free Inode Count): 记录该块组内空闲 inode 的数量。
  7. 已分配的目录项数(Used Directory Count): 记录该块组中目录 inode
    的数量,这对于管理文件系统中的目录结构非常重要。

块组描述表与超级块的关系

超级块 和 块组描述表 是密切相关的。在 ext2/3/4 文件系统中,超级块 存储文件系统的整体信息,如文件系统的总大小、块大小、inode 数量等,而 块组描述表 则存储每个块组的管理信息。超级块会包含一个指向块组描述表的指针,操作系统通过这个指针来访问并更新块组的状态。

2.3.3 块位图(Block Bitmap)

Block Bitmap中记录着Data Block中哪个数据块已经被占⽤,哪个数据块没有被占⽤。

2.3.4 inode位图(Inode Bitmap)

每个bit表⽰⼀个inode是否空闲可⽤。

2.3.5 inode表

  • 存放⽂件属性 如 ⽂件⼤⼩,所有者,最近修改时间等
  • 当前分组所有Inode属性的集合
  • inode编号以分区为单位,整体划分,不可跨分区

2.3.6 Data Block(数据块)

Data Block(数据块)是文件系统中用于存储实际文件内容的最小单位。它是文件系统中存储数据的基本结构。每个 Data Block 都包含文件的实际数据,而不仅仅是元数据(如文件的权限、所有者、修改时间等),这些元数据通常存储在 inode(索引节点)中。数据块使得文件系统能够高效地管理和存储文件内容。

思考:知道inode号的情况下,在指定分区,请解释:对⽂件进⾏增、删、查、改是在
做什么?

  1. 查(查找文件):查找inode,通过inode指针访问数据块。
  2. 增(增添数据):查找数据块(通过块位图和inode位图查找空闲的数据块),修改inode,写入数据。
  3. 删(删除文件):查找inode和数据块,释放数据块和inode,同时更改目录项。
  4. 改(修改文件):查找inode,更新数据块同时修改文件大小。

上述文件系统结构还是没看到文件名存在哪里???它存在哪里呢?下面将揭晓此答案。

2.4 目录与文件名

目录保存的内容是:文件名与inode号的映射关系。
OS会记录当前的工作路径,通过文件名与映射关系深度进行路径解析。

2.5 路径解析

路径解析 是操作系统和文件系统用来确定文件或目录在存储介质(如硬盘)上的位置的过程。路径解析的目的是从文件的路径名称中找到与其对应的 inode,并通过文件系统中的目录结构和索引节点,最终定位到实际的数据块(Data Block)。在这个过程中,操作系统需要解析给定的文件路径,找到文件的 inode 号,然后通过这个 inode 号 获取文件的元数据以及文件的存储位置。

2.5.1 路径解析与文件系统一致性

文件系统需要确保在路径解析过程中保持一致性。例如,在路径解析时,如果文件或目录被删除或移动,操作系统需要更新目录项和 inode 信息,以保持文件系统的一致性和可靠性。很多现代文件系统通过 日志记录(journaling) 或 写时复制(Copy-on-Write) 技术确保路径解析和其他文件系统操作的原子性。

总结

路径解析是操作系统查找文件或目录在文件系统中的过程。根据给定的路径(无论是绝对路径还是相对路径),操作系统逐级查找目录项并通过 inode 号 获取文件的元数据和数据块。在符号链接存在的情况下,路径解析还需要处理链接的目标路径。路径解析涉及到文件系统中的 目录项 和 inode 表,并通过它们来定位文件的实际内容。

2.6 路径缓存

访问任何文件到要从/目录开始进行路径解析吗?原则上是,实际LinuxOS会缓存历史的路径结构,存在于一个数据结构对象struct dentry,本质上是一个多叉树结构。所有文件都有dentry结构,所有被打开的文件就可以在内存中形成树形结构。

2.7 挂载分区

挂载分区是将物理磁盘分区、光盘、USB 驱动器等存储设备与操作系统的文件系统结构相连接的过程。一旦挂载,操作系统可以将该分区或设备的文件与其它文件进行交互,就像它们是计算机本地的文件一样。挂载后,文件系统中的路径可以直接访问该分区的数据。

本人理解:实际就是将需要访问的设备或数据尾插入到目录,

  • 挂载命令

在大多数 Linux 系统中,可以使用 mount 命令挂载分区。基本的挂载命令格式如下:

mount <设备文件> <挂载点>

例如,要将设备 /dev/sdb1 挂载到 /mnt/usb 目录,可以使用以下命令:

sudo mount /dev/sdb1 /mnt/usb

  • 挂载选项

mount 命令可以使用不同的选项来控制挂载过程。例如:

-t:指定文件系统类型,如 ext4、ntfs、vfat 等。例如:

sudo mount -t ext4 /dev/sdb1 /mnt/usb

-o:指定挂载选项,如只读(ro)、读写(rw)、设置文件权限等。例如:

sudo mount -o ro /dev/sdb1 /mnt/usb

-a:挂载 /etc/fstab 中列出的所有文件系统。例如:

sudo mount -a

总结:挂载分区 是将物理分区或设备连接到操作系统目录结构中的过程,使得分区上的文件和目录能够在操作系统中被访问。

  1. 使用 mount 命令可以将设备挂载到指定的目录,挂载成功后,文件系统中的路径就能访问分区数据。
  2. 可以通过 /etc/fstab 配置文件设置自动挂载,确保分区在系统启动时自动挂载。
  3. 卸载分区 使用 umount 命令,这样可以确保文件系统完整性。
  4. 通过挂载分区,操作系统能够灵活地管理不同存储设备,使得用户能够方便地访问各类存储介质上的数据。

三. 最后

本文介绍了文件系统的基本概念及其在操作系统中的重要性。文件系统通过分区、块、inode等结构管理磁盘上的数据,并提供高效的数据存储与访问方式。重点讲解了ext2 文件系统,介绍了其基本架构、块组(Block Group)的设计与作用,以及 超级块、GDT、inode 位图 和 数据块等组成部分。文件路径解析和文件名映射也被详细说明,强调了操作系统如何通过 inode号定位文件数据块。最后,介绍了如何挂载分区,使不同存储设备的数据能与文件系统结构连接,便于访问和管理。

路虽远,行则将至;事虽难,做则必成

亲爱的读者们,下一篇文章再会!!! \color{Red}亲爱的读者们,下一篇文章再会!!! 亲爱的读者们,下一篇文章再会!!!


网站公告

今日签到

点亮在社区的每一天
去签到