zoukankan      html  css  js  c++  java
  • [ext4]03 磁盘布局 – Flexible group分析

    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, 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-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,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 未本地化版本许可协议进行许可。


  • 相关阅读:
    微信输入文字和更多切换时不改变下面layout大小
    bitmap1 = bitmap2导致bitmap1不能使用一致报回收错误解决
    Mac下命令行打开Sublime
    android.content.res.Resources$NotFoundException:String resource ID #0x86
    SEGGER RTT STOP/SLEEP 模式下使用
    STM32中用 stop 模式 配合低功耗模式下的自动唤醒(AWU) 能否实现FreeRTOS tickless 模式
    NRF52832 能烧写代码 但是不运行 ,是因为没有烧写协议栈
    NRF52832 Logger module 设置
    jlink RTT 打印 BUG , FreeRTOS 在开启 tickless 模式下 无法使用的问题
    gattAttribute_t 含义 中文解释
  • 原文地址:https://www.cnblogs.com/youngerchina/p/5624603.html
Copyright © 2011-2022 走看看