本节书摘来自异步社区《NTFS文件系统扇区存储探秘》一书中的第1章,第1.4节,作者:宋群生 , 宋亚琼著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.4 文件分配表FAT
NTFS文件系统扇区存储探秘
FAT文件系统在管理磁盘上的用户文件时,使用了文件分配表的管理方式。不过系统引导所需要的数据,不在文件分配表的管理范围之内。在这一点上与NTFS文件系统的存储方式是完全不相同的,NTFS文件系统将磁盘上的所有事物都看作文件,不管是用户的还是系统的。
文件分配表在FAT文件系统中占有非常重要的地位,对文件的所有操作,包括读、写、修改和复制,都要依赖于文件分配表中的有关记录。正因为如此,当初设计者将文件分配表作了两份相同的拷贝存储在磁盘上。
1.4.1 扇区分簇管理
操作系统或应用程序在将数据写入一个磁盘文件时,必须在磁盘上找到可以使用的未用扇区。反过来要将数据从磁盘文件中读出时,也要在磁盘上找到已经储存了相应数据的有关扇区。要查找扇区必须知道扇区的地址,文件分配表FAT就是记录扇区地址的。
因为硬盘的扇区非常多,如果将每个扇区的地址都记录在文件分配表里,势必造成文件分配表体积庞大,查找时效率将会很低。为解决这个问题,采用了将扇区分组管理的方法。分组的过程称作扇区分簇,是由高级格式化程序在格式化磁盘时完成的。
扇区分簇以后,将每个簇的地址记录到文件分配表FAT里去。由于一个簇能包含很多扇区,所以文件分配表的体积减小了,查找的速度就提高了。
一个簇能包含多少扇区,是由文件系统和分区的大小决定的,在使用FAT16和FAT32两种文件系统时,分区大小和簇大小以及每簇扇区数的关系见表1-4。
1.4.2 簇链和文件检索过程
当使用一个新格式化的逻辑驱动器时,文件数据存放的簇号是连续的。使用一段时间以后,由于经常对文件进行删除、拷贝和修改操作,每个文件分配的簇号就不一定是连续的了。为了确保在存取文件时能够检索到所有连续或不连续的扇区地址,文件分配表采用了“簇链”的记录方式。
当需要从磁盘上读取一个文件时,首先从文件目录表中找到该文件的目录登记项。继而从目录登记项的有关字段,查到分配给该文件的第一个簇号,根据第一簇号的内容可以计算出两组数据。
其中一组数据指出了文件在数据区DATA里的第一簇扇区首地址,从第一簇扇区首地址开始,数据是连续存放的,连续存放多少个扇区由分区格式和分区大小决定,表1-4中列出了它们的对应关系。
另外一组数据指出了FAT表内簇登记项的地址,如果其值是结束标志“ffffH”(FAT16格式)或“0fffffffH”(FAT32格式),说明文件至此已经结束。如果不是结束标志,则该登记项的值为第二个簇号,据此又可以计算出两组数据,继而确定文件在数据区里第二簇扇区首地址和FAT表内第二个簇登记项的地址。
继续重复上面的过程,就可以得到文件在DATA区里的全部数据,以及文件在FAT表里所有簇登记项的地址。
详细了解文件数据存取的全过程,就可以从遭到破坏、不能启动的硬盘上,利用读取物理硬盘扇区的工具程序把文件数据读出来。
当需要在磁盘上建立一个新文件时,首先顺序检索FAT表,找到第一个可用簇,可用簇登记项的值为“0000H”(FAT16)或“00000000H”(FAT32)。将该簇作为起始簇,写入文件目录表FDT的相关登记项的起始簇字段中。然后继续检索后面的可用簇,找到以后将其簇号写入第一个可用簇项内。
按照以上过程进行下去,将满足文件长度所需的簇数全部找到。使每一个簇项的值指向下一个所需簇项,在最后的簇登记项内写入结束标志“ffffH”(FAT16)或“0fffffffH”(FAT32),于是一条能够检索整个文件的“簇链”就形成了。
当需要对文件进行扩展时,先检索FAT表,找到1可用簇。将簇项的内容置为结束标志,并将文件原来的最后簇项值修改为指向此可用簇。以此类推,直到满足文件的全部扩展要求。
当删除文件时,除了将文件目录表中登记项的第1字节改为e5H,还要把该文件在FAT表的“簇链”中所对应的簇项全部清零,这些被清零的簇项又可以供其他文件使用。不过在删除文件的操作结束以后,目录登记项的其他字段仍然保存完好,只是文件名的第1字节变成了e5H,并且文件存储在扇区里的所有数据仍然存在。这时只要FAT表中被清零的簇项没有被新文件使用,就可以运行相关软件恢复被删除的文件。
FAT表记录了磁盘文件对磁盘使用情况的信息,其中包含所有未分配的、已分配的或标记为坏的盘簇的信息。
FAT表只记录磁盘文件对磁盘的占用信息,对于系统保留的控制信息并不由FAT表中的盘簇表示。这些保留信息包括引导扇区、分区表、FAT表本身占用的扇区以及文件目录表FDT占用的扇区。
1.4.3 FAT表扇区寻址
FAT表在磁盘文件系统中的地位是非常重要的,为了使磁盘文件的操作安全可靠,文件系统的设计者们制订了两个内容相同的FAT表。虽然当第一个FAT表出错时,操作系统并不利用第二个FAT表去修复它,但技术人员可以使用有关的软件,用第二个FAT表去修复它。
当硬盘的系统控制信息遭到轻微的破坏时,可以通过各种方法去修复它。如上面所讲的四部分系统保留信息,在某一部分出现错误时,可以采用从其他计算机上移植的方法,或是采用手工编制扇区数据的方法进行修复。
但是当这些控制信息严重损坏,譬如分区表链和分区引导记录严重损坏时,上述方法就无能为力了。一般来说,在这种情况下只有重新分区、格式化,硬盘上的所有数据也就全部丢失了。
硬盘的系统控制信息遭到破坏时,一般情况下FAT表被破坏的可能性比较小。特别是第2个FAT表一般能够保存完好,因为第2个FAT表很少受到应用程序的访问。这时如果使用物理硬盘扇区的读写技术,就有可能从硬盘上恢复出重要数据来。这种操作的对象是针对整个硬盘,而不用考虑硬盘的分区情况,也不用考虑硬盘上安装的是什么操作系统。
查找FAT表首扇区地址的方法很简单,可以根据FAT表的特征标记,使用查找扇区特征的工具程序进行查找。不管是FAT16文件系统还是FAT32文件系统,每个FAT表的首扇区里前两字节都是F8 FF。