Ext2 文件系统的硬盘布局
这个公式是这样的:block_group = (ino - 1) / s_inodes_per_group。这里 ino 就是我们的 inode 号数。而 offset = (ino - 1) % s_inodes_per_group,这个 offset 就指出了我们要的 inode 是这个 block group 里面的第几个 inode。
找到这个 inode 之后,我们来具体的看看 inode 是什么样的。
struct ext3_inode { __u16 i_mode; /* File mode */ __u16 i_uid; /* Low 16 bits of Owner Uid */ __u32 i_size; /* 文件大小,单位是 byte */ __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 计数 */ __u32 i_flags; /* File flags */ __u32 l_i_reserved1; /* 可以忽略 */ __u32 i_block[EXT3_N_BLOCKS]; /* 一组 block 指针 */ __u32 i_generation; /* 可以忽略 */ __u32 i_file_acl; /* 可以忽略 */ __u32 i_dir_acl; /* 可以忽略 */ __u32 i_faddr; /* 可以忽略 */ __u8 l_i_frag; /* 可以忽略 */ __u8 l_i_fsize; /* 可以忽略 */ __u16 i_pad1; /* 可以忽略 */ __u16 l_i_uid_high; /* 可以忽略 */ __u16 l_i_gid_high; /* 可以忽略 */ __u32 l_i_reserved2; /* 可以忽略 */ };
我们看到在 inode 里面可以存放 EXT3_N_BLOCKS(= 15)这么多个 block 指针。用户数据就从这些 block 里面获得。15 个 blocks 不一定放得下全部的用户数据,在这里 ext3 文件系统采取了一种分层的结构。这组 15 个 block 指针的前 12 个是所谓的 direct blocks,里面直接存放的就是用户数据。第 13 个 block,也就是所谓的 indirect block,里面存放的全部是 block 指针,这些 block 指针指向的 block 才被用来存放用户数据。第 14 个 block 是所谓的 double indirect block,里面存放的全是 block 指针,这些 block 指针指向的 block 也被全部用来存放 block 指针,而这些 block 指针指向的 block,才被用来存放用户数据。第 15 个 block 是所谓的 triple indirect block,比上面说的 double indirect block 有多了一层 block 指针。作为练习,读者可以计算一下,这样的分层结构可以使一个 inode 中最多存放多少字节的用户数据。(计算所需的信息是否已经足够?还缺少哪一个关键数据?)
本新闻共 6页,当前在第 5页 1 2 3 4 5 6 |