Linux下ext2文件系统

文章目录

      • [一 :penguin:基本概述](#一 :penguin:基本概述)
      • [二 :star: ext2文件系统](#二 :star: ext2文件系统)
        • [:star:​ 1. :star:Boot Block(引导块)](#:star: 1. :star:Boot Block(引导块))
      • [三 Block Group(块组)](#三 Block Group(块组))
        • [:star:​1.:star:​ Super Block(超级块)](#:star:1.:star: Super Block(超级块))
        • [:star:​2.:star:​ Group Descriptor(块组描述符)](#:star:2.:star: Group Descriptor(块组描述符))
        • [:star:​3. :star:Block Bitmap(块位图)](#:star:3. :star:Block Bitmap(块位图))
        • [:star:​4. :star: inode Bitmap(inode位图)](#:star:4. :star: inode Bitmap(inode位图))
        • [:star:​5. :star:inode table(inode 表)](#:star:5. :star:inode table(inode 表))
        • [:star:​6. :star: DataBlocks(数据区)](#:star:6. :star: DataBlocks(数据区))

一 🐧基本概述

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

二 ⭐️ ext2文件系统

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

⭐️​ 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的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息

c 复制代码
// 定义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 等)的使用情况以及关键结构(位图、表等)的位置信息,操作系统在对块组进行操作管理时,首先会读取块组描述符来获取这些基础信息,以便做出合理的资源分配决策等。

c 复制代码
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 结构体对应一个文件或目录。

c 复制代码
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. 🌹文件数据占用数据块数量及大小情况

    • 小文件:如果一个文件的数据量小于设定的数据块大小,那么该文件的数据只占用一个数据块,这个数据块剩余的空间暂时处于未使用状态(但在文件系统层面仍将整个数据块视为被该文件占用)
    • 大文件:对于数据量较大的文件,会根据文件系统采用的分配算法(如连续分配、链式分配、索引分配等,前面已介绍过)占用多个数据块。
相关推荐
不想睡觉_6 分钟前
21天学通C++第八章——指针
开发语言·c++
我命由我1234518 分钟前
Android Studio 警告信息:Use start instead of left to ensure...
android·java·开发语言·ide·java-ee·android studio·android-studio
沈剑心23 分钟前
gson很好,但我劝你在Kotlin上使用kotlinx.serialization
android·java·kotlin
V+zmm1013424 分钟前
基于java的餐厅点餐系统微信小程序ssm+论文源码调试讲解
java·数据库·微信小程序·小程序·毕业设计
love静思冥想26 分钟前
在 CentOS/Red Hat Linux 中安装 Docker
linux·docker·centos
Good Note28 分钟前
Golang笔记——Interface类型
后端·golang·秋招·开发·校招·服务端·春招
DZSpace32 分钟前
升级 CentOS 7.x 系统内核到 4.4 版本
linux·运维·centos
C1829818257533 分钟前
es分页查询
大数据·数据库·elasticsearch
automan0234 分钟前
windows10 安装 Golang 版本控制工具g与使用
开发语言·后端·golang
小光学长41 分钟前
基于vue框架的的校园生活服务平台8vwac(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库