news 2026/8/25 1:42:48

Ext 系列文件系统核心:块、分区、inode 与块组结构详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ext 系列文件系统核心:块、分区、inode 与块组结构详解

一. 文件系统的核心铺垫:块、分区、inode

在认识 Ext 系列文件系统之前,必须先掌握三个核心前置概念,它们是文件系统设计的基石。

1.1 块(Block):文件存取的最小单位

块的引入原因:

扇区是磁盘的最小物理存储单位(512 字节),但频繁操作单个扇区会导致系统调用过多(每次 IO 都要切换内核态),效率极低。因此文件系统引入 “块” 的概念,将连续的多个扇区打包成一个块,作为文件存取的最小单位。
块的关键特性:

验证块大小
通过stat命令可查看文件的块相关信息:

输出关键信息解读

注意

1.2 分区(Partition):磁盘的 “逻辑切片”

分区的核心作用:

一块物理磁盘容量可能很大(如 1TB),若全盘只装一个文件系统,一旦损坏会导致所有数据丢失。分区就是将磁盘按柱面(磁盘物理结构的核心)分割成多个独立的 “逻辑磁盘”,每个分区可单独格式化、挂载使用,实现数据隔离和灵活管理。
分区的本质:

实战查看分区信息:
通过fdisk命令查看系统分区:

柱面是分区的最小单位,我们可以利用参考柱面号码的方式来进行分区,其本质就是设置每个区的起始柱面和结束柱面号码。 此时我们可以将硬盘上的柱面(分区)进行平铺,将其想象成一个大的平面,如下图所示:

其实分区还可以继续分为一个个组,这个我们后面还会再讲的。

1.3 inode:文件属性的 “身份证”

inode 的核心作用:

文件 = 属性(元数据)+ 内容。文件的内容存储在块中,而文件的属性(所有者、权限、大小、创建时间、块映射关系等)需要单独存储 —— 这就是 inode(索引节点)的职责。
inode 的关键特性:

inode 结构核心字段(Ext2 示例):

struct ext2_inode { __le16 i_mode; // 文件权限(如0644) __le16 i_uid; // 所有者ID __le32 i_size; // 文件大小(字节) __le32 i_atime; // 最后访问时间 __le32 i_mtime; // 最后修改时间(内容) __le32 i_ctime; // 最后变更时间(属性) __le16 i_gid; // 所属组ID __le16 i_links_count; // 硬链接数 __le32 i_blocks; // 占用块数 __le32 i_block[15]; // 块映射指针(12直接+1一级间接+1二级间接+1三级间接) };

实战查看 inode 信息:
通过ls -li命令可查看文件的 inode 号:

开头的号码就是该文件的 inode 号,通过 inode 号可唯一定位文件。

二. Ext 系列文件系统核心:块组(Block Group)结构

Ext2/3/4 文件系统的核心设计是 “块组”—— 将一个分区进一步划分为多个大小相等的块组(类似 “小区划分”),每个块组包含完整的管理结构和数据存储区域。这种设计的优势是:分散风险(单个块组损坏不影响全局)、提升效率(IO 操作集中在单个块组,减少磁头移动)。

2.1 块组的整体结构

一个 Ext2 分区的结构如下(从磁盘起始位置到末尾):

2.2 块组内部核心构成(从管理到数据的完整链路)

每个块组就像一个 “独立的小文件系统”,内部结构层层递进,各司其职:

关键问题解答(也可以先看下面的再返回过来理解):

Linux 文件删除后,如何恢复,以及文件删除后需要注意什么?

Linux 文件删除后,核心是立即停止写入以避免数据覆盖,通过 extundelete、testdisk 等工具恢复未被覆盖的 inode 与数据块,而最关键的是日常做好备份,因为恢复是最后手段。

2.2.1 超级块(Super Block):文件系统的 “总配置文件”
/* * 超级块结构 */ struct ext2_super_block { __le32 s_inodes_count; /* Inodes总数 */ __le32 s_blocks_count; /* 块总数 */ __le32 s_r_blocks_count; /* 保留块数 */ __le32 s_free_blocks_count; /* 空闲块数 */ __le32 s_free_inodes_count; /* 空闲Inodes数 */ __le32 s_first_data_block; /* 第一个数据块 */ __le32 s_log_block_size; /* 块大小(对数形式) */ __le32 s_log_frag_size; /* 片段大小(对数形式) */ __le32 s_blocks_per_group; /* 每组的块数 */ __le32 s_frags_per_group; /* 每组的片段数 */ __le32 s_inodes_per_group; /* 每组的Inodes数 */ __le32 s_mtime; /* 挂载时间 */ __le32 s_wtime; /* 写入时间 */ __le16 s_mnt_count; /* 挂载次数 */ __le16 s_max_mnt_count; /* 最大挂载次数 */ __le16 s_magic; /* 魔数签名(0xEF53) */ __le16 s_state; /* 文件系统状态 */ __le16 s_errors; /* 错误检测时的行为 */ __le16 s_minor_rev_level; /* 次修订级别 */ __le32 s_lastcheck; /* 上次检查时间 */ __le32 s_checkinterval; /* 检查最大间隔时间 */ __le32 s_creator_os; /* 创建操作系统 */ __le32 s_rev_level; /* 修订级别 */ __le16 s_def_resuid; /* 保留块的默认用户ID */ __le16 s_def_resgid; /* 保留块的默认组ID */ /* * 以下字段仅用于EXT2_DYNAMIC_REV版本的超级块 * * 注意:兼容特性集与不兼容特性集的区别在于, * 如果不兼容特性集中有内核不认识的位,内核应拒绝挂载该文件系统。 * * e2fsck的要求更严格:如果它不知道兼容或不兼容特性集中的某个特性, * 它必须中止,并且不尝试修改它不理解的内容... */ __le32 s_first_ino; /* 第一个非保留inode编号 */ __le16 s_inode_size; /* inode结构大小 */ __le16 s_block_group_nr; /* 当前超级块所在的块组号 */ __le32 s_feature_compat; /* 兼容特性集 */ __le32 s_feature_incompat; /* 不兼容特性集 */ __le32 s_feature_ro_compat; /* 只读兼容特性集 */ __u8 s_uuid[16]; /* 128位卷UUID */ char s_volume_name[16]; /* 卷名称 */ char s_last_mounted[64]; /* 上次挂载的目录 */ __le32 s_algorithm_usage_bitmap; /* 压缩算法使用位图 */ /* * 性能提示。仅当EXT2_COMPAT_PREALLOC标志开启时, * 目录预分配才会生效。 */ __u8 s_prealloc_blocks; /* 尝试预分配的块数 */ __u8 s_prealloc_dir_blocks; /* 为目录预分配的块数 */ __u16 s_padding1; /* 填充 */ /* * 日志支持(当EXT3_FEATURE_COMPAT_HAS_JOURNAL设置时有效) */ __u8 s_journal_uuid[16]; /* 日志超级块UUID */ __u32 s_journal_inum; /* 日志文件的inode编号 */ __u32 s_journal_dev; /* 日志文件的设备编号 */ __u32 s_last_orphan; /* 待删除inode列表的起始 */ __u32 s_hash_seed[4]; /* HTREE哈希种子 */ __u8 s_def_hash_version; /* 默认使用的哈希版本 */ __u8 s_reserved_char_pad; /* 保留字符填充 */ __u16 s_reserved_word_pad; /* 保留字填充 */ __le32 s_default_mount_opts; /* 默认挂载选项 */ __le32 s_first_meta_bg; /* 第一个元数据块组 */ __u32 s_reserved[190]; /* 填充到块末尾 */ };
2.2.2 块组描述符表(GDT:Group Descriptor Table)
块组0: | 超级块 | GDT | 块位图 | inode位图 | inode表 | 数据块 | 块组1: | 超级块备份 | GDT备份 | 块位图 | inode位图 | inode表 | 数据块 | 块组3: | 超级块备份 | GDT备份 | 块位图 | inode位图 | inode表 | 数据块 | 块组5: | 超级块备份 | GDT备份 | 块位图 | inode位图 | inode表 | 数据块 | 块组7: | 超级块备份 | GDT备份 | 块位图 | inode位图 | inode表 | 数据块 | ...
/* * 块组描述符结构(磁盘级) */ struct ext2_group_desc { __le32 bg_block_bitmap; /* 块位图所在块号 */ __le32 bg_inode_bitmap; /* Inode位图所在块号 */ __le32 bg_inode_table; /* Inode表起始块号 */ __le16 bg_free_blocks_count; /* 空闲块数量 */ __le16 bg_free_inodes_count; /* 空闲Inode数量 */ __le16 bg_used_dirs_count; /* 目录数量(已使用的目录项) */ __le16 bg_pad; /* 填充对齐 */ __le32 bg_reserved[3]; /* 保留字段 */ };
2.2.3 块位图(Block Bitmap):块的 “占用状态记录表”
字节0: [bit7][bit6][bit5][bit4][bit3][bit2][bit1][bit0] 第8块 第7块 第6块 第5块 第4块 第3块 第2块 第1块 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ 最高位 ←-------- 字节内比特位顺序 --------→ 最低位
2.2.4 inode 位图(Inode Bitmap):inode 的 “占用状态记录表”
2.2.5 inode 表(Inode Table):inode 的 “存储仓库”
2.2.6 数据块(Data Blocks):文件内容的 “存储区域”

三. 文件系统的核心工作流程:创建一个文件的底层逻辑(其它的就不展示了)

结合上述结构,我们以创建一个普通文件(touch test.txt)为例,看看文件系统的底层操作流程:

整个过程中,文件系统通过块位图、inode 位图快速定位空闲资源,通过 inode 关联文件属性与内容,通过目录维护文件名与 inode 的映射,高效完成文件创建。

4 个步骤

补充几个核心注意事项:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 16:51:15

基于STM32单片机的的电烙铁自动供丝装置设计-直流电机控制加减速正反转控制系统+拨动开关控制继电器外接发热电阻设计26-056

26-056、基于STM32单片机的的电烙铁自动供丝装置设计-直流电机控制加减速正反转控制系统拨动开关控制继电器外接发热电阻设计产品功能描述:本系统由STM32F103C8T6单片机核心板、L298N电机驱动、按键、拨动开关控制继电器外接发热电阻以及电源组成。1、通过按键可以控…

作者头像 李华
网站建设 2026/7/14 16:51:30

基于卡尔曼滤波器的电池充电状态估计研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/7/14 16:51:20

竞赛.算法

前缀和一、什么是前缀和前缀和(Prefix Sum) 是一种预处理数组的技巧,核心是用空间换时间,把多次区间求和从 O (n) 降到 O (1)。二、一维前缀和(最常用)1. 定义原数组:a[1..n](下标从…

作者头像 李华
网站建设 2026/7/14 16:51:31

大模型+知识图谱行业落地(非常详细),民航维修检索生成从入门到精通,收藏这一篇就够了!

摘要:本研究创新性地融合大语言模型、知识图谱技术及重排序方法,旨在以低成本、高质量实现民航维修历史方案检索与推荐方案生成,优化维修决策,提升维修效率与质量。研究利用大模型的分析推理能力,借助定制化知识图谱检…

作者头像 李华