extjs中元数据_ext2元数据结构

在该结构中,inode代表该文件inode编号,rec_len表示本文件目录项的大小,为什么需要这个rec_len呢,结构体定义好了整个长度不也就确认了嘛?非也,这是因为该结构体的最后一个成员name并不是固定长度的,其最大可以支持256字节,因此必须要有一个长度域来保存当前目录项长度,name_len指的是文件名长度,既然已经有了rec_len,为什么还需要文件名长呢,岂不多此一举?这是考虑到存在文件名填充的问题。从效率上来考虑,每个struct ext2_dir_entry_2最终都会被填充成4字节整数倍,对于目录项不是4字节整数倍的,需要在最后name文件名后面填充若干个0,因此name_len中记录的便是name[]域中有效文件名长度(即不包含0)。考虑下图所示事例:

1. “.”和“..”文件名后都填充了‘\0’以使文件目录项总长度为4的整数倍;

2. music和src文件/目录均也填充了‘\0’以使文件目录项总长度为4的整数倍;

3. test.txt因为其文件目录项已经是16个字节,无需填充。

ext2索引节点

该数据结构可能是一个文件最重要的元数据信息了,因为描述文件的一切属性都保存在这里了(除了文件名),重要性不言而喻,而且索引节点也是持久化存储在磁盘之上,每个块组都有专门的inode表来存储文件索引节点,ext2的索引节点结构如下所描述:

/** Structure of an inode on the disk*/

structext2_inode {

__le16 i_mode;/*File mode*/__le16 i_uid;/*Low 16 bits of Owner Uid*/__le32 i_size;/*Size in bytes*/__le32 i_atime;/*Access time*/__le32 i_ctime;/*Creation time*/__le32 i_mtime;/*Modification time*/__le32 i_dtime;/*Deletion Time*/__le16 i_gid;/*Low 16 bits of Group Id*/__le16 i_links_count;/*Links count*/__le32 i_blocks;/*Blocks count*/__le32 i_flags;/*File flags*/union {struct{

__le32 l_i_reserved1;

} linux1;struct{

__le32 h_i_translator;

} hurd1;struct{

__le32 m_i_reserved1;

} masix1;

} osd1;/*OS dependent 1*/__le32 i_block[EXT2_N_BLOCKS];/*Pointers to blocks*/__le32 i_generation;/*File version (for NFS)*/__le32 i_file_acl;/*File ACL*/__le32 i_dir_acl;/*Directory ACL*/__le32 i_faddr;/*Fragment address*/union {struct{

__u8 l_i_frag;/*Fragment number*/__u8 l_i_fsize;/*Fragment size*/__u16 i_pad1;

__le16 l_i_uid_high;/*these 2 fields*/__le16 l_i_gid_high;/*were reserved2[0]*/__u32 l_i_reserved2;

} linux2;struct{

__u8 h_i_frag;/*Fragment number*/__u8 h_i_fsize;/*Fragment size*/__le16 h_i_mode_high;

__le16 h_i_uid_high;

__le16 h_i_gid_high;

__le32 h_i_author;

} hurd2;struct{

__u8 m_i_frag;/*Fragment number*/__u8 m_i_fsize;/*Fragment size*/__u16 m_pad1;

__u32 m_i_reserved2[2];

} masix2;

} osd2;/*OS dependent 2*/};

索引节点记录了文件的各种属性,如文件大小,文件模式,文件各种时间信息,文件数据块位置信息等。而其中最重要的信息就得数文件数据块位置了。ext2文件系统采用了巧妙的办法来记录文件数据块,兼顾了效率和空间利用率,具体方法如下图所示:

ext2中,将文件的数据块索引组织成数组的形式。在ext2的索引结构中有一个i_block[],该数组共有15项,每项记录的都是物理磁盘块号,其中前12项记录的是一级索引,即该该索引记录的是文件数据块地址,因此,对于小于12个数据块的文件来说,只需要查一次索引即可获得文件数据块位置。i_block[]的第13项是一个二级索引,即其中的块号指向的并不是文件数据块,而是一个存储索引的数据块,该索引数据块中保存了文件数据块的块号,因此,对于大一点的文件,获取数据可能得经历两次索引查询,另外还有三级索引等等,ext2就是采取这种策略来组织文件数据,这种方式在后面的博客中还会有专门的篇幅来阐述,这里点到为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值