当前位置: 首页 > article >正文

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.kler.cn/a/37378.html

相关文章:

  • 【swift 代码规范】
  • globals.hpp记录
  • 前端笔记5
  • 计算机网络 day3 广播风暴 - VLAN - Trunk
  • RabbitMQ系列(28)--RabbitMQ使用Federation Queue(联邦队列)解决异地访问延迟问题
  • 网络安全中黑客的问题,黑客真的那么厉害吗?
  • 【Matlab】智能优化算法_广义正态分布优化算法GNDO
  • k8s kubeadmin方式安装部署
  • 小程序:调用手机的相册
  • JMeter压测常见面试问题
  • JavaScript
  • HarmonyOS学习路之开发篇—设备管理(位置开发)
  • spring复习:(24)ApplicationContext中的BeanPostProcess是在哪里注册到容器的?
  • vue3,elementPlus和自己封装,点击 新增添加表单,删除表单,提交数据
  • 《Redis 核心技术与实战》课程学习笔记(五)
  • 面试知识点总结一
  • Python中退出While循环的三种方法举例
  • Ripple赢了!法官裁定XRP不属于证券,价格上涨超70%
  • 【数据挖掘】时间序列教程【十】
  • 精彩回放 | AI驱动下的流程挖掘如何提升企业决策和运营效率?