ext2文件系统解析---透过dumpe2fs看ext2文件系统

2024-03-15 20:20

本文主要是介绍ext2文件系统解析---透过dumpe2fs看ext2文件系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

参考资料
参考:https://www.nongnu.org/ext2-doc/ext2.pdf
参考:https://developer.aliyun.com/article/297657
参考:https://www.bilibili.com/read/cv17345430/
参考:https://github.com/torvalds/linux/blob/master/fs/ext2/ext2.h
参考:https://baike.baidu.com/item/e2fsprogs/6202376?fr=ge_ala
参考:https://www.easeus.com/partition-master/ext2-ext3-ext4-file-system-format-and-difference.html

1. 引言

对于ext2文件系统,我们大多数会有所耳闻的,那我们是否知道,该文件系统的内部存储结构是什么样的?
另外对于一个制定大小的文件系统,它的存储大小和文件数有约束吗?
一个10MB的ext2文件系统中:
能支持建立多少个文件?能建立1000个?10000个?和什么有关系?
能最大存储多大的内容,是满10MB吗?还是9MB?由什么来确定的?
在这里插入图片描述

这些问题,我们可以借助dump2fs命令的使用,来做一个初步的探究。

2. dumpe2fs查看信息

创建出loop device之后,使用命令如下,来查看ext2设备的信息。
创建loop device的方法,参考文章下面附录中方法。

[root@ls_CxhK1nVN ~]# dumpe2fs /dev/loop0
[root@ls_CxhK1nVN ~]# dumpe2fs /dev/loop1

下面是一个新创建的10MB的loop deivce的信息:
10MB的内容如下:

[root@ls_CxhK1nVN ~]# dumpe2fs /dev/loop1
dumpe2fs 1.45.6 (20-Mar-2020)
Filesystem volume name:   <none>
Last mounted on:          /root/mongodir
Filesystem UUID:          10f36aab-aa44-4d96-8733-ee31bd6bed5f
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              2560
Block count:              10240
Reserved block count:     512
Free blocks:              9819
Free inodes:              2549
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      39
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         1280
Inode blocks per group:   160
Filesystem created:       Thu Mar 14 15:11:03 2024
Last mount time:          Thu Mar 14 15:11:48 2024
Last write time:          Thu Mar 14 15:11:48 2024
Mount count:              1
Maximum mount count:      -1
Last checked:             Thu Mar 14 15:11:03 2024
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Default directory hash:   half_md4
Directory Hash Seed:      3bd0f015-62fe-4eb2-b815-0fed1e1ebf11Group 0: (Blocks 1-8192)Primary superblock at 1, Group descriptors at 2-2Reserved GDT blocks at 3-41Block bitmap at 42 (+41)Inode bitmap at 43 (+42)Inode table at 44-203 (+43)7975 free blocks, 1269 free inodes, 2 directoriesFree blocks: 218-8192Free inodes: 12-1280
Group 1: (Blocks 8193-10239)Backup superblock at 8193, Group descriptors at 8194-8194Reserved GDT blocks at 8195-8233Block bitmap at 8234 (+41)Inode bitmap at 8235 (+42)Inode table at 8236-8395 (+43)1844 free blocks, 1280 free inodes, 0 directoriesFree blocks: 8396-10239Free inodes: 1281-2560

3. 信息解析

通过上述信息,我们关注到:

  1. Block总量,Block count * Block size = 10MB,正好是一个block1KB,10240个block。
    Block count: 10240
    Block size: 1024

  2. Inode节点数量,Inode count * Inode size = 320 * 1024;
    将会占用320个block,正好有2个Group,1个Group存储160个,和下面的信息相互印证了。
    Inode count: 2560
    Inode size: 128
    Inode blocks per group: 160
    Group 0: (Blocks 1-8192)
    Inode table at 44-203 (+43)
    Group 1: (Blocks 8193-10239)
    Inode table at 8236-8395 (+43)

  3. 关注初始创建后的空闲block数量,空闲inode数量
    空闲block数量将决定存储容量的门限:9819 * 1024 = 9819KB,比10240少421个Blocks。
    空闲inodes数量将决定可创建文件数量的门限:2549个文件
    Free blocks: 9819
    Free inodes: 2549

  4. 关注Block count / Inode count比值 = 4,不考虑文件系统占用情况下,每4KB会支持建立一个文件;
    推算得出:基于10MB是2560个文件,那么1GB就是256,000, 1TB就是256,000,000个文件,支持的文件数量还是非常多的。
    Block count: 10240
    Block size: 1024
    Inode count: 2560

  5. Group Table的大小与Bitmap关系,Blocks per group * 1024 = 8MB。
    每个Group大小是8MB;当前总大小10MB,拆分处了一个8MB,一个约2MB的group。
    为什么Group大小采用8MB,这个和Bitmap有关系吗?是有关系的,Bitmap占据一个block,也就是1024字节,也是1024*8=8192比特。
    Bitmap最多能指示8192个block的使用情况,而Group Table也正式采用的8192个block组成,刚好Bitmap可以全部指示出来。
    Blocks per group: 8192
    Block size: 1024
    Group 0: (Blocks 1-8192)
    Group 1: (Blocks 8193-10239)

4. 总体结构解析

基于上面的分析,侧面也可以佐证,ext2文件系统的layout结构信息
在这里插入图片描述

对于上面10MB的信息结构解析如下:

  1. filesystem boot header
    开头的1024字节,也即block 0,作为boot预留字节,通常是全0值。
Block OffsetLengthDescription
byte 0byte 512boot record (if present)
512 bytesbyte 512additional boot record data (if present)
  1. block group 0, blocks 1 to 8192
    第0个table group,空间充足情况下,每个table group都有8192个block组成。
    地0个table group的第一个block放的是superblock,之后是block group desciptor table。
Block OffsetLengthDescription
byte 10241024 bytessuperblock
block 21 blockblock group descriptor table
block 339 blockReserved GDT blocks
block 421 blockblock bitmap
block 431 blockinode bitmap
block 44160 blocksinode table
block 2047989 blocksdata blocks
  1. block group 1, blocks 8193 to 10239
    第1个table group,空间不充情况下,剩余的block组成最后一个table group。
    第1, 3, 5, 7,以及3, 5, 7的幂中会放入backup super block以及后续的block group desciptor;
    非这些的剩余group中,直接放的是block bitmap及剩余的信息,这点可以参见30MB时的第2个group的信息。
Block OffsetLengthDescription
block 81931024 bytesBackup superblock
block 81941 blockblock group descriptor table
block 819539 blockReserved GDT blocks
block 82341 blockblock bitmap
block 82351 blockinode bitmap
block 8236160 blocksinode table
block 83961844 blocksdata blocks

5. 附录:对照一个30MB的文件dumpe2fs信息

下面是使用dump2fs命令,来查看一个30MB的loop device内容,可以作为和上面信息的对比参考。

30MB的内容如下:

[root@ls_CxhK1nVN ~]# dumpe2fs /dev/loop2
dumpe2fs 1.45.6 (20-Mar-2020)
Filesystem volume name:   <none>
Last mounted on:          /root/appledir
Filesystem UUID:          66ccabd0-1809-4cae-a1d4-503fd0c5bb42
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              7680
Block count:              30720
Reserved block count:     1536
Free blocks:              29374
Free inodes:              7669
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      119
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         1920
Inode blocks per group:   240
Filesystem created:       Fri Mar 15 11:40:10 2024
Last mount time:          Fri Mar 15 11:40:15 2024
Last write time:          Fri Mar 15 11:40:15 2024
Mount count:              1
Maximum mount count:      -1
Last checked:             Fri Mar 15 11:40:10 2024
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Default directory hash:   half_md4
Directory Hash Seed:      e5834267-fbd0-4b52-a1ea-a1ae4418bb95Group 0: (Blocks 1-8192)Primary superblock at 1, Group descriptors at 2-2Reserved GDT blocks at 3-121Block bitmap at 122 (+121)Inode bitmap at 123 (+122)Inode table at 124-363 (+123)7815 free blocks, 1909 free inodes, 2 directoriesFree blocks: 378-8192Free inodes: 12-1920
Group 1: (Blocks 8193-16384)Backup superblock at 8193, Group descriptors at 8194-8194Reserved GDT blocks at 8195-8313Block bitmap at 8314 (+121)Inode bitmap at 8315 (+122)Inode table at 8316-8555 (+123)7829 free blocks, 1920 free inodes, 0 directoriesFree blocks: 8556-16384Free inodes: 1921-3840
Group 2: (Blocks 16385-24576)Block bitmap at 16385 (+0)Inode bitmap at 16386 (+1)Inode table at 16387-16626 (+2)7950 free blocks, 1920 free inodes, 0 directoriesFree blocks: 16627-24576Free inodes: 3841-5760
Group 3: (Blocks 24577-30719)Backup superblock at 24577, Group descriptors at 24578-24578Reserved GDT blocks at 24579-24697Block bitmap at 24698 (+121)Inode bitmap at 24699 (+122)Inode table at 24700-24939 (+123)5780 free blocks, 1920 free inodes, 0 directoriesFree blocks: 24940-30719Free inodes: 5761-7680

5. 附录:如何创建一个10MB的loop device

如何创建一个10MB的loop device,方法如下:

[root@ls_CxhK1nVN ~]# dd if=/dev/zero of=./mongo bs=1K count=10240
10240+0 records in
10240+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0155913 s, 673 MB/s
[root@ls_CxhK1nVN ~]# losetup /dev/loop1 ./mongo
[root@ls_CxhK1nVN ~]# losetup -a
/dev/loop1: [64769]:395659 (/root/mongo)
/dev/loop0: [64769]:395656 (/bean)
[root@ls_CxhK1nVN ~]# mke2fs /dev/loop1
mke2fs 1.45.4 (23-Sep-2019)
Discarding device blocks: done                            
Creating filesystem with 10240 1k blocks and 2560 inodes
Filesystem UUID: 10f36aab-aa44-4d96-8733-ee31bd6bed5f
Superblock backups stored on blocks: 8193Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done[root@ls_CxhK1nVN ~]# mkdir mongodir 
[root@ls_CxhK1nVN ~]# mount -t ext2 /dev/loop1 mongodir
[root@ls_CxhK1nVN ~]# dumpe2fs /dev/loop1

6. 附录:如何写一个脚本来验证创建文件的个数限制:

创建文件的shell脚本如下,执行该脚本,创建文件测试文件的支持数量;
当创建文件失败时,会报错:

touch: cannot touch ‘files/file_2548.txt’: No space left on device

使用chatgpt输出的脚本;

[root@ls_CxhK1nVN mongodir]# cat createfile.sh 
#!/bin/bash# 指定文件夹路径
folder="files"# 创建文件夹
mkdir -p "$folder"# 循环创建1000个文件
for ((i=1; i<=2549; i++))
do# 生成文件名filename="$folder/file_$i.txt"# 创建文件touch "$filename"# 输出创建的文件名echo "Created file: $filename"
done

个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

这篇关于ext2文件系统解析---透过dumpe2fs看ext2文件系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813158

相关文章

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三