前言
在 Linux 世界中,Ext 系列文件系统是存储基石,而 Ext2 作为该系列的经典代表,其设计思想直接影响了后续的 Ext3、Ext4 版本。文件的属性和内容是如何分离存储的?'块'和'inode'到底是什么角色?Ext2 如何通过'块组'实现高效的磁盘管理?今天这篇文章,我们就从基础概念出发,一步步揭开 Ext2 文件系统的神秘面纱。
本文介绍了 Linux 系统中 Ext2 文件系统的核心架构。首先阐述了块(Block)、分区(Partition)和 inode(索引节点)三大基础概念及其特性与实战查看方法。随后深入分析了 Ext2 基于块组(Block Group)的高效设计,包括宏观结构、块组组成及超级块、位图等组件的作用。文章还总结了 Ext2 在资源管理、可靠性和扩展性方面的优势,指出其设计思想对后续 Ext3、Ext4 及 XFS 等文件系统的影响。

在 Linux 世界中,Ext 系列文件系统是存储基石,而 Ext2 作为该系列的经典代表,其设计思想直接影响了后续的 Ext3、Ext4 版本。文件的属性和内容是如何分离存储的?'块'和'inode'到底是什么角色?Ext2 如何通过'块组'实现高效的磁盘管理?今天这篇文章,我们就从基础概念出发,一步步揭开 Ext2 文件系统的神秘面纱。
在深入 Ext2 文件系统之前,我们必须先搞懂三个核心基础概念——块(Block)、分区(Partition)、inode(索引节点)。这三个概念是理解 Ext2 架构的前提。
我们知道,磁盘的最小物理存储单位是扇区(Sector),每个扇区固定为 512 字节。但如果操作系统每次都以扇区为单位读写数据,效率会非常低下。为了解决这个问题,文件系统引入了块(Block)的概念:将多个连续的扇区'打包'成一个更大的存储单元,这个单元就是块。块是文件系统中文件存取的最小单位,其大小在格式化时确定,常见的块大小为 4KB(即 8 个连续扇区)。
在 Linux 系统中,我们可以通过 stat 命令查看文件的块相关信息。
stat main.c
关键信息解读:
Size: 488:文件实际大小为 488 字节;Blocks: 8:文件占用 8 个'磁盘块'(这里的'Blocks'是指文件系统的块,每个块 4KB,8 个块实际占用 32KB 空间);IO Block: 4096:文件系统的块大小为 4096 字节(4KB)。
为什么 488 字节的文件会占用 8 个块?因为文件系统是以块为单位分配存储空间的,即使文件大小不足一个块,也会占用一整个块(这就是'内部碎片'的来源)。
一块物理磁盘的容量可能很大,如果将所有数据都存储在一个'大空间'里,会导致文件系统管理混乱。为了解决这个问题,我们引入了**分区(Partition)**的概念:将物理磁盘划分为多个独立的'逻辑区域',每个分区可以单独格式化、单独管理。
分区是块的'上层容器':一个分区被格式化后,会被划分为多个连续的块,块的编号在分区内从 0 开始递增,不同分区的块编号相互独立。
在 Linux 系统中,fdisk 命令是查看磁盘分区信息的常用工具:
fdisk -l
命令输出示例:
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000b2d99 Device Boot Start End Blocks Id System /dev/vda1 * 2048 83875364 41936658+ 83 Linux
关键信息解读:
Disk /dev/vda: 42.9 GB:物理磁盘/dev/vda的总容量为 42.9GB;Sectors: 83886080:磁盘总扇区数为 83,886,080 个;Device /dev/vda1:第一个分区(逻辑设备名);Start: 2048:分区起始扇区(LBA 地址 2048);End: 83875364:分区结束扇区(LBA 地址 83,875,364);Blocks: 41936658+:分区包含的块数;System: Linux:分区类型为 Linux(通常对应 Ext 系列文件系统)。
我们知道,文件 = 数据(内容) + 属性(元信息)。文件的数据存储在'块'中,那么文件的属性(如文件名、所有者、权限、创建时间、大小、占用的块号等)存储在哪里呢?答案是inode(索引节点):inode 是文件系统中存储文件属性的'数据结构',每个文件对应一个唯一的 inode。
Ext2 文件系统的 inode 结构定义在 Linux 内核源码中(struct ext2_inode),核心字段如下(C 语言代码):
#include <stdint.h>
// Ext2 inode 结构(简化版)
struct ext2_inode {
uint16_t i_mode; // 文件类型与权限
uint16_t i_uid; // 所有者 ID(低 16 位)
uint32_t i_size; // 文件大小(字节)
uint32_t i_atime; // 最后访问时间
uint32_t i_ctime; // 创建时间
uint32_t i_mtime; // 最后修改时间
uint32_t i_dtime; // 删除时间
uint16_t i_gid; // 所属组 ID(低 16 位)
uint16_t i_links_count; // 硬链接数
uint32_t i_blocks; // 占用的块数
uint32_t i_flags; // 文件标志
union {
struct { uint32_t l_i_reserved1; } linux1;
} osd1;
uint32_t i_block[15]; // 块指针
uint32_t i_generation; // 文件版本
uint32_t i_file_acl; // 文件 ACL
uint32_t i_dir_acl; // 目录 ACL
uint32_t i_faddr; // 碎片地址
union {
struct {
uint8_t l_i_frag;
uint8_t l_i_fsize;
uint16_t i_pad1;
uint16_t l_i_uid_high;
uint16_t l_i_gid_high;
uint32_t l_i_reserved2;
} linux2;
} osd2;
};
#define EXT2_NDIR_BLOCKS 12
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
核心字段解读:
i_mode:文件类型和权限;i_size:文件的实际大小;i_atime/i_ctime/i_mtime:文件的三个关键时间戳;i_links_count:文件的硬链接数;i_block[15]:最核心的字段,存储文件数据块的指针。
在 Linux 系统中,ls -li 命令可以查看文件的 inode 号和详细属性:
ls -li main.c
命令输出示例:
1052007 -rw-rw-r-- 1 user user 488 Oct 17 19:06 main.c
关键信息解读:
1052007:文件的 inode 号;-rw-rw-r--:文件类型和权限;1:硬链接数;user user:所有者和所属组;488:文件大小;Oct 17 19:06:最后修改时间。
此外,stat 命令也能查看更详细的 inode 信息。
Ext2 的核心设计思想是'分而治之':将一个分区划分为多个大小相等的'块组(Block Group)',每个块组包含独立的管理结构和数据存储区域。
从宏观上看,一个 Ext2 文件系统的分区结构如下:
引导块(Boot Block):大小固定为 1KB,存储磁盘分区表和系统引导程序; 块组 0(Block Group 0):第一个块组,包含完整的管理结构,是文件系统的'核心控制区'; 块组 1~ 块组 N(Block Group 1 ~ Block Group N):其他块组,结构与块组 0 一致; 保留块(Reserved Blocks):预留的一部分块,仅 root 用户可使用。
每个块组的内部结构完全相同,这是 Ext2 文件系统的一大特点。
块组是 Ext2 文件系统的核心管理单元,就像一个'独立的小文件系统',每个块组包含以下 6 个关键组成部分:
每个块组的大小由'每个块组的块数'决定,默认情况下,Ext2 会将分区划分为多个块组,每个块组包含 8192 个块(以 4KB 块为例,每个块组大小为 32MB)。
s_feature_compat、s_feature_incompat 等字段支持新特性。Ext2 文件系统的设计思想是'分而治之'和'高效索引',通过块组分区减少磁头移动,通过位图管理提高资源操作效率,通过备份机制保证可靠性。这些设计思想不仅影响了后续的 Ext3、Ext4 文件系统,也为其他文件系统(如 XFS、Btrfs)提供了参考。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online