ext2(Second Extended File System)是Linux早期广泛使用的文件系统,虽然现在已被ext3/ext4取代,但其基本结构仍是理解现代Linux文件系统的基础。
ext2文件系统的物理存储结构可以分为以下几个主要部分:
ext2将整个分区划分为多个块组,每个块组包含:
+-----------------------+
| 超级块 (可能有备份) |
+-----------------------+
| 块组描述符表 |
+-----------------------+
| 块位图 |
+-----------------------+
| inode位图 |
+-----------------------+
| inode表 |
+-----------------------+
| 数据块 |
+-----------------------+
struct ext2_super_block {
__le32 s_inodes_count; // inode总数
__le32 s_blocks_count; // 块总数
__le32 s_r_blocks_count; // 保留块数
__le32 s_free_blocks_count; // 空闲块数
__le32 s_free_inodes_count; // 空闲inode数
__le32 s_first_data_block; // 第一个数据块
__le32 s_log_block_size; // 块大小(0=1KB,1=2KB,2=4KB)
__le32 s_blocks_per_group; // 每块组块数
__le32 s_inodes_per_group; // 每块组inode数
__le32 s_magic; // 魔数(0xEF53)
// ... 其他字段 ...
};
struct ext2_inode {
__le16 i_mode; // 文件类型和权限
__le16 i_uid; // 用户ID低16位
__le32 i_size; // 大小(字节)
__le32 i_atime; // 最后访问时间
__le32 i_ctime; // 创建时间
__le32 i_mtime; // 最后修改时间
__le32 i_dtime; // 删除时间
__le16 i_gid; // 组ID低16位
__le16 i_links_count; // 硬链接数
__le32 i_blocks; // 512字节块数
__le32 i_block[15]; // 数据块指针(12直接+3间接)
// ... 其他字段 ...
};
struct ext2_dir_entry {
__le32 inode; // inode号
__le16 rec_len; // 目录条目长度
__le16 name_len; // 文件名长度
char name[]; // 文件名(变长)
};
ext2采用多级索引方式管理文件数据块:
查看ext2文件系统结构的工具:
# 查看超级块信息
dumpe2fs /dev/sda1
# 调试文件系统
debugfs /dev/sda1
# 在debugfs中的有用命令
stats # 显示超级块信息
stat <file> # 显示文件inode信息
ncheck <inode> # 根据inode号查找文件名
ext2物理结构设计考虑了以下性能因素:
ext2作为经典的文件系统,其物理存储结构设计对理解现代文件系统仍有重要参考价值。