mkfs.ext4命令格式化块设备后,块设备上ext4的布局大致如上图所述,包括以下信息:
块设备被按group 来划分,每个group有对应的group deorSuper block在Group 0中, 非group 0中的super block是backup super blockJournal block的位置并不是在最后一个group.(本例中,journal block在group 2)找到文件系统超级块超级块
首先,如果磁盘是DOS分区格式,使用fdisk命令检查磁盘的分区信息。从磁盘的分区信息中,我们可以得到以下内容:
整个磁盘有多大磁盘被分成了多少个分区每个分区的大小和起始结束的位置下图给出了一个例子,下面的文件系统分析也是基于这个磁盘:/dev/sde1。
下图清晰描述了用于测试的SD卡的分区信息。对于块设备/dev/sde,最小的单位是扇区,扇区大小通常为512。SD卡的大小可以用扇区来描述。
然后,我们要开始寻找ext4的超级块。ext4的超级块包含一个幻数:_ _ _ le 16s _ magic = 0xef 53,我们可以用它来确认超级块。
使用Linux的常见命令dd+hexdump查看您想要查看的块设备的任何位置的内容。
如下图所示,dd命令:
sudo DD if =/dev/SDE bs = 512 skip = 2048 | hex dump-C-n 2048
Skip转到块设备sde1的偏移量2048 x 512B(这里,512是扇区大小),hexdump给出其后面的2KB内容。在0x438处,找到了ext4的超级块幻字,同时在使用mkfs.ext4时,-L参数指定的diskLabel为“SDE 1 _韦勒”
定位日志块和索引节点表
Ext4没有jbd2还会活吗?当然可以!但是,会变得很不靠谱。jbd2和文件系统之间的关系将在以后的文章中详细描述。但是,我们需要知道日志块设备是一个通用日志层,它为其他文件系统提供日志服务。
由于文件的写入和挂载过程与jbd2密切相关,在分析文件系统问题时,我们通常需要查询日志块的内容进行分析,因此请按照以下内容定位日志块。
首先使用dumpe2fs查看sde1 block设备上ext4文件系统的信息,这是本文唯一使用的ext4原生工具。
如下图所示,可以知道以下信息:
journal的位置信息存储在inode table 的 offset 8 上(inode index = 8)journal的整个大小是16MBjournal的长度则是和文件系统的block size相同, 也是4KB.Inode size 是256B命令:
sudo dumpe2fs /dev/sde1
然后,问题来了。为了找到日志的起始位置,我们必须找到索引节点索引8的位置。其实用hexdump直接搜索journal的魔字也能找到Journal块的起始位置,不过这是我初学的时候的方法,现在想起来太低了。
定位索引节点表
回到sudo dumpe2fs /dev/sde1命令的输出结果,在组0的描述中,Inode表的起始块号是65。
众所周知,文件系统的块大小为4 KB,索引节点大小为256B .
那么索引节点表中索引节点索引8的偏移量是(8-1) x 256B = 0x700
使用以下命令转储从0x700开始截取256B的内容:
命令:
sudo DD if =/dev/SDE 1 bs = 4096 skip = 65 | hex dump-Cv-n 2048
因此,日志块的起始位置为0x00010000 x 4KB,即块号为0x10000、大小为0x1000 x 4KB(16MB)的块。
如何判断结果?以上结果如何才能准确?
journal块还定义了数据格式,判断依据是/dev/sde1设备的0x10000块偏移量处的数据内容应该是Journal超级块,块类型4表示Journal超级块v2。
窥见真相:
命令:
sudo DD if =/dev/SDE 1 bs = 4096 skip = 65536 | hex dump-Cv-n 2048
找到文件内容的位置
为了找到文件内容在磁盘上的位置,我们需要知道在ext4上创建文件的过程。数据块位图和索引节点位图像簿记员一样要记录数据块和索引节点表的使用情况。索引节点表用于描述文件内容所在的块数和块数。
首先,我们在数据块设备sde1挂载的目录中创建文件file1.txt,然后使用ls -i命令获取文件file1.txt的索引节点索引.
在以下示例中,file1.txt的索引节点索引为12。
inode表中inode12的偏移量为(12-1) x256B = 0xB00。使用以下命令转储索引节点表,并在0xB00位置截取256字节:
命令:
sudo DD if =/dev/SDE 1 bs = 4096 skip = 65 | hex dump-Cv-n 4096
从图中可以看出,文件的数据块位于0x00008021。我们出去看看吧。猜猜我在文件里写了什么。
命令:
sudo DD if =/dev/SDE 1 bs = 4096 skip = 32801 | hex dump-Cv-n 4096
找到文件名位置
不知道大家好奇不好奇,这个文件在根目录下,那么文件名在哪里呢?ext4如何知道它在一个文件夹中包含哪些文件?
首先,根目录也是一个目录,目录在文件系统中的表示和文件的表示是一样的。
您还可以找到根目录的索引节点索引
我们可以看到当前目录的索引节点索引,即“.”,是2。
索引节点索引2内容(该命令被忽略,您可以考虑该命令是什么样子的):
根据inode表描述,根目录的数据块在块偏移量0x25处,长度为一个块。
让我们看看块号为0x25的内容。我们可以看到文件名,如“.”,".." alt="Ext4 ext4文件系统之裸数据的分析实践">