NTFS(New Technology File System)是微软公司开发的具有较好容错性和安全性的文件系统,是Windows NT及之后的基于NT内核发展的Windows标准文件系统,它的设计目标是面向对数据安全性等要求较高的商务和企业级应用。NFTS的安全性及稳定性独树一帜,其分区对用户权限做出了非常严格的限制,每个用户都只能按照系统赋予的权限进行操作,任何试图超越权限的操作都将被系统禁止。同时它还提供了容错结构日志,可以将用户的操作全部记录下来,从而保证了系统的安全。并且,NTFS具有文件级修复及热修复功能、分区格式稳定、不易产生文件碎片等优点,这些都是其他分区格式所不能企及的。这些优点进一步增强了系统的安全性。
NTFS取代了FAT文件系统,是目前微软公司的Windows系列操作系统的主要文件系统。NTFS在FAT和HPFS(高性能文件系统)的基础上作了一系列改进(如支持元数据)并且使用了更复杂的数据结构(B+树)以便于提升性能、改善可靠性并降低磁盘空间利用率。NTFS还同时提供了若干附加的扩展功能,如访问控制列表和文件系统日志。NTFS的详细设计规范属于商业秘密,微软公司已经将其注册为知识产权产品,有关NTFS的资料非常少。因此,本节仅根据公开资料对NTFS作简要介绍。
1)分区:分区是磁盘的基本组成部分,被划分的磁盘的一部分,是一个能够被格式化和单独使用的逻辑区域。
2)卷:NTFS以卷为基础,卷建立在磁盘分区之上,当以NTFS格式来格式化磁盘分区时就创建了NTFS卷,一个磁盘可以有多个卷,一个卷也可以由多个磁盘组成。
3)簇:NTFS与FAT32一样,使用簇作为磁盘空间分配和回收的基本单位,即一个文件占用若干个整簇,而最后一簇的磁盘空间不再使用。在内部,NTFS仅引用簇,而不知道磁盘扇区的大小。这样使NTFS保持了与物理扇区大小的独立性,能够为不同大小的磁盘选择合适的簇,卷上簇的大小(称为簇因子)是用户使用Format命令或其他格式化程序格式化卷时确定的,它随着卷的大小而不同,但都为物理扇区的整数倍。簇的定位可以使用逻辑簇号(LCN)和虚拟簇号(VCN)。
4)逻辑簇号(LCN):LCN对卷中所有的簇号从头到尾进行简单顺序编号。
5)虚拟簇号(VCN):VCN对属于特定文件的簇从0到m编号(注:文件的总簇数为m+1),以便于引用文件中的数据,VCN不要求在物理上连续,可以映射到卷上任何的LCN。
6)主文件表($MFT):在NTFS中,卷中存放的所有数据,包括用于定位和恢复文件的数据结构、引导程序数据和记录整个卷的分配状态的位图,都包含在一个称为主文件表($MFT)的文件中,$MFT是NTFS卷结构的核心,是NTFS最重要的系统文件。$MFT由文件记录组成,每个文件记录的大小为1KB,卷上每个文件(包括$MFT本身)或者文件夹在元文件$MFT中都有一条记录,个别的文件或文件夹有2条甚至3条记录。
7)文件引用号:NTFS卷中的文件是通过称为文件引用号的64位值来标识的。文件引用号由文件记录号(低48位)和文件顺序号(高16位)组成。文件记录号对应文件在$MFT中的位置,顺序号随文件记录的使用而增加,从而使得NTFS能完成内部的一致性检查。
8)文件记录:NTFS不是将文件仅视为一个文本或二进制数据,而是将文件作为许多属性和属性值的集合来处理,除数据属性外,其他文件属性包括文件名、文件时间标记、文件拥有者等,每个文件或文件夹在元文件$MFT中均有一个文件记录号。
9)文件名:NTFS中的每个文件名或者目录名长度可达255字节,可以包含Unicode字符、多个句点和空格。
10)常驻属性:若文件的属性值能直接存储在$MFT记录中时,该属性称为常驻属性。在一般情况下,小文件或小目录的所有属性均直接存储在$MFT记录中。如果属性值直接存放在$MFT中,则NTFS只需访问磁盘一次即可获得数据。
11)非常驻属性:若文件的内容(文件体)比较大,不能直接存储在$MFT记录中,需要在$MFT之外为其分配足够的空间进行存储,该属性称为非常驻属性。在一般情况下,大文件或大目录的记录属性为非常驻属性;而小文件或小目录的记录属性为常驻属性。
12)文件名索引:在NTFS中,文件目录仅仅是文件名的一个索引,即为了便于快速访问而用一种特殊的方式组织起来的文件名的集合。要创建一个目录,NTFS应对目录中文件名的属性进行索引。
13)数据压缩:NTFS的压缩功能可以对单个文件、整个目录或卷上的整个目录树进行压缩,NTFS压缩只能在用户数据上执行,而不能在文件系统元数据上执行。数据压缩可减少磁盘使用空间,但每次解压缩需要大量数据运算,如果要复制一个压缩文件,过程是解压缩、复制、重新压缩复制文件。
从整体结构上讲,NTFS由元文件、用户文件以及数据组成。NTFS在创建时,会将一些重要的系统信息以文件的形式进行存储,存储这些重要信息所对应的文件就是元文件,它是NTFS最重要的部分。
在NTFS元文件中最重要的元文件就是$MFT。$MFT决定了NTFS中所有文件或者文件夹在卷上的位置。$MFT是一个数据库,由一系列文件记录组成。卷中的每一个文件都有一个文件记录号,文件记录编号从0开始,其中0号文件记录称为基本文件记录,也就是$MFT本身。$MFT中的文件记录大小一般是固定的,不管簇的大小是多少,均为1024字节。其中记录号从0~11的前12号记录是NTFS中最基本也是最重要的元文件。除根目录外,元文件的文件名以“$”开头,元文件是隐藏的系统文件,用户不能直接对元文件进行访问,在资源管理中也看不到NTFS的元文件。
NTFS的总体布局如图2-8所示。
图2-8 NTFS的总体布局
从图2-8中可知,NTFS的元文件分散地存储在逻辑盘(或者卷)中。整个NTFS是以簇为单位来分配磁盘空间的。而在分区时,总扇区数不一定是簇的倍数。因此,可能会出现剩余扇区,剩余扇区一般大于或等于1个扇区而小于一个簇。在FAT格式的文件系统中,有关簇号的指针(链表)包含在FAT链表中,而在NTFS中,有关簇号的指针以数据运行列表的形式存储在$MFT中。
NTFS把磁盘分成了两大部分,其中大约12%分配给了$MFT,以满足其不断增长的文件数量。为了保持$MFT元文件的连续性,$MFT对这12%的空间享有独占权。余下的88%的空间被分配用来存储文件。而剩余磁盘空间则包含了所有的物理剩余空间($MFT剩余空间也包含在里面)。$MFT空间的使用机制可以这样来描述:当文件耗尽了存储空间时,Windows操作系统会简单地减少$MFT空间,并把它分配给文件存储。当有剩余空间时,这些空间又会重新被划分给$MFT。虽然系统尽力保持$MFT空间的专用性,但是有时不得不做出牺牲。尽管$MFT碎片有时是无法忍受的,却无法阻止它的发生。
NTFS中15个重要的元文件说明见表2-3所列。
存储在NTFS中的每一个文件或文件夹在元文件$MFT中都有一条记录,有个别的文件或文件夹会有多条文件记录,其中第一个记录称为基本文件记录,但这种情况不多。每一条记录的大小为1024字节,元文件$MFT中记录编号从0开始,顺序进行编号,其说明如表2-3所示。
表2-3 NTFS中的元文件
0号记录:就是元文件$MFT自身。每个$MFT记录都对应着不同的文件,如果一个文件有很多属性或是分散成很多碎片,就很可能需要多个文件记录。这时,存放其文件记录位置的第一个记录就叫作“基文件记录”(base file record)。
1号记录:是镜像文件($MFTMirr)。该文件为元文件$MFT的前几条记录的一个备份,记录数的多少取决于NTFS每个簇的扇区数。
2号记录:日志文件($LogFile)。该文件是NTFS为实现可恢复性和安全性而设计的。当系统运行时,NTFS就会在日志文件中记录所有影响NTFS卷结构的操作,包括文件的创建和改变目录结构的命令,如复制,从而在系统失败时能够恢复NTFS卷。
3号记录:卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一个标明该磁盘是否损坏的标志位(NTFS以此决定是否需要调用Chkdsk程序来进行修复)。
4号记录:属性定义列表($AttrDef),其中存放了卷所支持的所有文件属性,并指出它们是否可以被索引和恢复等。
5号记录:根目录(.),其中保存了存放于该卷根目录下所有文件和目录的索引。在访问了一个文件后,NTFS就保留该文件的MFT引用,第二次就能够直接进行对该文件的访问。
6号记录:位图文件($Bitmap)。NTFS卷的分配状态都存放在位图文件中,其中每一位(bit)代表卷中的一簇,标识该簇是空闲的还是已被分配了的,由于该文件可以很容易地被扩大,所以NTFS卷可以很方便地动态扩大,而FAT格式的文件系统由于涉及FAT的变化,所以不能随意地对分区大小进行调整。
7号记录:引导文件($Boot),它是另一个重要的系统文件,存放着系统的引导程序代码。该文件必须位于特定的磁盘位置才能够正确地引导系统。该文件是在Format程序运行时创建的,这正体现了NTFS把磁盘上的所有事物都看成文件的原则。这也意味着虽然该文件享受NTFS的各种安全保护,但还是可以通过普通的文件I/O操作来修改。
8号记录:坏簇文件($BadClus),它记录了磁盘上该卷中所有损坏的簇号,防止系统对其进行分配使用。
9号记录:安全文件($Secure),它存储了整个卷的安全描述符数据库。NTFS文件和目录都有各自的安全描述符,为了节省空间,NTFS将具有相同描述符的文件和目录存放在一个公共文件中。
10号记录:大写文件($UpCase),该文件包含一个大小写字符转换表。
11号记录为扩展元数据目录($Extended metadata directory);12号记录~23号记录为系统保留;24号记录为配额管理文件($EXTend\$Quota);25号记录为对象ID文件($EXTend\$ObjId);26号记录为重解析文件($EXTend\$Reparse);27号以后是用户文件和目录。
NTFS的引导扇区(即DBR)和FAT32的引导扇区作用相同,占1个扇区的位置,从NTFS的分区表可以计算出DBR在整个物理磁盘中的位置,DBR是NTFS中元文件$Boot的重要组成部分。
DBR完成定义分区参数和引导系统的作用。在FAT32文件系统中,即使文件不正确,而DBR的引导记录正常,系统会显示没有错误。与FAT32文件系统不同,NTFS分区的DBR记录不是分区正确与否的充分条件,因为只有$MFT中的系统记录(如元文件$MFT等)正常,该分区才能正常访问,NTFS的定义见表2-4所列。
表2-4 NTFS中DBR的结构
NTFS在磁盘上写入文件数据的时候,有两种存储方式,即常驻和非常驻。
如果一个文件很小,文件的所有属性和属性的值(其中包括文件的数据),就全部存放在文件的$MFT的文件记录中。当属性值能直接存放在$MFT中时,该属性就称为常驻属性。有些属性总是常驻的,这样NTFS才可以确定其他非常驻属性。例如,标准信息属性和根索引就总是常驻属性。
每个属性都是以一个标准头开始的,在标准头中包含该属性的信息和NTFS通常用来管理属性的信息。该标准头总是常驻的,并记录着属性值是否常驻,对于常驻属性,标准头中还包含属性值的偏移量和属性值的长度。
如果属性值能直接存放在$MFT中,那么NTFS对它的访问时间就将大大缩短。NTFS只需访问磁盘一次,就可立即获得数据;而不必像FAT文件系统那样,先在FAT中查找文件,再读出连续分配的单元,最后找到文件的数据。
大文件或大目录的所有属性就不可能都常驻在$MFT中。如果一个属性(如文件数据属性)太大而不能存放在只有1KB的$MFT文件记录中时,NTFS将从$MFT之外分配区域。这些区域通常称为一个运行(run)或一个区段(Extent),它们可用来存储属性值,如文件数据。如果以后属性值又增加,那么NTFS将会再分配一个运行,以便用来存储额外的数据。值存储在运行中而不是在$MFT文件记录中的属性称为非常驻属性。NTFS决定了一个属性是常驻还是非常驻的;而属性值的位置对访问它的进程而言是透明的。
当一个属性为非常驻属性时,如大文件的数据,它的头部将包含NTFS需要在磁盘上定位该属性值的有关信息。图2-9显示了一个存储在两个运行中的非常驻属性。
图2-9 存储在两个运行中的非常驻属性
在标准属性中,只有可以增长的属性才是非常驻的。对文件来说,可增长的属性有数据、属性列表等。标准信息和文件名属性总是常驻的。