Ext4文件系统介绍 - 实战篇

本文主要通过dd,hexdump和dumpe2fs工具分析ext4的磁盘二进制数据,加深对ext4文件系统的印象,要想理解本建议先阅读下Ext4文件系统介绍 - 理论篇_nginux的博客-CSDN博客。

磁盘超级块数据分析

根据理论篇我们知道ext4 layout中前1024字节是x86的boot secotr,这之后紧接着就是super block信息,如下图:

super block的信息只要从1024字节开始解析,命令和输出如下:

dd if=./rootfs_ext4.img  bs=1 skip=1024| hexdump -Cv -n 2048

其中rootfs_ext4.img是我制作的一个虚拟磁盘,格式化为Ext4文件系统:

根据Ext4理论篇我们知道,磁盘上superblock的前32位是代表Total inode count,inode的数量:

__le32代表是little end存储方式,所以上图中第一个红圈是00010000,即65536,我们通过dumpe2fs命令校验确实如此:

 第二个红框的偏移0x38处,值是:0xef53根据super block的存储格式我们知道这个是super block magic number,跟协议里面的规定完全一致:

 磁盘inode table位置定位和数据分析

我们已jbd2的inode为例,根据ext4理论篇我们知道,inode 8是一个special inode,专门给jbd2使用,如下:

 我们知道inode是存储在inode table中,每个inode size 是256B,所以我们怎么找到inode table的block号?dumpe2fs命令!

 红框可以看到inode table是从161号block,block size 4KB inode size 256B,那么8号inode在inode table中的偏移:(8-1) *256B = 0x700,所以我们从161号block地址处偏移0x700就可以找到8号inode内容:

dd if=./rootfs_ext4.img  bs=4096 skip=161| hexdump -Cv -n 2048

上述命令相当于跳过161个4K的block,然后打印2048个字节,截取0x700偏移处如下:

根据ext4理论篇中Inode Table我们知道,一个inode 是256B,其中在i_block是在偏移0x28处,占用60字节:

也就是说,从0x700 + 0x28 处对用i_block的60字节,即红框处的内容,而i_block这60字节的组织格式如下:

 红框的f30a对应上图的extent_header,根据ext4理论篇中的定义我们知道extent_header数据结构如下:正好f30A对应extent_header的magic number。

磁盘文件进制数据定位

我们磁盘中有个文件1.txt ,起inode num=424:

/ # ls -i 1.txt 424 1.txt该文件大小21.3K:
/ # ls -lh 1.txt 
-rw-r--r--    1 0        0          21.3K Jul 14 09:52 1.txt内容如下:
abcdefgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
abcdefgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
abcdefgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
abcdefgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
abcdefgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
abcdefgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
abcdefgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
abcdefgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd

偏移位置(424-1)* 256B ,相当于26个4KB + 7*256B,所以这个inode相当于161 + 26 = 187 block开始偏移 7 * 256 = 0x700处,故使用如下命令得到424的内容:

dd if=./rootfs_ext4.img bs=4096 skip=187 | hexdump -Cv -n 2048

 目前该inode的i_block的格式如下:

上图可以看到ext4_extend_header中eh_entries = 1,eh_depth = 0,代表header之后紧跟着的是一个ext4_extent,而不是ext4_extent_id,ee_block = 0000,0000代表是该extent从文件头开始映射的,ee_length=6代表该ext4_extent连续映射了6个block,start_lo = 0x9602,代表映射的起始物理块号是0x9602 = 38402,所以该文件内容的起始物理block是38402,使用如下命令查看该block的内容:

 dd if=./rootfs_ext4.img bs=4096 skip=38402 | hexdump -Cv -n 4096

 可以看到输出的内容和文件1.txt的内容一致。

参考文章:

黄伟亮:ext4文件系统之裸数据的分析实践

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/22241.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音seo源码矩阵系统开发规则开发者分享(一)

抖音SEO矩阵系统源码开发,需要遵循一下步骤 1. 确定需求和功能:明确系统的主要目标和需要实现的功能,包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构:根据需求和功能确定系统的架构&am…

数据结构--绪论

这里写目录标题 前言数据结构研究内容基本概念与术语数据元素与数据对象的区别数据结构逻辑结构存储结构 数据类型和抽象数据类型数据类型抽象数据类型定义格式举例 小结研究内容基础概念 抽象数据类型的表示和实现 算法与分析算法的设计要求算法效率事前分析法例子 算法时间的…

【导航地图DB-kiwi地图格式】

背景知识: kiwi趣闻: kiwi是新西兰的一种鸟的名称,Kiwi鸟是尾巴翅膀极短不会飞的鸟,非常珍贵,只在新西兰僻静的丛林里才能见到,所以成为新西兰的国鸟。Kiwi鸟…

【iOS内存管理-内存的几大区域】

前言 iOS内存管理的第一篇章,了解iOS内存的五大分区。 总览 iOS中,内存主要分为五大区域:栈区,堆区,全局区/静态区,常量区和代码区。总览图如下。 如上图所示,代码区是在低地址段存放&#x…

4. CSS用户界面样式

4.1什么是界面样式 所谓的界面样式,就是更改一些用户操作样式,以便提高更好的用户体验。 ●更改用户的鼠标样式 ●表单轮廓 ●防止表单域拖拽 4.2鼠标样式cursor li {cursor: pointer; }设置或检索在对象上移动的鼠标指针采用何种系统预定义的光标形状。 4.3轮廓线outline…

FTP挂载网络磁盘

项目中使用存储阵列或NAS等网络存储作为文件存储地址,服务器与存储之间通过网络进行传输,当我把ftp指向的存储地址修改为网络磁盘时,会出现550等读取不到目录问题;以下为解决方案: 1.在服务器中新增windows用户&#x…

2、JDk、JRE、JVM三者区别和联系

JDK JRE JVM 含义 JDK: Java Develpment Kit java 开发工具 JRE: Java Runtime Environment java 运行时环境 JVM: java Virtual Machine java 虚拟机 一张图来解释: 联系: JVM不能单独搞定class的执行,解释class的时候JVM需要调用解…

什么是CI/CD?让你的项目变得更加敏捷!

在今天这个快速变化的时代,开发者们需要与时俱进,不断提升自己的工作效率。在这篇文章里,将一起探讨如何使用CI/CD和Github Action让你的项目更加高效,快速响应市场变化。 一、什么是CI? CI(持续集成&…

【已解决】Flask项目报错TypeError: tuple indices must be integers or slices, not str

文章目录 问题情境报错及分析报错代码分析 解决方案必要的解决方法可能有用的解决方法 问题情境 本解决方案适用情境:在本地可以正常运行的flask项目,放到云服务器报错TypeError: tuple indices must be integers or slices, not str,即代码…

计算机体系结构基础知识介绍之线程级并行性及其利用

线程级并行(Thread Level Parallelism,TLP)是指在多个处理器或多个核心上同时执行多个线程,从而提高程序的性能和吞吐量。线程级并行的基本原理是利用程序中的数据或任务的并行性,将程序划分为若干个相对独立的子任务&…

网络数据安全风险评估实施指引(一)

近日,全国信息安全标准化技术委员会发布了《网络安全标准实践指南 网络数据安全风险评估实施指引》(TC260-PG-20231A v1.0-202305),旨在响应《数据安全法》要求,落实重要数据处理过程风险评估,衔接已发布的…

DBeaver设置主题

一、下载包 帮助-》Install new software Eclipse Update Site 勾选一直下一步,直到安装完,会提示重启,重启设置主题即可 二、设置主题 窗口-》首选项-》DevStyle