ext2分区划分的基本单位是block,磁盘上前1024byte是boot block,记录操作系统在分区中的位置。
之后的空间划分为多个block group(一般代表柱面组)。每个block group的第一个block为super block(每个block group的super block都相同,是为了增加冗余,提高可靠性)。
SuperBlock
记录了block的总数量,inode的数量,block的size等等
struct ext2_super_block {
__u32 s_inodes_count; /* Inodes count */
__u32 s_blocks_count; /* Blocks count */
...
__u32 s_free_blocks_count; /* Free blocks count */
__u32 s_free_inodes_count; /* Free inodes count */
__u32 s_first_data_block; /* First Data Block */
__u32 s_log_block_size; /* Block size */
...
__u32 s_blocks_per_group; /* # Blocks per group */
...
__u16 s_magic; /* Magic signature */
...
Group Description
记录了磁盘上所有block group的信息(为了冗余),当然包含本block group的信息:block bitmap的位置,inode bitmap的位置,inode table的位置
struct ext2_group_desc
{
__u32 bg_block_bitmap; /* Blocks bitmap block */
__u32 bg_inode_bitmap; /* Inodes bitmap block */
__u32 bg_inode_table; /* Inodes table block */
__u16 bg_free_blocks_count; /* Free blocks count */
__u16 bg_free_inodes_count; /* Free inodes count */
__u16 bg_used_dirs_count; /* Directories count */
__u16 bg_pad;
__u32 bg_reserved[3];
};
block bitmap,inode bitmap
0表示block是free,1表示block被占用
Inode table
存储ext2_inode数据结构的地方,每个ext2_inode有个编号,编号从1开始,root inode的编号为2
struct ext2_inode {
__u16 i_mode; /* File type and access rights */
__u16 i_uid; /* Low 16 bits of Owner Uid */
__u32 i_size; /* Size in bytes */
__u32 i_atime; /* Access time */
__u32 i_ctime; /* Creation time */
__u32 i_mtime; /* Modification time */
__u32 i_dtime; /* Deletion Time */
__u16 i_gid; /* Low 16 bits of Group Id */
__u16 i_links_count; /* Links count */
__u32 i_blocks; /* Blocks count */
__u32 i_flags; /* File flags */
...
__u32 i_block[EXT2_N_BLOCKS]; /* Pointers to blocks */
...
};
i_mode保存文件类型和读取权限
当i_mode为文件时,i_blocks表示data block的指针。当i_mode为文件夹时,i_blocks表示ext2_dir_entry_2的指针。注意每个ext2_dir_entry_2的大小都不一样,所以查找ext2_dir_entry_2时要线性搜索,这是时间换空间。
struct ext2_dir_entry_2 {
__u32 inode; /* Inode number */
__u16 rec_len; /* Directory entry length */
__u8 name_len; /* Name length */
__u8 file_type;
char name[EXT2_NAME_LEN]; /* File name */
};
例如查找"/home/ealtieri/hello.txt"这个文件,先从inode2找到root inode,然后从i_block中找到home的ext2_dir_entry_2,然后得到home的inode编号,再递归寻找。