6.2.4 EXT2 i节点位图和i节点
i节点位图的作用类同于“块位图”,不同的是每一个位对应“i节点表”里的一个i节点而不是块。i节点位图反映了i节点表中各个表项的使用情况,它的一位(bit)表示i节点表的一个表项,若某位为1表示对应的表项已占用,为0表示表项空闲。每一个块组有一个i节点位图,它的位置可以通过块组描述符里的“bg_inode_bitmap”得知。当i节点表被建立时,所有的保留i节点被标记为已用。
i节点位图也装入一个高速缓存中。在ext2_sb_info结构中:
s_loaded_inode_bitmaps:装入高速缓存的inode位图的数目;
s_block_inode_number[]:装入高速缓存的inode位图的块组号;
s_inode_bitmap[]:相应inode位图在高速缓存中的地址。
两个数组大小EXT2_MAX_GROUP_LOAD(当前值为8)。
i节点表用于跟踪定位每个文件。文件的位置,大小,类型和访问权限均保存在i节点中。然而文件名并不保存在i节点里,在i节点表里,是依赖文件的i节点号来管理所有文件的。
一个块组中所有文件的i节点形成了i节点表,表项的序号就是i节点号。一个块组只有一个i节点表且此表可以通过相关的块组描述符里的“bg_inode_table”得知。一个表共有s_inodes_per_group个inode。每个inode包含关于在系统里单个物理文件的信息。一个文件可以是一个目录,一个套接字,一个缓冲区,一个字符或者是块设备,符号连接成一个正常文件。所以,一个inode可以看做是与一个实体相关的信息块,描述它在磁盘的位置、大小、属主。在EXT2文件系统中i节点是基本的构件,它表示文件系统树型结构的节点。每一个节点是一个文件或目录。在Linux中EXT2文件系统的i节点定义为struct ext2_inode。该定义在/include/linux/ext2_fs.h中。
struct ext2_inode {
__le16 i_mode; /*16位值指出文件类型和访问权限*/
__le16 i_uid; /*16位值文件主用户标识符*/
__le32 i_size; /*32位以字节为单位的文件大小*/
__le32 i_atime; /*文件最近被访问的时间距离1970年1月1日的秒数*/
__le32 i_ctime; /*文件建立的时间距离1970年1月1日的秒数*/
__le32 i_mtime; /*文件被修改的时间距离1970年1月1日的秒数*/
__le32 i_dtime; /*文件被删除的时间距离1970年1月1日的秒数*/
__le16 i_gid; /*指出组曾经访问过此文件*/
__le16 i_links_count; /*表示此inode被连接的次数*/
__le32 i_blocks; /*表示与此文件数据关联的保留块个数(块大小为512bytes)*/
__le32 i_flags; /*文件标志*/
union {
struct {
__le32 l_i_reserved1;
} linux1; /* 32bit目前保留*/
struct {
__le32 h_i_translator;
} hurd1;/* 32位的“翻译者”标签*/
struct {
__le32 m_i_reserved1;
} masix1; /* 32位目前保留*/
} osd1; /*32位操作系统依赖的值*/
__le32 i_block[EXT2_N_BLOCKS];/*数据块指针数组*/
__le32 i_generation; /*文件版本(用于NFS)*/
__le32 i_file_acl; /*文件访问控制链表 (Linux2.0以后版本不再使用)*/
__le32 i_dir_acl; /*目录访问控制链表(Linux2.0以后版本不再使用)*/
__le32 i_faddr; /*用于表示文件最后一个片段(Fragment)的位置*/
union {
struct {
__u8 l_i_frag; /*段(Fragment)号*/
__u8 l_i_fsize; /*段(Fragment)大小*/
__u16 i_pad1;
__le16 l_i_uid_high; /*用户ID的高16位*/
__le16 l_i_gid_high; /*组ID的高16位*/
__u32 l_i_reserved2;
} linux2;
struct {
__u8 h_i_frag; /* 段(Fragment)号*/
__u8 h_i_fsize; /* 段(Fragment)大小*/
__le16 h_i_mode_high;
__le16 h_i_uid_high; /* 用户ID的高16位*/
__le16 h_i_gid_high; /* 组ID的高16位*/
__le32 h_i_author;
} hurd2;
struct {
__u8 m_i_frag; /*每块中的片段(Fragment)数*/
__u8 m_i_fsize; /*片段大小*/
__u16 m_pad1;/* 填充*/
__u32 m_i_reserved2[2];/* 保留*/
} masix2;
} osd2; /*96位操作系统依赖的结构*/
};
其中,i_mode指定了inode文件的类型和访问权限:
S_IFREG 普通文件
S_IFBLK 块设备文件
S_IFDIR 目录文件
S_IFCHR 字符设备文件FIFO文件
S_IFLNK 符号链接文件
S_ISUID 访问权限设定为用户id
S_ISGID 访问权限设定为用户组id
i_block[]指针数组,指向文件内容所在的数据块。i_block[]数组共有15个指针,前12个指针直接指向数据块称为直接块指针,后3个指针分别是一次间接块指针,二次间接块指针和三次间接块指针,参见图6-2。
i_flags是文件属性的标志:
EXT2_SECRM_FL 完全删除标志。
EXT2_UNRM_FL 可恢复删除标志。
EXT2_COMPR_FL 文件压缩标志。
EXT2_SYNC_FL 同步更新标志。
EXT2_IMMUTABLE_FL 不允许修改标志。
EXT2_APPEND_FL 追加写标志。
EXT2_NODUMP_FL 非转储标志。
EXT2_NOATIME_FL 不变更文件访问时间atime 。
图6-2 EXT2 i节点结构
EXT2文件系统的i节点与文件一起存放在外存,在系统运行时,把EXT2的i节点写入内存建立映像,该内存映像定义为ext2_inode_info 结构,在include/linux/ext2_fs_i.h中,共程序如下所示:
struct ext2_inode_info {
__u32 i_data[15]; /* 数据块指针数组 */
__u32 i_flags; /* 文件标志(属性)*/
__u32 i_faddr; /* Fragment (片)地址 */
__u8 i_frag_no; /* Fragment (片)号 */
__u8 i_frag_size; /* Fragment (片)大小 */
__u16 i_osync; /* 同步标志 */
__u32 i_file_acl; /* 文件访问控制链表 */
__u32 i_dir_acl; /* 目录访问控制链表 */
__u32 i_dtime; /* 文件删除时间 */
__u32 i_version; /* 文件版本 */
__u32 i_block_group;/* inode所在块组号 */
__u32 i_next_alloc_block; /* 下一个要分配的块 */
__u32 i_next_alloc_goal; /*下一个要分配的对象 */
__u32 i_prealloc_block; /* 预留块首地址 */
__u32 i_prealloc_count; /* 预留计数 */
int i_new_inode:1; /* 标志,是否为新分配的inode */
};
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。