好文分享:EXT文件体系机制道理详解
下图是一个ext4文件体系的superblock的信息,ext家属的文件体系都能行使dumpe2fs -h获取。 ![]() 2.3 块组描写符表(GDT)既然文件体系分别了块组,那么每个块组的信息和属性元数据又生涯在那边呢? ext文件体系每一个块组信息行使32字节描写,这32个字节称为块组描写符,全部块组的块组描写符构成块组描写符表GDT(group descriptor table)。 固然每个块组都必要块组描写符来记录块组的信息和属性元数据,可是不是每个块组中都存放了块组描写符。ext文件体系的存储方法是:将它们构成一个GDT,并将该GDT存放于某些块组中,存放GDT的块组和存放superblock和备份superblock的块沟通,也就是说它们是同时呈此刻某一个块组中的。读取时也老是读取Group0中的块组描写符表信息。 若是block巨细为4KB的文件体系分别了143个块组,每个块组描写符32字节,那么GDT就必要143*32=4576字节即两个block来存放。这两个GDT block中记录了全部块组的块组信息,且存放GDT的块组中的GDT都是完全沟通的。 下图是一个块组描写符的信息(通过dumpe2fs获取)。 ![]() 2.4 保存GDT(Reserved GDT)保存GDT用于往后扩容文件体系行使,防备扩容后块组太多,使得块组描写符超出当前存储GDT的blocks。保存GDT和GDT老是同时呈现,虽然也就和superblock同时呈现了。 譬喻前面143个块组行使了2个block来存放GDT,可是此时第二个block还空余许多空间,当扩容到必然水平常2个block已经无法再记录块组描写符了,这时就必要分派一个或多个Reserved GDT的block来存放超出的块组描写符。 因为新增进了GDT block,以是应该让每一个生涯GDT的块组都同时增进这一个GDT block,以是将保存GDT和GDT存放在统一个块组中可以直接将保存GDT调动为GDT而无需行使低效的复制本领备份到每个存放GDT的块组。 同理,新增进了GDT必要修改每个块组中superblock中的文件体系属性,以是将superblock和Reserved GDT/GDT放在一路又能晋升服从。 3.Data Block![]() 如上图,除了Data Blocks其他的部门都表明过了。data block是直接存储数据的block,但究竟上并非云云简朴。 数据所占用的block由文件对应inode记录中的block指针找到,差异的文件范例,数据block中存储的内容是纷歧样的。以下是Linux中差异范例文件的存储方法。
通例文件的存储就不表明白,下面别离表明非凡文件的存储方法。 3.1 目次文件的data block 对付目次文件,其inode记录中存储的是目次的inode号、目次的属性元数据和目次文件的block指针,这内里没有存储目次自身文件名的信息。 而其data block的存储方法则如下图所示。 ![]() 由图可知,在目次文件的数据块中存储了其下的文件名、目次名、目次自己的相对名称"."和上级目次的相对名称"..",还存储了指向inode table中这些文件名对应的inode号的指针(并非直接存储inode号码)、目次项长度rec_len、文件名长度name_len和文件范例file_type。留意到除了文件自己的inode记录了文件范例,其地址的目次的数据块也记录了文件范例。因为rec_len只能是4的倍数,以是必要行使" |