1硬件白皮书NTFS文件系统规范关键字:WindowsNTNTFS文件系统NTFS作为MicrosoftWindowsNT®操作系统的标配文件系统克服了FAT/FAT32文件系统的大量缺点;同时又随着MicrosoftWindows2000®、MicrosoftWindowsXP操作系统的推广得到越来越广泛的应用。和FAT/FAT32文件系统相比,NTFS文件系统主要有以下优点。•支持大容量存储单元(最大支持462GB)•内建数据压缩支持•支持事务日志文件•加强数据安全目录基本数据类型引导扇区与BPB系统文件属性STANDARD_INFORMATIONATTRIBUTE_LISTFILE_NAMEVOLUME_VERSIONOBJECT_IDSECURITY_DESCRIPTORVOLUME_NAMEVOLUME_INFORMATIONDATAINDEX_ROOTINDEX_ALLOCATIONBITMAPSYMBOL_LINKREPARSE_POINTEA_INFORMATIONEAPROPERTY_SETLOGGED_UNTILITY_STREAM$MFMirr$Bitmap$BadClusNTFS卷初始化分区结尾与备份主引导扇区2目录结构基本数据类型文件记录文件记录是$MFT文件的基本组成部分,卷中的所有文件都由至少一个文件记录来描述,对于使用多个文件记录的文件,其第一个文件记录叫基本文件记录,其余的叫做扩展文件记录。文件记录由记录头数个文件属性和结束标志(0xFFFFFFFF)组成。文件记录头格式:名字偏移尺寸描述FR_Sign04记录签名:,值为:‘ELIF’FR_USOff42序列号的偏移(M)FR_USNSz62序列值个数+1(N)FR_LSN88日志文件序列号,该值在记录每次被修改时都会被改动FR_SN162记录序列号FR_LnkCnt182目录中记录本文件的引用计数,该值只用于基本文件记录FR_USAOff202第一个属性数据的偏移FR_Flags222标志,该成员可以是以下各值中之一0x01本记录已经被使用0x02本记录未使用0x04不明0x08不明FR_Size244当前记录的尺寸FR_AllocSz284当前记录分配的空间的尺寸FR_BaseFR328当前文件记录的基本文件记录的索引,如果当前文件记录是基本文件记录则该值为0,否则指向基本文件记录的记录索引。注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号FR_NxtAttrId402下一个属性的ID。下一次将会被添加到文件记录的属性的ID,每次往文件记录中添加属性时该值都会增加,每次文件记录被重新使用时该值都会被清零,第一个值肯定是0FR_Resvd422保留(XP新增)FR_NumOfFR444不明(XP新增)FR_USNM2序列号。该值记录文件记录被修改的次数,每次修改时该值+1,(包括文件被删除操作)该值不能为0FR_USAM+2(N-1)*2序列值占用的空间的原值3目录记录目录记录由标准头和存储目录键及目录数据的数据块组成,在$Boot文件中定义了目录记录的尺寸,这个值通常是4KB(到目录为止没有使用其他值)。名字偏移尺寸描述IR_Sign04记录签名:,值为:‘XDNI’IR_USOff42序列号的偏移(M)IR_USNSz62序列值个数+1(N)IR_LSN88日志文件序列号,该值在记录每次被修改时都会被改动IR_VCN168当前目录记录在目录存储区中的虚拟簇号IR_EntryOff244第一个目录项的偏移IR_EntrySz284目录项的尺寸IR_AllocSz324为目录项分配的空间的尺寸IR_Flags361为1表示有子节点IR_Resvd373保留IR_USN402序列号IR_USA422序列值占用的空间的原值记录序列号记录序列号是Microsoft公司为了确保记录数据的可靠性而在NTFS卷中提出的一项技术,在NTFS卷中,所有的记录类型数据(FR、IR)占用的空间都是按扇区尺寸(512字节)对齐。保护记录数据时,在每512字节的最末2个字节都会写入一个校验值以确保记录中的所有数据都被正确的写入磁盘中,而校验值所在位置的数据被拷贝到记录头之后被称作USA(UpdateSequenceArray)的数据块中,系统将记录数据从磁盘读入内存时将检查每个校验值是否与记录头的中序列号是否相同,如果相同则用USA中相应位置的数据恢复校验值位置的数据,反之则表明该记录被没有正确地修改。在每次写记录数据时序列号都会加1,当序列号为0时则再加1。虚拟簇号非驻留数据中的每个簇都有一个特定的序号,这个序号就叫做虚拟簇号,虚拟簇号0指向数据流的第一个簇。逻辑簇号卷中的每一个簇都有一个特定的序号,这个序号就叫做虚拟簇号,虚拟簇号0指向卷中的第一个簇(引导扇区)。数据流描述存放在间隔的簇中的属性数据称为流。每一个流都由起始簇号和尺寸来描述。流的起始簇号是相对于前一个流的偏移,该值是一个有符号数。流描述的格式如下:名字偏移尺寸说明SD_Desc01流描述说明,高4位(M)描述流描述偏移的字节数,低4位(N)描述流描述尺寸的字节数4SD_Size1N当前流的尺寸SD_OffN+1M当前流相对于上一个流的偏移,如果该值的最高位为1则表示该值是一个负数一个流描述之后紧随着下一个流描述,如果下一个描述的SD_Desc为0则表示当前描述是最后一个。一般情况下压缩文件和稀疏文件数据都以流的形式描述。例1:通常情况流描述:2120ED52248748222128C8DB0流1:SD_Desc=21–偏移占2个字节,尺寸占1个字节。SD_Size=20(1字节)SD_Off=5ED(2字节)Offset=5EDLength=20流2:SD_Desc=22–偏移占2个字节,尺寸占2个字节。SD_Size=748(2字节)SD_Off=2248(2字节)Offset=2835(2248+5ED)Length=748流3:SD_Desc=21–偏移占2个字节,尺寸占1个字节。SD_Size=28(1字节)SD_Off=DBC8(2字节)Offset=3FD(2835+FFFFDBC8)Length=28流4:SD_Desc=0。描述结束标志小计:0x20个簇存放在簇号0x5ED开始处0x748个簇存放在簇号0x2853开始处0x28个簇存放在簇号0x3FD开始处例2:压缩流流描述:1108400108111008110C10010400流1:SD_Desc=11–偏移占1个字节,尺寸占1个字节。SD_Size=8(1字节)SD_Off=40(1字节)Offset=40Length=8流2:SD_Desc=01–偏移占0个字节,尺寸占1个字节。SD_Size=8(1字节)SD_Off=-Offset=-Length=8流3:SD_Desc=11–偏移占1个字节,尺寸占1个字节。SD_Size=10(1字节)SD_Off=8(1字节)5Offset=48(40+8)Length=20流4:SD_Desc=11–偏移占个字节,尺寸占1个字节。SD_Size=C(1字节)SD_Off=10(1字节)Offset=58(48+10)Length=C流5:SD_Desc=01–偏移占0个字节,尺寸占1个字节。SD_Size=4SD_Off=-Offset=-Length=4流6:SD_Desc=0。流描述结束标志。小计:0x08个簇存放在簇号0x40开始处0x08个稀疏簇(未分配空间)0x10个簇存放在簇号0x48开始处0x0C个簇存放在簇号0x58开始处0x04个稀疏簇(未分配空间)引导扇区与BPBNTFS卷的第一个重要的数据区是BPB(BIOSParameterBlock),数据区位于卷中第一个个区域:$Boot文件的第一个扇区中。该扇区也叫做引导扇区。引导扇区与BPB结构名字偏移尺寸描述BS_jmpBoot03跳转到引导代码处。本域允许有以下两种格式:jmpBoot[0]=0xEB,jmpBoot[1]=0x??,jmpBoot[2]=0x90或jmpBoot[0]=0xE9,jmpBoot[1]=0x??,jmpBoot[2]=0x??0x??指这里可以是任意值,上述格式是跳转到代码的Intelx86无条件跳转指令,引导代码存放在卷中第一个扇区中BPB表的后面BS_OEMName38“NTFS”本域是判别卷是否为NTFS卷的必要条件,NTFS卷中此域必须设置为上述值BPB_BytsPerSec112每扇区字节数,该值仅可以从以下值中选取一个:512、1024、2048、1096。为了兼容以前的软件,建议使用512这个值BPB_SecPerClus131每个分配单元扇区数,大于0而且必须是2的整数次幂,本值可以是1,2,4,8,16,32,64,128。注意本值必须保证使每簇字节数(BPB_BytsPerSec*BPB_SecPerClus)小于4K。BPB_RsvdSecCnt142保留区域中保留的扇区数6BPB_NumFATs161FAT表的个数,本域是为了保持与FAT/FAT32的BPB兼容而保留,其值固定为0BPB_RootEntCnt172为保持兼容性而保留,值固定为0BPB_TotSec16192为保持兼容性而保留,值固定为0BPB_Media211存储介质代码,对固定磁盘为0xF8,对于可移动介质,其值通常是0xF0,合法的值有0xF0,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF。BPB_FATSz16222为保持兼容性而保留,值固定为0BPB_SecPerTrk242Int13H调用中的每磁道扇区,本值仅当存储介质按CHS方式寻址且能被Int13H识别才有意义。BPB_NumHeads262Int13H调用中的磁头数,其意义同前面的BPB_SecPerTrk。注意该值的基数是1。BPB_HiddenSec284隐藏扇区数,分区每一个扇区相对于分区表的偏移扇区数。BPB_TotSec32324为保持兼容性而保留,值固定为0BS_DrvNum361Int13H调用的磁盘号参数。BS_Reserved1371保留,值为0。BS_Reserved2382保留,值80H。BS_TotSec64408卷总扇区数。BS_1stClusOfMFT488$MFT文件第一个簇的簇号BS_1stClusOfMFTMirr568$MFTMirr文件第一个簇的簇号BS_ClusPerFR644每个文件记录占用的簇数1BS_ClusPerDR684每个目录记录点用的簇数1BS_Serial728卷序列号注1:每个记录占用的簇数如果为正值则表示该记录占用的簇数;如果为负值则表明记录尺寸小于簇尺寸,此时计算记录尺寸的方法应该是:记录的尺寸=2^(~每文件记录占用簇数)。比如:BS_ClusPerFR=0xF6(-10),此时记录的尺寸是BytsPerRecord=2^(~0xf6)=2^10=1024系统文件不同于FAT/FAT32分区固定的数据块布局,NTFS卷中所有的数据都以文件的方式保存,包括引导记录与目录等卷重要数据(在NTFS卷中重要数据块被称为系统文件),这样就允许将卷重要数据存放到卷中的任何地方(除了引导记录),并且对于所有重要数据都有一个标准的方法对其进行操作。这个特性使得任意改变卷尺寸十分方便(在卷位图文件后加上或减去增减的扇区信息就行了),而且也可以很容易地避免了FAT/FAT32卷中FAT表部分有物理损坏则卷中就会有很大部分空间使用的问题。对应于重要数据的种类,NTFS分区共有12个系统文件,他们分别是:名字描述$MFTMasterFileTab主文件表。该文件记录了卷中所有的文件(包括$MFT自己)的描述信息,通过$MFT文件可以访问卷中的所有信息。$MFT文件由多个文件记录(FRS)组成。每个文件的描述信息占用一个或多个文件记录。对于每一个文件,$MFT用一套被称7为属性(Attributes)的记录来保存其