传统的类Unix文件系统,比如Ext3,都是使用一个间接数据块映射表来记录每一个数据块的分配情况的。但是这种机制对于超大文件的存储是有缺陷的,特别是当对超大文件进行删除和截断操作时。映射表会对每一个数据块进行记录,而一个超大文件将占有很多的数据块,因此造成映射表将变得无比臃肿,难于维护。

Ext4引入了一个新的概念,叫做“Extents”。一个Extents是一个地址连续的数据块(block)的集合。比如一个100MB的文件有可能被分配给一个单独的Extents,这样就不用像Ext3那样新增25600个数据块的记录(一个数据块是4KB)。而超大型文件会被分解在多个extents里。

很明显,Extents的实现提高了文件系统的性能,减少了文件碎片。

Exents是如何在磁盘上存放的哪?

注:本文所介绍的结构体都是直接存放在磁盘上结构.

在extent tree中,每一个节点都是一个block,对于存放extent tree节点信息的block,我们可以称之为extent block。当然其根节点是存放在inode table中,所以根节点所在的block就不这么称呼了。每个节点在其offset为0的地方都有一个结构体ext4_extent_header用于描述该节点。

结构体header的大小为12bytes,其定义在文件ext4_extents.h中。

/*

* Each block(leaves and indexes), even inode-stored has header.

*/

struct ext4_extent_header {

/*ext4 extents标识0xF30A. */

__le16  eh_magic;   /*probably will support different formats */

/* 当前节点中有效entries的数目 */

__le16  eh_entries; /*number of valid entries */

/* 当前节点中entry的最大数目 */

__le16  eh_max;     /*capacity of store in entries */

/* 当前节点在树中的深度 */

__le16  eh_depth;   /*has tree real underlying blocks? */

__le32  eh_generation;  /*generation of the tree */

};

在该结构体中,针对当前节点在树中的深度说要说明的是:

1. 叶子节点,深度为0,指向数据extent。

2.tree中最大深度的节点是根节点;

3. 深度最大为5:logic block number最大为2^32, 满足4*(((blocksize - 12)/12)^n) >= 2^32 条件的最小n是5。

节点中存放的ext4_extent_header数据之后都是很多entry(即表项),每个entry大小为12bytes。如果是非叶子节点(所谓非叶子节点,即ext4_extent_header -> eh_depth > 0),每个entry中存放是index数据,由struct ext4_extent_idx描述,每一个entry索引都指向一个extent block;如果是叶子节点(所谓叶子节点,即ext4_extent_header
-> eh_depth =0),每个entry都是指向一个extent,由struct ext4_extent描述。每个ext4_extent。

我们先来分析一下ext4_extent_idx结构体,如前所述,ext4_extent_idx是用于描述extent block的一个结构体,通过该结构体,可以寻找到下一级的节点。

struct ext4_extent_idx {

/* 索引所覆盖的文件范围的起始block */

__le32  ei_block;   /*index covers logical blocks from 'block' */

/* 下一级extent block的逻辑地址的低32位 */

__le32  ei_leaf_lo; /*pointer to the physical block of the next *

* level. leaf or next index could be there */

/* 下一级extent block的逻辑地址的高16位 */

__le16  ei_leaf_hi; /*high 16 bits of physical block */

__u16   ei_unused;

};

ext4_extent是用于表示extent的数据结构:

/*

* This isthe extent on-disk structure.

* It's usedat the bottom of the tree.

*/

struct ext4_extent {

/* extent的起始block地址 */

__le32  ee_block;   /*first logical block extent covers */

/*extent的长度 */

__le16  ee_len;     /*number of blocks covered by extent */

/*extent起始block的物理地址的高16位 */

__le16  ee_start_hi;    /*high 16 bits of physical block */

/*extent起始block的物理地址的低32位 */

__le32  ee_start_lo;    /*low 32 bits of physical block */

};

关于extent的成员变量ee_len,需要说明的是:如果该值<=32768,那么这个extent已经初始化的。如果该值>32768,这个extent还没有初始化,并且extent长度是ee_len-32768.因此一个初始化的extent,其最大长度是32768,而一个未初始化的extent,最大长度是32767。

前述已经介绍过checksums。Header和extent entries并未占用整个block。因为2^12 % 12 >= 4,因此block中至少还剩余4bytes的未用空间。那么32位的校验值可以存放在该空间中。当然inode中可能表示的4个extents并不需要校验,因为inode已经进行了校验。(为什么这么解释,原因是,除根节点外的所有的extent block都进行了校验)。

存放校验值的结构体为ext4_extent_tail。

/*

* This isthe extent tail on-disk structure.

* All otherextent structures are 12 bytes long.  Itturns out that

* block_size% 12 >= 4 for at least all powers of 2 greater than 512, which

* covers allvalid ext4 block sizes.  Therefore, thistail structure can be

* crammedinto the end of the block without having to rebalance the tree.

*/

struct ext4_extent_tail {

__le32  et_checksum;    /*crc32c(uuid+inum+extent_block) */

};

至此,extent tree所涉及的且存放在磁盘的变量数据均介绍完毕,那么我们可以画一幅图用于表示exent block的布局,如下:

header

entry

……

entry

tail

欢迎提出建议。

作者:Younger Liu,

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

[ext4] 磁盘布局 - extent tree的更多相关文章

  1. [ext4]磁盘布局 - inode bitmap & table

    在[磁盘布局 group部分]已经介绍过ext4的整体布局,其中存在两个与inode有关的名称:inode bitmap和inode table. Inode bitmap,用于表示inode tab ...

  2. [ext4]磁盘布局 - group分析

    ext4文件系统的磁盘布局是先把磁盘分成一个个相同大小的block块(每个block块的大小默认是4K),然后把这些block块合成一个个group. group大小最大为256M(默认为256M), ...

  3. [ext4]04 磁盘布局 - Meta Block Groups

    Meta Block Groups,可以翻译为元块组集. 如果不采用Meta Block Groups特性,在每个冗余备份的超级块的后面是一个完整的(包含所有块组描述符的)块组描述符表的备份.如前所述 ...

  4. Win10无法安装提示磁盘布局不受UEFI固件支持怎样解决

    微软在推出Win10系统以后,就向Win7和Win8.1系统用户提供了免费升级Win10系统的推送,但是用户在安装Win10系统的时候,却有一部分用户反映,遇到提示“无法安装Windows,因为这台电 ...

  5. ext2磁盘布局

    概述           本篇博客主要关注ext2文件系统的磁盘布局,即ext2会在格式化时将磁盘划分成什么样子.   ext2磁盘布局   任何Ext2分区中的第一个块从不受Ext2文件系统的管理, ...

  6. [ext4]07 磁盘布局 - 块/inode分配策略

    Ext4系统从设计上就认为数据局部性是文件系统的文件系统的一个理想品质. 在机械硬盘上,相关联的数据存放在相近的blocks上,可以使得在访问数据时减少磁头驱动器的移动距离,从而加快IO访问. 在SS ...

  7. [ext4]03 磁盘布局 – Flexible group分析

    Flexible Block Groups (flex_bg),我称之为"弹性块组",是EXT4文件系统引入的一个feature. 所谓Flexible Block Groups, ...

  8. [ext4]08 磁盘布局 - CheckSums

    从2012年开始,Ext4和jbd2的元数据中都开始加入checksums.特性标识是metadata_csum.Checksum算法是在super_block中指定: struct ext4_sup ...

  9. [ext4]05 磁盘布局 - 延迟块组初始化

    延迟块组初始化,Ext4的新特性.如果对应的特性标识uninit_bg置位,那么inode bitmap和inode tables就不会初始化. 延迟块组初始化特性特性可以减少格式化耗时. 延迟块组初 ...

随机推荐

  1. HBase架构

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6573817.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  2. Spring之IOC详解

    学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spr ...

  3. SQL Server中的Merge关键字 更新表数据

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  4. Windows Phone下页面跳转动画的实现

    写在前面的一些废话: 前段时间一直忙于其他的事情,好长时间没有更新博客,很多东西虽然看过.学过,但是没有仔细去思考,去总结,长时间不用或者用的少难免会遗忘.最近由于家里以及感情方面的事,人也变得有点怨 ...

  5. ZJOI2017 Day2

    私のZJOI Day2 2017-3-22 08:00:07 AtCoder试题选讲 SYC(Sun Yican) from Shaoxing No.1 High School 2017-3-22 0 ...

  6. 基于模糊聚类和最小割的层次化网格分割算法(Hierarchical Mesh Decomposition)

    网格分割算法是三维几何处理算法中的重要算法,具有许多实际应用.[Katz et al. 2003]提出了一种新型的层次化网格分割算法,该算法能够将几何模型沿着凹形区域分割成不同的几何部分,并且可以避免 ...

  7. ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application

    今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...

  8. J2那几个E和Web基础

    收到PHP童鞋的反馈: 我觉得不用讲太基础的语法,基础语法大家自己去看,主要讲讲java web开发的一个流程,从开始写代码,到编译,发布,上线,回滚整个流程 大体上的环节,以及需要用到哪些工具 具体 ...

  9. Unity 3D Framework Designing(9)——构建统一的 Repository

    谈到 『Repository』 仓储模式,第一映像就是封装了对数据的访问和持久化.Repository 模式的理念核心是定义了一个规范,即接口『Interface』,在这个规范里面定义了访问以及持久化 ...

  10. 浅谈C10K问题

    在大型的APP中进行高并发的访问,淘宝,支付宝,微信,QQ,等 C10K问题:高并发的进行访问 C10K问题的最大特点是:设计不够良好的程序,其性能和连接数及机器性能的关系往往 是非线性的.举个例子: ...