ext4文件系统布局

Posted 程序猿Ricky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ext4文件系统布局相关的知识,希望对你有一定的参考价值。

ext4文件系统块组

ext4中的数据是按照块组进行管理的,一个块组来中包含有多个块。其中有1个块用于保存数据块位图,因此位图中包含有多少个bit就决定了块组中块的个数。
比如,对于一个块大小为4096Byte的设备,块位图中的比特位数为32768(4096 * 8),那么单个块组中最大就只能具有32768(4096 * 8)个块。那么也可以计算出单个块组的大小为32768*4096=128MB。
块组的结构布局如下所示:
文件系统块组

超级块

ext4超级块(super block)记录了文件系统的很多关键信息,如果一个文件系统中只存在一个超级块,那么如果超级块损坏将导致整个文件系统的损坏,因此整个块设备上存在很多超级块的备份,
对于超级块的备份,如果每个块组中都备份一个,又会占据太多的文件系统空间,ext4中支持 sparse_super 特性,如果打开该特性,超级块将只在特定的块组中备份,它的备份块需要满足如下规定:

  • 块组0
  • 块组的组ID为3、5、7的幂

需要注意的是,块组0是一个特殊的块组,它的最前面1024字节是预留给boot sector使用的,因此super block的起始位置需要跳过块组0的前1024字节。而对于其他的备份块则直接保存在对应块组的起始位置处。
根据这个关系,就可以找到对应的超级块以及备份块:

块组id第N块
00(前面需要跳过1024byte)
1(3^0)32768
3(3^1)32768*3
5(5^0)32768*5
7(7^0)32768*7
9(3^2)32768*9

作为测试,可以把对应的super block dump出来:

dd if=/dev/sda1 of=sb0.txt bs=4096 count=1
dd if=/dev/sda1 of=sb1.txt bs=4096 count=1 skip=32768
dd if=/dev/sda1 of=sb2.txt bs=4096 count=1 skip=98304 

查看第0号块组中的super block,可以发现它确实是从1024字节之后开始的:
sb0
而第1号块组中的备份超级块(backup super block),直接就是从该块组的起始位置开始:
在这里插入图片描述

inode

ext4文件系统中,inode也是在块组中进行管理的,块组中存在1个块用于保存inode位图和多个块用于保存inode表。块组大小的计算类似,对于块大小为4096Byte的文件系统,inode位图的比特位最大是32768(40968),
那么也就说明该块组中最大只能申请32768个inode,块组中最大管理文件个数也就是32768个。单个inode占用大小为256Byte,那么inode表最大占用32768
256=8M空间,转换为块个数为2048个。
实际上对于一个块组来说,按照最大限制来预留inode是没有必要的,因为我们一个块组128M,如果分成32768个文件,相当于平均单个文件才4K,这种情况还是比较少见的,因此可以少分配一些空间给inode表,这样就能节省空间。
因此正常在创建文件系统时,会传入参数到mkfs.ext4中的-i选项来设定单个文件占用的空间预计为多少,工具会根据文件size设定来确定inode的个数。

# dumpe2fs test.image | grep -i inode
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Inode count:              65536
Free inodes:              65525
Inodes per group:         8192
Inode blocks per group:   512
First inode:              11
Inode size:               256
Journal inode:            8
Journal backup:           inode blocks

flex_bg

前面介绍的是经典ext4文件系统布局,ext4还引入了flex_bg的特性,就是把多个块组放在一起管理,简单来讲,就是把多个块组的block bitmap聚合在一起,inode bitmap聚合在一起,inode table 也聚合在一起,形成一个更大的逻辑块组。它的好处就是能够充分发挥内核预读取的作用,减少了inode零散分布带来的查找开销,提升了文件系统性能。一般使用mkfs.ext4工具创建文件系统时默认都是开着该选项的。


参考文档:
https://bean-li.github.io/EXT4-packet-meta-blocks/
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout

以上是关于ext4文件系统布局的主要内容,如果未能解决你的问题,请参考以下文章

ext4文件系统布局

ext4文件系统布局

系统篇: ext4 文件系统

Centos7上查看ext4文件系统的实际创建时间

在Android中,如何将数据从类传递到相应的布局/片段文件?

EXT4文件系统禁用日志功能