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

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六