当前位置: 首页 > article >正文

Linux下ext2文件系统

文章目录

      • 一 :penguin:基本概述
      • 二 :star: ext2文件系统
        • :star:​ 1. :star:​Boot Block(引导块)
          • 位置与作用
      • 三 Block Group(块组)
        • :star:​1.:star:​ Super Block(超级块)
        • :star:​2.:star:​ Group Descriptor(块组描述符)
        • :star:​3. :star:Block Bitmap(​块位图)
        • :star:​4. :star: inode Bitmap(inode位图)
        • :star:​5. :star:inode table(inode 表)
        • :star:​6. :star: DataBlocks(数据区)
          • :full_moon_with_face:实际存放的内容
          • :full_moon_with_face:存放的大小

在这里插入图片描述

一 🐧基本概述

ext2(Second Extended File System)是Linux操作系统中经典的文件系统类型之一,它在早期的Linux系统中被广泛使用,为文件和目录在磁盘等存储介质上的存储、管理以及访问提供了一套完善的机制。

二 ⭐️ ext2文件系统

Linux ext2文件系统,磁盘文件系统图
table

⭐️​ 1. ⭐️​Boot Block(引导块)

一个分区至少含有一个Boot Block(引导块),其它为Block Group.

位置与作用

Boot Block通常位于磁盘分区的最开始部分,也就是在整个ext2文件系统所在磁盘分区的起始位置,在超级块(Super Block)之前。它主要用于存放引导程序相关的代码和数据,起着引导操作系统启动的关键作用。

当计算机开机启动时,BIOS(基本输入输出系统)会首先执行硬件自检等初始化操作,之后它会按照预设的启动顺序去查找可引导的设备(比如硬盘)。一旦找到硬盘,BIOS就会将硬盘分区开头处的Boot Block加载到内存中,并将控制权转交给其中的引导程序代码。这个引导程序随后会进一步引导操作系统内核进行加载、初始化等后续启动流程,从而让整个计算机系统正常运转起来。

三 Block Group(块组)

ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
位于Linux/fs/ext2/ext2.h

⭐️​1.⭐️​ Super Block(超级块)

存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息

// 定义ext2文件系统的超级块结构体
struct ext2_super_block {
    // 以下是文件系统中inode(索引节点)的总数
    __le32 s_inodes_count;        /* Inodes count */

    // 文件系统中总的块(Blocks)数量,用于衡量磁盘分区存储容量大小(以块为单位)
    __le32 s_blocks_count;        /* Blocks count */

    // 文件系统中当前空闲的块(Blocks)数量,操作系统可据此知晓还有多少块可用于分配给新文件等操作
    __le32 s_free_blocks_count;   /* Free blocks count */

    // 文件系统中当前空闲的inode(索引节点)数量,用于判断是否还能创建新的文件或目录等(每个文件/目录需对应一个inode)
    __le32 s_free_inodes_count;   /* Free inodes count */

    // 以2为底的对数形式表示块(Block)大小,例如,若值为10,则块大小为2^10 = 1024字节,用于确定数据存储基本单元的大小
    __le32 s_log_block_size;      /* Block size */
	..........
	..........
	.........
};
⭐️​2.⭐️​ Group Descriptor(块组描述符)

块组描述符就像是块组的 “管家”,它详细记录了本块组内各种资源(如数据块、inode 等)的使用情况以及关键结构(位图、表等)的位置信息,操作系统在对块组进行操作管理时,首先会读取块组描述符来获取这些基础信息,以便做出合理的资源分配决策等。

struct ext2_group_desc {
    // 本块组内数据块(Blocks)位图所在的块号,通过这个块号可以定位到块位图(Block Bitmap),
    __le32 bg_block_bitmap;        /* Blocks bitmap block */

    // 本块组内inode(索引节点)位图所在的块号,据此能找到inode位图(inode Bitmap),
    __le32 bg_inode_bitmap;        /* Inodes bitmap block */

    // 本块组内inode表(Inodes table)所在的块号,通过这个块号可以定位到inode表,
    __le32 bg_inode_table;         /* Inodes table block */

    // 本块组内当前空闲的数据块(Blocks)数量统计,操作系统可以据此快速了解当前块组还有多少数据块可供分配,
    __le16 bg_free_blocks_count;   /* Free blocks count */

    // 本块组内当前空闲的inode(索引节点)数量统计,结合块组内总的inode数量以及已使用的情况,。
    __le16 bg_free_inodes_count;   /* Free inodes count */

    // 本块组内已使用的目录(Directories)数量统计,记录了该块组中包含的目录个数,
    __le16 bg_used_dirs_count;     /* Directories count */
	......
	......
	......
};
⭐️​3. ⭐️Block Bitmap(​块位图)

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

  • 🌹它采用二进制位(bit)来表示每个数据块的使用状态。具体而言,块位图中的每一位都与块组内的一个具体数据块相对应,其中:
    • 🌹如果某一位的值为 1,则表示对应的那个数据块已经被占用,即该数据块正在被某个文件用来存储数据内容,不可再分配给其他文件使用。
    • 🌹如果某一位的值为 0,则意味着对应的那个数据块目前处于空闲状态,可供后续创建的文件分配使用,文件系统在为新文件分配磁盘空间时,就会查找这些值为 0 的位对应的空闲数据块进行分配。
⭐️​4. ⭐️ inode Bitmap(inode位图)

使得文件系统能够快速知晓哪些 inode 是空闲的、可分配给新创建的文件或目录使用,哪些 inode 已经被占用,正用于记录已有文件或目录的属性信息等。

  • 🌹采用二进制位(bit)来呈现每个 inode 的使用状态。具体来说,inode 位图中的每一位都与块组内的一个具体 inode 相对应,其中:
    • 🌹 如果某一位的值为 1,则表示对应的那个 inode 已经被占用,意味着该 inode 已被分配给某个文件或目录,用于记录诸如文件权限、所有者、大小以及指向数据块的指针等属性信息,不可再分配给其他文件或目录使用了。
    • 🌹 如果某一位的值为 0,则代表对应的那个 inode 目前处于空闲状态,可供后续创建的文件或目录分配使用。例如,当需要创建一个新文件时,文件系统会扫描 inode 位图,查找值为 0 的位对应的空闲 inode,然后将其分配给新文件,并更新该位为 1,以标记此 inode 已被占用。
⭐️​5. ⭐️inode table(inode 表)

inode 表(inode table)是 ext2 文件系统中每个块组(Block Group)内用于存放该块组内所有文件和目录对应的 inode(索引节点)的区域。
inode 表本质上是由一系列连续存储的 ext2_inode 结构体组成的数组,每个 ext2_inode 结构体对应一个文件或目录。

struct ext2_inode {
    // 文件模式,用于表示文件的类型(如普通文件、目录、符号链接等)以及相应的权限设置(可读、可写、可执行等权限),
    __le16 i_mode;                /* File mode */

    // 文件所有者的用户ID(uid)的低16位,用于标识该文件所属的用户,与系统的用户管理机制相结合,
    __le16 i_uid;                 /* Low 16 bits of Owner Uid */

    // 文件的大小,以字节为单位,明确了该文件所包含的数据量大小,这对于文件读写操作时确定读取或写入的范围等操作很关键,
    __le32 i_size;                /* Size in bytes */

    // 文件最后一次被访问的时间,以时间戳的形式记录,便于系统统计文件的使用活跃度、了解文件的访问历史,
    __le32 i_atime;               /* Access time */

    // 文件的创建时间,记录文件在文件系统中最初生成的时间点,对于追踪文件的来源、了解文件系统的历史变更等方面有一定帮助,
    __le32 i_ctime;               /* Creation time */
	.....
	.....
	.....   
};
⭐️​6. ⭐️ DataBlocks(数据区)
🌝实际存放的内容
  1. 🌝普通文件的数据内容
    对于普通文件来说,数据块区存放的就是文件所包含的实际数据。例如:

    • 🌹文本文件:像 .txt 文件,其包含的文字字符信息会按照一定的编码方式(如 ASCII、UTF-8 等)依次存放在数据块中。比如一个简单的文本文件内容为 “Hello, world!”,这些字符对应的二进制编码就会被顺序存储在某个或某些数据块里。
  2. 🌝 目录文件的数据内容
    目录在 ext2 文件系统中也是一种特殊的文件,其数据块区存放的是目录项(Directory Entry)信息。每个目录项主要包含两部分关键内容:

    • 🌹文件名:记录了该目录下包含的文件或子目录的名称,
    • 🌹对应 inode 编号:通过文件名关联其对应的 inode 编号,以此建立起从文件名到文件实际属性和数据存储位置(通过 inode 去查找)的映射关系。
🌝存放的大小
  1. 🌹数据块大小设定
    数据块区中数据块的大小是在文件系统创建(格式化磁盘分区时)被设定的,常见的规格有 1024 字节(1KB)、2048 字节(2KB)、4096 字节(4KB)等 一般为4KB)。

  2. 🌹文件数据占用数据块数量及大小情况

    • 小文件:如果一个文件的数据量小于设定的数据块大小,那么该文件的数据只占用一个数据块,这个数据块剩余的空间暂时处于未使用状态(但在文件系统层面仍将整个数据块视为被该文件占用)
    • 大文件:对于数据量较大的文件,会根据文件系统采用的分配算法(如连续分配、链式分配、索引分配等,前面已介绍过)占用多个数据块。

在这里插入图片描述


http://www.kler.cn/a/500470.html

相关文章:

  • Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用
  • 根据浏览器的不同类型动态加载不同的 CSS 文件
  • 2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉
  • Java多线程
  • Kotlin 协程基础九 —— SharedFlow 与 StateFlow
  • 【复习小结】14-21
  • ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技
  • 鸿蒙面试 2025-01-11
  • 一个基于Spring Boot的智慧养老平台
  • Python 正则表达式完全指南
  • Spring Boot项目中如何使用日志记录
  • Mac——Docker desktop安装与使用教程
  • 2013年下半年试题四:论分布式存储系统架构设计及其实现
  • 【Linux网络编程】网络层 | IP协议 | 网段划分 | 私有IP和公有IP | NAT技术
  • ollama大模型API调用接口
  • Web前端界面开发
  • 如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦
  • Spring Boot 和微服务:快速入门指南
  • acwing_3196_I‘m stuck
  • 每天40分玩转Django:问题解答(一)
  • 07-MQ高级
  • mac学习芋道源码记录
  • 性能优化案例:通过增加 shuffle 分区的数量来解决 PySpark 中的数据倾斜
  • 37_Lua运算符