ext2文件系统结构

ext2文件系统结构_第1张图片
Paste_Image.png

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编号,再递归寻找。

ext2文件系统结构_第2张图片
Paste_Image.png

你可能感兴趣的:(ext2文件系统结构)