Flexible Block Groups (flex_bg),我称之为“弹性块组”,是EXT4文件系统引入的一个feature。

所谓Flexible Block Groups,就是将连续的多个物理block groups绑在一起组成一个逻辑块组,这个逻辑块组就称之为Flex_group(也就是flex_bg)。

,那么group0将(按顺序)存放共superblock、group
descriptors、group0~3的data block bitmaps、group0~3的inode
bitmap,group0~3的inode tables,group0剩余的空间存放data(普通数据)。

大小设置:flex_bg = 2 ^ sb.s_log_groups_per_flex。

而之前EXT3系统,bitmaps (block bitmap, inode bitmap)及inode
table是分散在各个group中分别管理的。

Ext4将其全部集中起来,至少有两个好处:

(1)减少了磁盘寻道操作:将频繁访问的block group资源放到有磁盘上一块连续区域

(2)可以一次性分配更多block给一个extent/run:以前的group将磁盘空间划分为众多不连续的空间片段,从而导致一个分配请求最大能只申请到一个group所管理的blocks。以最常用的4K
BLOCK_SIZE来说,一个group最多能管理4K*8=32K个block(128M),但除去group本身的metadata
(bitmap blocks: 2  inodes table: (32768 * 128  + 4095)/4096 = 1024)个block空闲,如果此group包含spare_super,还要减去super_block所占用的一个block。

明白了上面的问题,再来看flex_bg的实现就比较容易了。在创建EXT4卷时,mke2fs会根据用户指定的flex
block group的幂,单位为group),将最前的flex_bg_size个groups集中起来管理。

个group:

[root@srv ~]# mke2fs -j -O flex_bg,extents,uninit_bg -G 256 -I 256 /dev/sdc

再用debugfs来查看新建EXT4卷group
descriptions:

[root@srv ~]# debugfs /dev/sdc1

debugfs:  stats 

Filesystem volume name:   <none> 

Last mounted on:          <not available> 

Filesystem UUID:          5be014f5-5a27-4cf1-81dc-d1f55e71dfdd 

Filesystem magic number:  0xEF53 

Filesystem revision #:    1 (dynamic) 

Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file uninit_bg 

Filesystem flags:         signed_directory_hash 

……

Inodes per group:         8192 

Inode blocks per group:   512 

Flex block group size:    256 


Filesystem created:       Fri Jul  8 23:02:47 2011 

……

Directories:              2 

Group  0: block bitmap at 1025, inode bitmap at 1281, inode table at 1537 

           4089 free blocks, 8181 free inodes, 2 used directories, 8181 unused inodes 

           [Checksum 0x2e4a] 

Group  1: block bitmap at 1026, inode bitmap at 1282, inode table at 2049 

           0 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes 

           [Inode not init, Checksum 0x4578] 

Group  2: block bitmap at 1027, inode bitmap at 1283, inode table at 2561 

           4095 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes 

           [Inode not init, Checksum 0xa897]

……

Group 255: block bitmap at 1280, inode bitmap at 1536, inode table at 142337 

           32768 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes 

           [Inode not init, Block not init, Checksum 0xcd10] 

Group 256: block bitmap at 8388608, inode bitmap at 8388864, inode table at8389120 

           0 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes 

           [Inode not init, Checksum 0x42cd]

……

Group 2384: block bitmap at 75497552, inode bitmap at 75497808, inode table at75538944 

          23296 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes 

          [Inode not init, Checksum 0xd1d2]

可以看出,group 0-255的block bitmap,inode
bitmap,inode
bitmap结束。inodes talbe也同样。后面从group
256开始,又是常规的不连续方式。

个)都包含进flexible
block group:

[root@srv ~]# mke2fs -j -O flex_bg,extents,uninit_bg -G 4096 -I 256 /dev/sdc

启动debugfs来查看group
descriptions:

[root@srv ~]# debugfs /dev/sdc1

……

Inode blocks per group:   512 

Flex block group size:    4096 

Filesystem created:       Fri Jul  8 23:14:02 2011 

……

Directories:              2 

Group  0: block bitmap at 1025, inode bitmap at 5121, inode table at 9217 

           7511 free blocks, 8181 free inodes, 2 used directories, 8181 unused inodes 

           [Checksum 0xee4f] 

Group  1: block bitmap at 1026, inode bitmap at 5122, inode table at 9729 

           0 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes 

           [Inode not init, Checksum 0x255d] 

Group  2: block bitmap at 1027, inode bitmap at 5123, inode table at 10241 

           4095 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes 

           [Inode not init, Checksum 0x047e]

……

Group 2384: block bitmap at 3409, inode bitmap at 7505, inode table at 1265665 

           23296 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes 

           [Inode not init, Checksum 0x8406]

看得出,整个flexible block group被分隔三部分,第一部分是所有的block bitmap,第二部分是所有的inode
bitmap,最后是所有的inodes table。所有的表项都是连续存放于磁盘上的。

作者:Younger Liu,

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

[ext4]03 磁盘布局 – Flexible group分析的更多相关文章

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

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

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

    ext4文件系统最基本的分配单元是"block"(块). block是由一组连续的sectors来组成,其大小介于1k~4K之间,当然不可能是任意值,只能是2的整数次幂个secto ...

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

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

  4. [ext4]06 磁盘布局 - 特殊inode

    Ext4预留了一些inode做特殊特性使用,见下表: inode Purpose 0 不存在,Ext4中不存在inode 0. 1 存放损坏的数据块链表 2 根目录 3 User quota. 用户q ...

  5. [ext4]010 磁盘布局 - 如何查找inode的磁盘位置

    在linux系统中,任何一个文件,都有一个inode与其对应,也就是说,在一个文件系统中,一个文件都有唯一的ino来标示他,那么在ext4系统中,ino是如何确定的哪? 当我们新创建的文件或目录时,会 ...

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

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

  7. [ext4]09 磁盘布局 - superblock备份机制

    如果sparse_super特性flag被设置(即开启了sparse_super特性),那么super_block和组描述符的副本只会保存在group索引为0或3.5.7的整数幂. 如果没有设置spa ...

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

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

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

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

随机推荐

  1. MySQL基准测试(benchmark)

    基准测试是唯一方便有效的.可以学习系统在给定的工作负载下会发生什么的方法.基准测试可以观察系统在不同压力下的行为,评估系统的容量,掌握哪些是重要的变化,或者观察系统如何处理不同的数据. 验证基于系统的 ...

  2. oracle图形界面乱码

    oracle界面乱码解决方案 在Linux的中文操作系统下使用xmanager进行Oracle进行安装的时候,可能出现乱码界面,可以通过以下方法进行解决 1 修改环境属性  vi /etc/sysco ...

  3. Excel制作多选下拉框代码以及图示

    1.首先  点击Sheet1(需要显示多选框的页) ,然后右键查看代码,进入编辑界面 2.写入如下代码 Private Sub Worksheet_SelectionChange(ByVal Targ ...

  4. c#关于时间TimeHelper类的总结

    using System; namespace DotNet.Utilities{    /// <summary>    /// 时间类    /// 1.SecondToMinute( ...

  5. flex与后台及页面间对象的传递

    1.从flex中发送请求后,利用<s:RemoteObject/>启用回调方法,类似于jQuery的post函数: <fx:Declarations>        <s ...

  6. 解决VIM编辑器中文乱码

    追加如下内容到/etc/vimr (或者不同的用户家目录下的.vimrc文件中) set encoding=utf8filetype plugin indent onsyntax on" s ...

  7. 疑问:Spring中构造器、init-method、@PostConstruct、afterPropertiesSet孰先孰后,自动注入发生时间

    问题:今天想写一个通用点的方法,根据传入的参数的类型(clazz对象),判断使用哪个mapper来插入mysql数据库. 下面是我的写法: public interface BizNeeqCommon ...

  8. IOS开发创建开发证书及发布App应用(九)——等待审核(审核几种状态)

    以下是App应用的几种状态,如果看不到英文,建议复制到网站翻译一下就行,意思差不多能明白的 以上整套流程是在2013年写的,可能有些地方已经不太一样了,只是给大家做一下参考,毕竟再怎么改大概流程还是差 ...

  9. 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化

    老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化   首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...

  10. hdu 3032 Nim or not Nim? (sg函数打表找规律)

    题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围  1 ≤ N ...