苏神保 刘丹
摘 要:在Linux操作系统中,磁盘的分区结构与Windows系统一样,都采用 MBR或者GPT磁盘分区,但在文件系统的结构上却有很大的差别,Windows系统常见的文件系统有FAT32、NTFS、exFAT等,而Linux系统的则为Ext2/3/4。本文以Linux操作系统中常见文件系统Ext3为例,详细介绍该文件系统的结构并举例说明其手工提取文件的方法。
关键词:Winhex;Ext3;Block;i-节点
1 Ext3文件系统基本介绍
Ext3文件系统所在区域先是被划分为一个个的块(Block),每个块的大小都是一样的,但是对于不同的Ext3文件系统,块的大小也可能存在差别。典型的块大小有1 024字节、2 048字节或者4 096字节,在Winhex中分别为2扇区、4扇区或者8扇区。该数值将在创建文件系统时被决定,可以由文件系统的创建程序根据硬盘分区的大小来自动选择一个较为合理的值。
块是文件系统中数据的分配单元,每个块均有唯一的编号,第一个块的编号为0,此后依序排列,0号块起始于文件系统的开始扇区。
Ext3文件系统的全部空间被划分为若干个块组,每个块组内的结构都大致相同,Ext3文件系统的整体结构及第一个块组的单元结构如图1所示。
由图1可以看出,Ext3文件系统的第一个块组的结构功能分析可阐释如下。
(1)Ext3文件系统的前两个扇区用来存放引导程序,称为引导扇区。如果没有引导程序则保留不用,一般为空扇区,没有任何数据。
(2)Ext3文件系统的第3个扇区、也就是2号扇区是超级块,超级块占用2个扇区,用于存储文件系统的配置参数(如块大小、总块数和i-节点数)和动态信息(如当前空闲块数和i-节点数)。
(3)块组描述符表用于存储块组描述符,占用一个或者多个块,设计时取决于文件系统的大小。每个块组描述符主要描述块位图、i-节点位图和i-节点表的地址等信息。
为了系统的健壮性,Linux最初在每个块组内部对超级块和块组描述符表做了备份,但是当文件系统很大时,这将耗费很多空间,尤其是块组描述符表占用的块较多时。为此后来采用了一种稀疏的方式来存储这些备份,也就是只有在块组号是3、5、7的幂的块组(如0、1、3、5、7、9、25、27、49等)内才对超级块和块组描述符进行备份。
(4)i-节点用于描述文件的元数据,每个i-节点对应文件系统中唯一的节点号。
2 Ext3文件系统的超级块分析
一般地,当块大小为8个扇区时,超级块起始于0号块,其位于0号块的2~3号扇区,0~1号扇区是引导程序或者保留扇区,4~7号扇区则是空闲的。另外,在块组号是3、5、7的幂的块组中,超级块也有相应的备份,通过在Winhex中向下搜索超级块标志53EF可以跳转至有超级块备份的相应块组中去。Ext3文件系统的超级块是一个至关重要的扇区,其中记录的参数非常多。这里给出了某一Ext3文件系统的0号块组的超级块如图2所示。而该超级块中主要参数及含义详见表1。
在上述Ext3文件系统中,超级块的参数描述了文件系统的总块数是13 107 200,每块组包含的块数是32 768,块大小、即每块包含的扇区数为22×1 024=4 096B=8S,而每块组包含的扇区数为32 768×8=262 144 S,總块组数为13 107 200/32 768=400,分别编号为0~399。
3 Ext3文件系统的块组描述符分析
Ext3文件系统的每个块组描述符占用32字节,有超级块备份的块组都包含有块组描述符备份,这是用来描述该块组中的块位图的起始块号、i-节点位图的起始块号以及i-节点表的起始块号等信息,一个Ext3文件系统有多少个块组,都需要在块组描述符中体现出来。而本文中研发得到的某一Ext3文件系统0号块组的块组描述符实例则如图3所示。此处以0号块组描述符为例,其hex数值代表的含义详见表2。
由表2可知,在该块组中,块位图开始于1 025号块,i-节点表位图开始于1 026号块,i-节点表开始于1 027号块,块组中已用块数32 768-31 228=1 540,已用i-节点数为8 176-8 124=52个。块位图描述该块组中块的使用情况,i-节点位图描述该块组中i-节点的使用情况。因篇幅有限,文中不再一一赘述。
4 Ext3文件系统的i-节点分析
Ext3文件系统的i-节点用来存储与文件相关的除文件名以外的所有信息,每个块组中都有一个自己的i-节点表,i-节点表由很多的i-节点组成,每个文件或者目录使用一个i-节点。i-节点表起始于i-节点位图所在块的下一个块,超级块中记录着文件系统的i-节点总数和每块组包含的i-节点数,i-节点的大小在超级块中指定,一般为128字节或者256字节。每个i-节点都有一个编号,第1个i-节点的编号为1,1~10号i-节点被系统保留,所以在超级块中会描述第一个非保留的i-节点,这个值一般为11,前10个保留的i-节点在i-节点位图中被表示为已分配,其中1号i-节点一般用于描述坏块,2号i-节点被分配给根目录使用,8号i-节点通常用于描述日志,如果已知一个i-节点号,就可以计算出该i-节点所在的块组,计算方法为:(i-节点号-1)DIV每块组i-节点数
在此基础上,还将计算得出在该块组中的i-节点号,计算公式为:(i-节点号-1)MOD每块组i-节点数+1
至此,可得一文件的i-节点表如图4所示。
由图4中的偏移地址0X28可知,在i-节点中用块指针描述文件内容的存放地址。每个i-节点中有15个块指针,包含12个直接块指针,1个间接块指针,1个二级间接块指针和1个三级间接块指针。12个直接块指针指向文件内容的前12个数据块地址,如果文件大于12个块,则第13个块指针是一个间接块指针,由其指向的块存放的是直接块指针而不是文件内容,以此类推。当文件较小时一般只需用到直接块指针,当文件较大时才会用到间接块指针。由上述实例可知,该文件从0X28至0X57已经使用了12个直接指针块,0X58为间接块指针。如需手工提取文件,需要从i-节点0X04位置读取文件大小后换算提取。
5 Ext3文件系统目录项分析
目录项用来存放文件及目录的i-节点号、目录项的长度、文件名等信息,并实际存储在分配给目录的块中。研究得到的一Ext3文件系统的根目录如图5所示。
在图5中标注出了文件1.docx的目录项,由表3可知,该文件的i-节点号为0C000000即为12,目录项的长度为1 000、即为16,文件名的长度占用6个字节,文件类型为文件,文件名为1.docx。同理可知,2.docx的i-节点号为0D000000、即为13,目录项的长度也是1 000、即为16,文件名的长度占用6个字节,文件类型为文件,文件名为2.docx。
6 Ext3文件系统的手工提取文件实例分析
某Ext3文件系统因计算机突然断电导致无法读取文件,现需恢复该文件系统的18.docx号文件,这一过程中将会涉及的操作步骤可做完整表述如下。
由2号扇区超级块信息可知,块大小为4 096字节、即8个扇区,i-节点大小为256字节,每块组包含的块数为32 768。跳转至8号扇区、即块组描述符,找到0号块组描述符的i-节点表的起始块号,跳转过去就可到达0号块组的i-节点表位置。因1号i-节点一般用于描述坏块,2号i-节点用于描述根目录的起始块号,读取2号i-节点的直接块指针为1538号块、即12304号扇区就可跳转至根目录,依据根目录结构可知18.docx文件的i-节点号为1D000000、即为29,因每块组包含的i-节点数为8 176,故29号i-节点位于0号块组,由块组描述符再次跳转至0号块组的i-节点表,从上至下数至29号i-节点、即为18.docx文件的i-节点。具体如图6所示。
由i-节点定义可知,该文件的i-节点包含有3个直接块指针(在图6中用方框标出),分别为6 587 479、6 587 480、6 587 481号块,文件大小为12 077字节,跳转至6 587 479号块,手工提取文件即可。
7 结束语
全文借助Winhex底层十六进制数据编辑恢复软件,以Linux下Ext3文件系统为例,详细分析了该文件系统的数据存储结构原理,探讨了超级块、块组描述符、i-节点表、目录项等要素的含义,可以为专业数据恢复技术人员提供参考。
参考文献
[1] 刘伟. 数据恢复技术深度揭秘[M]. 北京:电子工业出版社,2010.
[2] 徐国天. 基于EXT3文件系统的数据库文件恢复与检验软件的开发[J]. 信息网络安全,2011(10):44-46,70.
[3] 李巍. Ext-扩展文件系统的研究[J]. 信息系统工程,2010(8):134-135.
[4] 涂健,孙辉. Linux2.6内核下Ext3文件系统的数据结构及性能分析[J]. 南昌水专学报,2004,23(2):8-10,33.
[5] 黃步根. 数据恢复与计算机取证[J]. 计算机安全,2006(6):79-80.
[6] 夏煜,郎荣玲,戴冠中. Linux操作系统的文件系统建立过程的研究[J]. 计算机工程与应用,2001(15):90-92.