EXT2文件系统结构与磁盘管理详解
EXT2文件系统核心机制
EXT2(Second Extended File System)是Linux系统中广泛采用的传统文件系统,其设计源自Minix文件系统并进行了功能扩展。该文件系统以高效的数据存取性能著称,通过索引节点(inode)实现对文件的唯一标识与管理。
磁盘物理结构与分区原理
硬盘由多个物理组件构成:旋转的磁盘盘片、机械臂及其上的读写头、以及驱动盘片高速旋转的主轴马达。数据以最小单位"扇区"(Sector)存储,每个扇区固定为512字节。多个扇区组成一个磁柱(Cylinder),磁柱是逻辑分区的基本单位。
磁盘的第一个扇区至关重要,包含:
- 主引导记录(MBR):占用446字节,负责系统启动加载
- 分区表(Partition Table):占64字节,记录各分区信息
在Linux中,不同接口的磁盘设备命名规则如下:
/dev/sd[a-p][1-15]:适用于SCSI、SATA、U盘等新型接口设备/dev/hd[a-d][1-63]:传统IDE接口设备的命名方式
虚拟磁盘创建与文件系统初始化
可通过以下命令在指定设备上创建EXT2文件系统:
mke2fs [-b blksize -N inodes] device blocks
其中:
blksize:指定块大小,默认为1KBinodes:指定索引节点数量,若未指定则根据块数自动计算device:可为真实磁盘或虚拟文件
示例:创建一个1440个1KB块的虚拟软盘文件系统:
dd if=/dev/zero of=vdisk bs=1024 count=1440
mke2fs vdisk 1440
块组与块组描述符
EXT2将磁盘划分为若干"块组"(Block Group),每组通常包含8192个数据块(约32KB)。每个块组由一个块组描述符结构体进行管理,关键字段包括:
bg_block_bitmap:指向该组的块位图bg_inode_bitmap:指向索引节点位图bg_inode_table:指向索引节点表起始位置
对于小容量虚拟磁盘(如1440块),仅需一个块组,其余描述符字段置零;大容量磁盘则可能跨多个块存放描述符。
索引节点(Inode)结构与布局
每个文件对应一个128字节(EXT4为256字节)的索引节点,用于存储文件元信息。其核心字段为block[15]数组,支持多级间接寻址:
- 直接块:
block[0]到block[11]直接指向数据块 - 一次间接块:
block[12]指向一个包含256个块号的中间块 - 二次间接块:
block[13]指向一个块表,每个条目再指向256个块 - 三次间接块:
block[14]支持更深层嵌套,适用于大型文件系统
索引节点按固定大小排列,确保每块可容纳整数个节点。例如,在默认配置下,共184个索引节点,分布在23个索引节点块中(从B10至B32)。索引节点编号从1开始,0表示无有效节点。根目录的inode编号为2,且所有数据块编号也从1起始,块0保留未使用。
数据块与目录项组织
在索引节点块之后是实际数据存储区域。以184个inode为例,首个可用数据块为B33,即根目录的首个数据块。
目录项由ext2_dir_entry_2结构体表示:
struct ext2_dir_entry_2 {
u32 inode; // 索引节点编号(从1开始)
u16 rec_len; // 本条目的长度(字节)
u8 name_len; // 文件名长度(字节)
u8 file_type; // 文件类型(保留)
char name[EXT2_NAME_LEN]; // 名称(1–255字符,无结尾空字符)
}
该结构为可变长度格式,名称不以空字符结尾,因此每条目长度由rec_len动态决定。