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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端