加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:11:27 所属栏目:百科 来源:网络整理
导读:Flexible Block Groups (flex_bg) ,我称之为“弹性块组”,是 EXT4 文件系统引入的一个 feature 。 所谓 Flexible Block Groups ,就是将连续的多个物理 block groups 绑在一起组成一个逻辑块组,这个逻辑块组就称之为 Flex_group( 也就是 flex_bg) 。 在一

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

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

在一个Flex_group中,第一个物理block group是存放当前Flex_groupbitmapinode表。比如Flex_group大小是4,那么group0(按顺序)存放共superblockgroup descriptorsgroup0~3data block bitmapsgroup0~3inode bitmapgroup0~3inode tablesgroup0剩余的空间存放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=32Kblock128M),但除去group本身的metadata (bitmap blocks: 2? inodes table: (32768 * 128? + 4095)/4096 = 1024),还能剩下31742block空闲,如果此group包含spare_super,还要减去super_block所占用的一个block

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

指定flex_bg_size256group:

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

再用debugfs来查看新建EXT4group 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,Checksum 0xa897]

……

Group 255: block bitmap at?1280,inode bitmap at?1536,inode table at?142337?
?????????? 32768 free blocks,Block not init,Checksum 0xcd10]?
Group 256: block bitmap at?8388608,inode bitmap at?8388864,inode table at8389120?
?????????? 0 free blocks,Checksum 0x42cd]

Group 2384: block bitmap at?75497552,inode bitmap at?75497808,inode table at75538944?
????????? 23296 free blocks,8192 unused inodes?
????????? [Inode not init,Checksum 0xd1d2]

可以看出,group 0-255block bitmapinode bitmapinodes table是连在一起的,如block bitmap是从1025开始到1280inode bitmap则从1281开始,直到1536结束。inodes talbe也同样。后面从group 256开始,又是常规的不连续方式。

不妨再做个实验,将指定flex_bg_size设为4096,将所有group(共2385个)都包含进flexible block group:

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

启动debugfs来查看group descriptions:

……
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 unused inodes?
?????????? [Checksum 0xee4f]?
Group? 1: block bitmap at?1026,inode bitmap at?5122,inode table at?9729?
?????????? 0 free blocks,Checksum 0x255d]?
Group? 2: block bitmap at?1027,inode bitmap at?5123,inode table at?10241?
?????????? 4095 free blocks,Checksum 0x047e]

Group 2384: block bitmap at?3409,inode bitmap at?7505,inode table at?1265665?
?????????? 23296 free blocks,Checksum 0x8406]

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


作者:Younger Liu,

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读