1.1
超级块(Super

“大脑”,存储了整个分区的全局配置信息,相当于一本
“系统说明书”。
任何对文件系统的操作(如创建文件、分配块、挂载分区),都需要先读取超级块的信息,确认系统状态和资源情况。
1.1.1Linux
ext2_super_block),包含了数十个字段,核心信息如下(C
语言简化版):
代码语言:javascript
AI代码解释
#include<stdint.h>
每个块组的inode数(默认1024)
uint32_t
最大挂载次数(超过后需执行e2fsck检查)
uint16_t
魔术数(Ext2标识:0xEF53)
uint16_t
文件系统状态(0x0001=干净,0x0002=错误)
uint16_t
inode大小(128或256字节)
uint8_t
};
这些字段看似繁杂,实则可归纳为三类核心信息:
- 资源总量:
s_inodes_count(inode总数)、
s_blocks_count(块总数)定义了文件系统的最大存储能力; - 资源状态:
s_free_blocks_count(空闲块数)、s_free_inodes_count(空闲inode
数)实时反映资源剩余情况,创建文件时需先检查这两个值;
- 配置参数:
s_log_block_size(块大小)、s_inode_size(inode大小)、
s_blocks_per_group(每块组块数)等,决定了文件系统的存储格式和管理方式; - 状态标识:
s_magic(魔术数)用于内核识别文件系统类型,s_state(系统状态)标记文件系统是否正常,避免异常挂载导致数据损坏。
1.1.2
“命脉”,一旦损坏,整个分区可能无法挂载。
为了提高可靠性,Ext2
“主备份
的机制:
- 主超级块:存储在块组
的起始位置,是文件系统挂载时优先读取的版本;
- 备份超级块:在块组
1、3、5、7
等质数编号的块组中,会存储超级块的副本(质数编号可避免备份集中在同一物理区域,降低同时损坏的风险)。
所有超级块副本的数据完全一致,当主超级块损坏时,可以通过备份超级块修复文件系统。
例如,若块大小为
4KB(s_log_block_size=2),块组
0,块组
8192(s_blocks_per_group=8192),修复命令如下:
代码语言:javascript
AI代码解释
#e2fsck:Ext系列文件系统修复工具,-b指定备份超级块的块号
e2fsck
/dev/vda1
1.1.3Linux
中,dumpe2fs命令可读取
Ext2/Ext3/Ext4
磁盘镜像为例:
代码语言:javascript
AI代码解释
#if=/dev/zero
size"
输出示例:
代码语言:javascript
AI代码解释
Filesystemmagic
总inode数(每个块组1280个)
Free
inode大小128字节
这些输出与超级块结构中的字段一一对应,验证了超级块的核心作用。
1.2
块组描述符表(GDT):块组的
“索引数
};
核心字段解读:
- 管理结构位置:
bg_block_bitmap(块位图块号)、bg_inode_bitmap(inode位图块号)、
bg_inode_table(inodeGDT
通过它们,文件系统可以快速定位块组内的关键管理结构,无需遍历整个块组;
- 资源状态:
bg_free_blocks_count(块组空闲块数)、bg_free_inodes_count(块组空闲inode
数),文件系统分配资源时会优先选择空闲资源充足的块组,提高访问效率;
- 数),用于快速统计块组内的、lost+found
inode
“数据库”,由多个连续的块组成,每个块中存储多个
inode(inode
字节)。
每个文件(包括文件
:存储“文件名→inode
号);
- 软链接文件:存储原文件的路径字符串(如
“../test.c”);
- 设备文件
管道文件
:不存储实际数据,仅存储设备号或管道相关的元信息。
数据块的分配遵循
“连续优先”
原则:文件系统会尽量为文件分配连续的数据块,减少磁头移动次数,提高读写效率。
若连续块不足,则分配离散块,通过
inode
数据块的大小选择
数据块的大小(1KB/2KB/4KB/8KB)在格式化时指定,选择合适的块大小对性能影响显著:
- 小
block(1KB/2KB)
:适合小文件较多的场景(如日志文件、配置文件),减少内部碎片(文件大小不足一个块时的空间浪费); - 大
block(4KB/8KB)
:适合大文件较多的场景(如视频、数据库文件),减少块数量,降低inode
中块指针的开销,提高连续读写效率。
例如,一个
1MB
的文件:
- 若块大小为
1KB,需占用
个块指针(需用到间接块);
- 若块大小为
4KB,仅需占用
12×4KB=48KB,超过后需用间接块)。


