首页 百科知识 节点位图和节点

节点位图和节点

时间:2022-10-09 百科知识 版权反馈
【摘要】:i节点位图反映了i节点表中各个表项的使用情况,它的一位表示i节点表的一个表项,若某位为1表示对应的表项已占用,为0表示表项空闲。每一个块组有一个i节点位图,它的位置可以通过块组描述符里的“bg_inode_bitmap”得知。当i节点表被建立时,所有的保留i节点被标记为已用。一个表共有s_inodes_per_group个inode。所以,一个inode可以看做是与一个实体相关的信息块,描述它在磁盘的位置、大小、属主。在Linux中EXT2文件系统的i节点定义为struct ext2_inode。

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 。

img37

图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 */

};

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈