NTFS文件系统的元文件

将一个分区格式化为NTFS后,格式化程序会往该分区中写入很多重要的系统信息,这些系统信息在NTFS文件系统中称为元文件。这些元文件用户是不能访问的,它们的文件名的第一个字符都是“$”,表示该文件是隐藏的,用户无法访问和修改。

在NTFS文件系统中,元文件主要有16个,包括MFT($MFT)、MFT镜像($MFTMirr)、日志文件($LogFile)、卷文件($Volume)、属性定义表($AttrDef)、根目录($Root)、位图文件($Bitmap)、引导文件($Boot)、坏簇文件($BadClus)、安全文件($Secure)、大写文件($UpCase)、扩展元数据文件($Extended metadata directory)、重解析点文件($Extend\$Reparse)、变更日志文件($Extend\$UsnJrnl)、配额管理文件($Extend\ $Quota)、对象ID文件($Extend\$ObjId)等,表4-30详细列出了这些元文件及它们的作用。

表4-30 NTFS文件系统的元文件

序号 元文件 功能
0 $MFT 主文件表本身,是每个文件的索引
1 $MFTMirr 主文件表的部分镜像
2 $LogFile 事务型日志文件
3 $Volume 卷文件,记录卷标等信息
4 $AttrDef 属性定义列表文件
5 $Root 根目录文件,管理根目录
6 $Bitmap 位图文件,记录了分区中簇的使用情况
7 $Boot 引导文件,记录了用于系统引导的数据情况
8 $BadClus 坏簇列表文件
9 $Quota(NTFS4) 在早期的Windows NT系统中此文件为磁盘配额信息
10 $Secure 安全文件
11 $UpCase 大小写字符转换表文件
12 $Extend metadata directory 扩展元数据目录
13 $Extend\$Reparse 重解析点文件
14 $Extend\$UsnJrnl 加密日志文件
15 $Extend\$Quota 配额管理文件
16 $Extend\$ObjId 对象ID文件

$MFT文件介绍

在NTFS文件系统中,磁盘上的所有数据都是以文件的形式出现的,即使是文件系统的管理信息也是以一组文件的形式存储的,即元文件。16个元文件中主文件表($MFT)是一个非常重要的元文件,它由文件记录构成,每个文件记录占用2个扇区。

每个文件都有一个文件记录,包括元文件本身,而主文件表($MFT)就是专门用来存储文件记录的一个元文件,在$MFT中前16个文件记录总是元文件的纪录。

系统通过$MFT来确定文件在磁盘上的位置以及文件的所有属性,所以$MFT是非常重要的。系统为了防止$MFT出现过多的碎片,在它周围保留了一个缓冲区。当其他的磁盘空间满的时候缓冲区里才会产生新的文件。这个缓冲区的大小是可调的,可以是磁盘空间的12.5%、25%、37.5% 或50%,每当其余磁盘空间变满时,缓冲区大小减半。

由于$MFT文件本身的重要性,为了确保文件系统结构的可靠性,系统专门为它准备了一个镜像文件($MFTMirr),也就是$MFT中的第2个记录。不过这并不是$MFT的完整镜像,而是一个小部分镜像,一般只镜像$MFT中的前四个文件记录。

$MFT中前16个文件记录总是元文件的记录,并且这16个文件记录的顺序是固定的,下面对这16个记录简单做一个介绍:

第1个记录就是$MFT自身的记录,也就是说$MFT首先对自己进行管理。

第2个记录是$MFTMirr的记录,也就是$MFT前4个文件记录的镜像。

第3个记录是日志文件($LogFile)的记录,该文件是NTFS为实现可恢复性和安全性而设计的。当系统运行时,NTFS就会在日志文件中记录所有影响NTFS卷结构的操作,包括文件的创建和改变目录结构的命令,从而可在系统失败时能够恢复NTFS卷。

第4个记录是卷文件($Volume)的记录,它包含卷名、NTFS的版本和一个标明该磁盘是否损坏的标志位,NTFS文件系统以此决定是否需要调用Chkdsk程序来进行修复。

第5个记录是属性定义表($AttrDef,attribute definition table)的记录,其中存放着卷所支持的所有文件属性,并指出它们是否可以被索引和恢复等。

第6个记录是根目录($ROOT)的记录,其中保存着该卷根目录下的所有文件和目录的索引。在访问一个文件后,NTFS就保留该文件的MFT引用,第二次就能够直接访问该文件。

第7个记录是位图文件($Bitmap)的记录,NTFS卷的簇使用情况都保存在这个位图文件中,其中每一位(bit)代表卷中的一簇,标识该簇是空闲还是已分配。由于该文件可以很容易被扩大,所以,NTFS的卷可以很方便地动态扩大,而FAT格式的文件系统由于涉及FAT表的变化,所以不能随意对分区大小进行调整。

第8个记录是引导文件($Boot)的记录,该文件中存放着操作系统的引导程序代码。该文件必须位于特定的磁盘位置才能够正确地引导系统,一般都是位于卷的最前面。

第9个记录是坏簇文件($BadClus)的记录,它记录着该卷中所有损坏的簇号,防止系统对其进行分配使用。

第10个记录是安全文件($Secure)的记录,它存储着整个卷的安全描述符数据库。NTFS文件和目录都有各自的安全描述符,为节省空间,NTFS将文件和目录的相同描述符存放在此公共文件中。

第11个记录为大写文件($UpCase,upper case file)的记录,该文件包含一个大小写字符转换表。

第12个记录是扩展元数据目录($Extended metadata directory)的记录。

第13个记录是重解析点文件($Extend\$Reparse)的记录。

第14个记录是变更日志文件($Extend\$UsnJrnl)的记录。

第15个记录是配额管理文件($Extend\$Quota)的记录。

第16个记录是对象ID文件($Extend\$ObjId)的记录。

第17~23记录是系统保留的记录,暂时不用,用于将来扩展。

从第24个记录开始存放用户文件的记录。

$MFT文件在文件系统中的存放地址,可以通过BPB中的“$MFT开始簇号”之一参数值获得。