ext4文件系统布局(代码片段)

程序猿Ricky的日常干货 程序猿Ricky的日常干货     2023-02-25     158

关键词:

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字节之后开始的:

而第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提供有很多特性,当然有一些是前一代文件系统ext3本身就具有的,比如日志功能,但有时候我们却并不需要这些特性,则我们可以禁用它们。ext4文件系统的日志功能就是在牺牲一定性能的情况下增强稳定性的一种手段,但在... 查看详情

ext4文件系统架构分析

本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外。整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等。感兴趣的看官敬请留... 查看详情

系统篇:ext4文件系统(代码片段)

一、ext4文件系统ext4:第四代扩展文件系统,是目前Linux发行版比较常用的文件系统。特点:上图简单介绍了ext4文件系统的布局:磁盘划分为分区,每个分区又划分为N个块组,在每个块组中,又根据块... 查看详情

创建ext4文件系统,并自动挂载(代码片段)

实验环境如下:[root@Centos7~]#uname-r3.10.0-693.el7.x86_64[root@Centos7~]#cat/etc/redhat-releaseCentOSLinuxrelease7.4.1708(Core)[root@Centos7~]#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTsda8:0050G0disk├─sda18:10 查看详情

ext4文件系统数据恢复的方法总结(代码片段)

对于一个文件系统来说,物理盘上保存的信息包括两类,一类是元数据信息,存在于inode中,另一类就是实际的数据块,inode中保存有指向数据块的相关索引信息,这样一个文件只要找到inode,就可以索... 查看详情

u-boot命令篇|ext格式文件系统操作命令(代码片段)

  uboot有ext2和ext4这两种格式的文件系统的操作命令,常用的就四个命令,分别是:ext2load、ext2ls、ext4load、ext4ls和ext4write。这些命令的含义和使用与fatload、fatls和fatwrite一样,只是ext2和ext4都是针对ext文件系统的... 查看详情

linux0.11源码阅读笔记-文件管理(代码片段)

Linux0.11源码阅读笔记-文件管理文件系统生磁盘未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件。磁盘分区生磁盘可以被分区,分区中可以安装文件系统,常见的文件系统有fat32、ext2、ext4等... 查看详情

创建文件系统及挂载(代码片段)

...磁盘划好分区,我这里划分好了/dev/sdb1将分区格式化某种文件系统,这里将dsb1格式化ext4mkfs-text4/dev/sdb1(或者mkfs.ext4/dev/sdb1,-t指定文件系统类型)将刚创建好的文件系统挂载创建一个空的文件目录mkdir/kong挂载:mount/dev/sdb1/kong挂... 查看详情

linuxbtrfs文件系统(代码片段)

1、Btrfs文件系统简介文件系统似乎是内核中比较稳定的部分,多年来,人们一直使用ext2/3,ext文件系统以其卓越的稳定性成为了事实上的Linux标准文件系统。近年来ext2/3暴露出了一些扩展性问题,于是便催生了ext4... 查看详情

linux.ext4文件系统.inode和extent(代码片段)

最近在看ext4系统的extent相关内容对于文件系统,每个文件会对应一系列磁盘块,通过在inode中有序的存放磁盘块号,也就保存下了<文件逻辑块号,磁盘块号>的映射关系一个文件的逻辑块号必然是连续的,而磁... 查看详情

三周第五次课(代码片段)

4.5/4.6磁盘格式化df-tH查看分区的文件系统du-sh文件查看文件占用的空间大小mke2fs-t指定文件系统xfsext4-b指定块大小mke2fs-text4-b2048/dev/sdb1格式化成ext4mkfs.ext4/dev/sdb1格式化成ext4mkfs.xfs/dev/sdb4df-hT只可以查看已经挂载的分区和文件系统... 查看详情

iscsi新应用,以及nfs的存储服务分离(代码片段)

...适合HA机群不适合LBHA:一个主,一个备ext4、xfs都是本地文件系统需要做成gfs全局文件系统NFS网络文件系统简述:当A、B机挂载同一个iqn设备C时文件系统时(ext4或者是xfs),同时提供服务,由于都是提供存储服务,可以对里面的... 查看详情

ext4文件系统数据恢复的方法总结(代码片段)

对于一个文件系统来说,物理盘上保存的信息包括两类,一类是元数据信息,存在于inode中,另一类就是实际的数据块,inode中保存有指向数据块的相关索引信息,这样一个文件只要找到inode,就可以索... 查看详情

[svc]ext4文件删除&访问原理(代码片段)

文件名信息存放在哪里?LINUX的文件名是存在父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块。我们删除一个文件,实际上并不是清楚inode节点和block的数据。只是在这个... 查看详情

目录结构及vim(代码片段)

 文件系统说明:文件系统就是操作管理存储设备或分区上的文件的方法和数据结构,也就是存储设备上组织文件的方式。操作系统中负责管理和存储文件的软件机构叫文件管理系统,简称文件系统。常见文件系统:fat16(MS-DOS... 查看详情

linux下的文件系统修复(代码片段)

Linux下的文件系统修复一、进行磁盘分区二、格式成xfs文件系统1.查看分区2.格式化分区三、挂载分区1.查看分区的uuid2.将挂载信息写入/etc/fstab3.挂载分区四、破坏文件1.向/mnt/vdn3目录中写入文件2.卸载/mnt/vdb3/文件夹报错处理3.卸载... 查看详情

yii2框架博客系统前台界面布局(代码片段)

...的具体方法登陆显示头像首先在web目录下创建static的静态文件夹用于存储cssjsimg等文件,目录结构/web/static/css或者/web/static/images其次要明白/assets/AppAsset是资源文件目录cssjsimages等文件存储的样式引入路径示例添加css需要在publi... 查看详情

12readdir函数(代码片段)

...addir的词条 getdents 封装getdents_callback,然后迭代f中的各个文件, getdents_callback中藏有回调 将数据最终存放于buf中 ext4_dx_readdir如下图第一个ifblock为填充info用于迭代,大致的工作是将当前文件夹下的各个文件的相关信息填充到info.r... 查看详情