NTFS文件系统简介作者:zty,来源:mrtlab.com 第一章 前言 NTFS是随着Windows NT操作系统而产生的,全称为“NT File System”,中文意为NT文件系统,如今已是windows类操作系统中的主力分区格式了。它的优点是安全性和稳定性极其出色,在使用中不易产生文件碎片,NTFS分区对用户权限作出了非常严格的限制,每个用户都只能按着系统赋予的权限进行操作,任何试图越权的操作都将被系统禁止,同时它还提供了容错结构日志,可以将用户的操作全部记录下来,从而保护了系统的安全。 NTFS是一个具备错误预警的文件系统。由于NTFS对关键文件系统的系统信息采用了冗余存储,故而当磁盘上的某个扇区损坏时,NTFS仍可以访问卷上的关键数据。NTFS分区的最开始的16个扇区是分区引导扇区,用以保存分区引导代码,接下来是主文件表(MFT),如果MFT所在的磁盘扇区出现损坏,NTFS文件系统会将MFT转移到到硬盘的其他扇区,这样就保证了NTFS文件系统和Windows操作系统的正常运行。比之先前的FAT16和FAT32文件系统的FAT(文件分配表),FAT只能固定在分区引导扇区的后面,一旦该扇区,整个文件系统就会瘫痪,NTFS文件系统显然要先进的多了。不过这种移动MFT的做法却也并非十全十美,如果分区引导代码中指向MFT的部分出现错误,那么NTFS文件系统便会不知道到哪里寻找MFT ,从而会报告“磁盘没有格式化”这样的错误信息。为了避免这样的问题发生,分区引导代码中会包含一段校验程序,专门负责侦错。 第二章 NTFS概述 NTFS是Mircrosoft推出的一种新型文件系统。Mircrosoft推出NTFS文件系统的主要目的是将其作为WindowsNT/2000/XP和服务器版本的默认文件系统。NTFS的目标是获得可靠性.高效性和安全性。 2.1 NTFS的特点 它提供了容错结构日志,可以有效地保护系统的安全。NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS通过使用标准的事务处理日志和恢复技术来保证分区的一致性。 它的可升级性基于使用常规结构对特殊数据结构进行管理。在NTFS文件系统将所有的数据都视为文件,通常在其他文件系统中被隐藏的管理数据在NTFS中也被存储在文件中,文件系统管理数据可以像普通文件一样被存放在文件系统内任何位置。 NTFS支持对分区.文件夹和文件的压缩。 在NTFS分区上,可以为共享资源.文件夹以及文件设置访问许可权限,许可的设置包括两方面的内容:一是哪些组或用户对文件夹.文件和共享资源进行访问。二是获取访问许可的组或用户可以进行什么级别的访问。 在Windows 2000的NTFS文件系统下可以进行磁盘配额管理。磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额限制内的磁盘空间。 NTFS被作为Windows操作系统的标准文件系统,同时也被大多数免费发行的Unix版本的支持。 NTFS支持对大容量磁盘存储,可以支持的卷大小可以达到2TB。 NTFS于FAT文件系统一样,也使用“簇”作为数据寸取的最小单位。但因为它将所有的数据,包括文件系统管理数据也作为文件进行管理,所以NTFS文件系统中的所有扇区都被分配以簇号,并以0开始对所有的簇进行编号,文件系统的0号扇区为0号簇的起始位置。 2.2 NTFS的基本概念 MFT MFT,即主文件分配表的简称,它是NTFS文件系统的核心。MFT由一个或几个MFT项(文件记录)组成,每个MFT项占用1024字节的空间。每个MFT项的前部几十个字节有着固定的头结构,用来描述本MFT项的相关信息。后面的字节用于存放“属性”。每个文件和目录的信息都包含在MFT中,每个文件和目录在表中至少有有一个MFT项。初引导扇区外,访问其他任何一个前都要先访问MFT,在MFT中找到该文件的MFT项,根据MFT项中的记录的信息找到内容并对其进行访问。 属性 在NTFS中,所有与数据相关的信息都称为“属性”,NTFS与其他文件系统最大的不同之处在于,大多数文件系统是对文件的内容进行读写,而NTFS则是对包含文件内容的属性进行读写。 在数据结构中,属性又可以分为常驻属性和非常驻属性 常驻属性。有的属性其属性内容很小,它的MFT项可以容纳下它的全部内容,为了节约空间,系统会直接将其存放在MFT项中,而不再为其另外分配簇空间,这样的属性称为常驻属性 非常驻属性。非常驻属性是指那些内容较大,无法完全存放在其MFT项中的属性。如文件的数据属性,通常内容很大,需要在MFT之外另为其分配足够的簇空间进行存储,这样的属性就是非常驻属性。 2.3 NTFS元文件 NTFS文件系统被创建时,会同时建立一些重要的系统信息。这些系统信息也全是以文件的形式存在,被称为元文件。元文件的文件名都以 $ 符号开头,表示其为隐藏的系统文件,用户不可直接访问。 NTFS下的元文件总共有17个,其具体含义如下: $MFT:它其实是整个主文件表,也就是将整个MFT看做一个文件。 $MFTMirr:MFT前几个MFT项的备份,NTFS也将其作为一个文件看待。 $LogFile:日志文件。 $Volume:卷文件,包含卷标和其他版本信息。 $AttDef:属性定义列表,定义每种属性的名字和类型。 $Root:根目录文件。 $Bitmap:位图文件,它的数据属性的每个bit对应文件系统中的一个簇,用以描述簇的分配情况。 $Boot:引导文件,DBR扇区就是引导文件的第一个扇区。 $BadClus:坏簇记录文件。 $Quota:早期的NT系统中记录磁盘配额信息。 $Secure:安全文件。 $UpCase:大小写字符转换表文件。 $Extend metadata directory:扩展元数据目录。 $Extend\$Reparse:重解析点文件。 $Extend\$UsnJrnl:变更日志文件。 $Extend\$Quota:配额管理文件。 $Extend\$ObjId:对象ID文件。 第三章 NTFS文件系统的布局 一个NTFS文件系统大致上可以分为引导区、MFT、MFT备份区、数据区和DBR备份扇区几个部分。因为NTFS将所有的数据都视为文件,理论上除引导扇区必须位于第一个扇区外,NTFS卷可以在任意位置存放任意文件,但通常情况下会遵循一定的习惯布局。在XP系统下NTFS卷大致布局如下图:
NTFS的特点 1)引导扇区。引导区部分包括DBR和引导代码,一般系统为其分配16个扇区,未完全使用。 2)MFT区。文件系统中出现一个“MFT”区,这个“MFT区”是一个连续的簇空间,除非其他空间已全部被分配使用,否则不会在此空间中存储用户文件或目录。在WINXP下创建的NTFS,其MFT通常距离引导扇区较远,但在WIN2000下创建的NTFS,其MFT通常起始于4号簇位置。 3)MFT备份区。由于MFT备份的重要性,在文件系统的中部为其保存了一个备份,不过这个备份很小,只是MFT前几个项的备份。 4)引导扇区备份扇区。在卷的最后一个扇区,保存了一份DBR扇区的备份。这个扇区包含在分区表描述的该分区大小中,但却不在DBR描述的文件系统大小范围之内。DBR描述文件系统大小时,总是比分区表描述的扇区数小1个扇区。 第四章 DBR(引导扇区) NTFS的引导扇区也位于文件系统的0号扇区,这是它与FAT文件系统在布局 上的唯一相同之处。数据结构如下图,此图为一个硬盘的DBR: 4.1 DBR的作用 DBR(DOS BOOT RECORD,DOS引导记录),位于柱面0,磁头1,扇区1,即逻辑扇区0。DBR分为两部分:DOS引导程序和BPB(BIOS参数块)。其中DOS引导程序完成DOS系统文件(IO.SYS,MSDOS.SYS)的定位与装载,而BPB用来描述本DOS分区的磁盘信息,BPB位于DBR偏移0BH处,共13字节。 它包含逻辑格式化时使用的参数,可供DOS计算磁盘上的文件分配表,目录区和数据区的起始地址,BPB之后三个字提供物理格式化(低格)时采用的一些参数。引导程序或设备驱动程序根据这些信息将磁盘逻辑地址(DOS扇区号)转换成物理地址(绝对扇区号)。 4.2 DBR的数据结构 以上引导扇区最为关键的字节数是0B-0C(每扇区字节数) 0B-0C(每扇区字节数) 0D(每簇扇区数)28-2F(文件系统扇区总和) 30-37(MFT起始簇号)38-3F(MFT备份的起始簇号)40(每MFT项大小)44(每个索引的簇数),但数据发生不可预料的损坏时,可以根据以上信息重建分区表,定位数据区,恢复MFT,重建DBR,这些关键字节码的用处不言而喻。 第五章 主文件表MFT 格式化成NTFS文件系统时,就是在其中建立了一个主文件表MFT,其中包含16个元文件的文件记录。 为了尽可能减少$MFT文件产生碎片的可能性,系统预先为其预先为其预留整个文件系统大约12.5%的空间。只有在用户数据区的空间用尽时,才会临时让出MFT区的部分空间存储数据,但一旦数据区有了足够的空间,就会立即收回原来让出的MFT空间。主文件表MFT由一个个的MFT项组成,每个MFT项实际就是一个文件记录,其中用各种属性记录着该文件或目录的各种信息。每个MFT项实际的大小在引导扇区中进行说明,Microsoft的所有版本都使用1024字节的大小。前部为一个包含几十个字节的具有固定的大小和结构的MFT头,剩余的字节为属性列表,用于存放各种属性。 5.1 MFT的基本特点: MFT的第一个区域是签名,所有的MFT项都有相同的签名(FILE)。如果在项中发现错误,可能将其改写成“BAAD”的字样。 MFT项还有一个标志域用以说明该项是一个文件项还是目录项,以及它的分配状态。MFT的分配状态也在一个$BITMAP属性文件中进行描述。 每个MFT项占用两个扇区,每个扇区的结束两个字节都有一个修正值,这个修正值与MFT项的更新序列号相同,如果发现不同,会认为该MFT项存在错误。 如果一个文件的属性较多,使用一个MFT项无法容纳下全部的属性,可以使用多个MFT项,第一个项被称为基本文件记录或基本MFT项。 5.2 MFT的数据结构: 重要字节码解释如下: 1)00-03:MFT项签名值“46494C45”,明文为“FILE”。 2)04-05:更新序列号编号的偏移。 3)06-07:更新序列号的数组个数,通常为3。 4)08-0F:日志序列号。 NTFS数据恢复实例数据丢失的具体故障为:盘分了三个区在一次意外死机后磁盘提示(前两个区是正常的)提示未格式化(其实大多数朋友知道这时的问题简单得多也许重建DBR后整个盘里面的数据都在,这里暂且就不谈这种问题的解决方法了),要命的是这时已经鬼使神差地点击了格式化了,结果大家当然就知道了,数据肯定是没有了。据转到我这里的那同行说他用各种搜索软件对整个区搜了好几遍(这也是大多数所谓专业的数据恢复商所用的恢复方法了),当然也搜到了很多数据,尽管很乱但还能正常打开。最后客户确认搜出来数据大部份正常,但最重要的的一个压缩文件损坏了,大家知道压缩文件损坏了是很难很难修复的了。首先我用WINHEX把他搜出来的那个压缩文件打开分析了下,文件头乱了,中间的数据也不正常。无法修复,只好从原盘着手了。竟然搜索软件搜出来的是损坏的,那就只有用手工来做了,当然用手工做这种格式化了的数据很费时,且计算量也很大,只能针对像这样的个别特重要的数据。 对原盘的那个格式化掉的分区做完镜像后,用WINHEX打开镜像,设置镜像文件为磁盘。如下图所示: 分区是NTFS格式的,整个分区大小为25.4G。对NTFS分区格式研究过的朋友会知道,在NTFS文件系统中,文件亦是按簇进行分配的,文件通过主文件表MFT(Master File Table)来确定其在磁盘上的存储位置、大小、属性等信息。相当于FAT系统下的FAT+FDT的功能。每文件都有一个文件记录。其中第一个记录就是MFT自己本身。我们转到第一个文件记录也就是MFT了直接点可以看到如下图所示: 通过第一个文件记录往下观察发现格式化了后对文件记录没有产生破坏。那么这时我们就可以有一个恢复的思路了:找到所说的那个压缩文件的在MFT中的记录,再通过对文件记录的分析来确定文件在磁盘中的位置及大小,就可以直接从中提出文件了。想到做到,只知道一个压缩文件的压缩文件名为:源文件与素材。那好,我们可以新建一个文本记事本只输入压缩文件名―――源文件与素材!保存,再用WINHEX打开可以看到如下图: 然后再转回来,直接从第一个文件记录往下开始搜索十六进制数值90 6E 87 65 F6 4E 0E 4E 20 7D 50 67搜索到了一个地方停下来了,看看是不是那个压缩文件的记录呢看下图: 根据观察可以看出正是客户要的那个压缩文件的记录,那么我们又如何来确定这个压缩文件在磁盘上的那一个扇区?占用了多少的扇区呢?这个就需要对NTFS格式有所了解了。NTFS将文件作为属性、属性值集合来处理,这一点其他文件系统不一样。可以看到在MFT中用了不同颜色的段来区分, 如上图所标记的,第一个为文件记录头,第二个10H表示标准属性,第三个30H表示文件名属性,最后一个80H表示数据流属性也就是关键所在了。这里我们只分析数据流属性,其它属性就不一一分析了,可以查看相关资料。每一个属性都为两部份:属性头和内容。先来分析数据流属性的属性头:从第1第4四个字节表示属性的类型,第5第8四个字节这里的值是48 00 00 00表示属性的长度(包括属性头和内容)为72个字节。从17到24共8个字节表示起始的VCN即虚拟簇号,第25到32共8个字节表示结束的VCN此处为2D7FH也就是 这个压缩文件占用了11648个簇。再往下分析从33到40共8个字节表示数据运行的偏移。此处为40H也就是从第64个字节开始了。我们就直接来分析数据运行也只有这一个运行32 80 2D D5 58 17所以起始的LCN即逻辑簇号为1758D5H=1530069,长度为2D80H=11648。接下来我们转到1530069簇看,第一个字节右键选块开始,上面算出来这个文件的,如下图: 大小为11648个簇,也就是1530069+11648=1541717再转到1541717簇,所在的扇区的上一扇区也就是文件的结尾了。最后一个字节右键选块结尾。再在所选块中右键编辑-复制扇区-到新文件即指点到路径保存。然后改扩展名为RAR。 至此恢复完成。经检查没有一个损坏的。 手工定位NTFS文件系统下的文件相信很多朋友在认真看完数据恢复书籍中,关于NTFS文件系统中讲述的一系列属性以后,或多或少还是有些范迷糊。确实,NTFS文件系统结构比较复杂,且书中也没有讲到如何利用这些属性来定位文件,这对于初学者来说,无疑是一个缺憾. 现在就以一个叫“MFT结构分析”的图片文件来进行手工定位,其存储路径为E:\教程\数据恢复。 接下来我们一层一层的去定位文件.以对所学的属性做一个融会贯通.或许有的朋友会说:在实际操作中,可以通过在MFT中搜索文件名的方式来做出定位,这样也是可以的。我制作本分析过程的初衷也就是给初学者对NTFS的理解提供一个思路。 学过FAT文件系统的,一定知道如何定位分区以及DBR,那好,我们就直接从DBR开始 从DBR中得出,每簇扇区数为08H,($MFT一下简称MFT).MFT的起始簇为:00000C00H,转换为十六进制分别为8扇区和786432簇。现在跳转到786432簇,如下图: 我们可以看到,这是MFT的第一个记录,记录的是它自己。,接下来我们跳转到MFT的关于根目录的记录,也就是第5号记录。根目录一般存储的文件以及文件夹比较多。所以,它是非常驻的,关于这些文件夹的信息记录在了其它的位置。而记录在什么位置是由索引分配属性来记录的,也就是A0属性,接下来着重看一下A0属性,如图: 上图红色的标注的位置是运行(Data run)31H表示用三个字节描述的是索引的位置的起始LCN(3E9002H),一个字节描述的是长度(02H)。下一个运行的位置描述的是00H表示到此结束,只有一个运行。(提示:如果下一个运行由内容,那么它描述的LCN加上前一个运行描述的LCN才是其真正的LCN,如果由三个运行,用第三个运行的LCN加上前两个的LCN就是第三个运行的真正的LCN,以此类推!) 我们将其转换为10进制数值得到这样一个信息,索引项的起始位置为167998簇,乘以每簇扇区数8,等于1343984扇区,长度为2个簇,跳转到1343984扇区,如图: 这个位置是根目录的索引项,可以看到里面索引的文件名为元数据。“教程”这个文件夹也存放在根目录里面,我们搜索该文件名,以找到相对应的索引项,由于NTFS里面文件名是用Unincode字符来表示的,所以该文件名转换为16进制数值为59650B7A8765H,我们在根目录索引项里搜索此文件名: 在1343994扇区找到了“教程”的索引项,(1343994-1343984=10,每簇扇区数为8,说明次索引项存放在第二簇里面)从上图可以看出,其文件记录存放在第6B3500H号扇区,转换为十六进制为13675号记录,一个MFT占用2个扇区,其文件记录的开始为,从MFT第一号记录向下数27350个扇区,就其文件记录存放的位置,计算方式为:6291456 +(13675*2)=6318806,跳转到6318806扇区,如图: 图中描述的本MFT号正是我们要找的,看下面的运行31011BEB01H,转换为16进制数值为:125723,再乘以每簇扇区数8等于1005784扇区,现在跳转到1005784扇区搜索“数据恢复”这个文件夹的十六进制数值70656E6362600D59H,结果没找到,难道是此文件夹没有记录?不可能。猜想,会不会是被驻留了。存放在MFT里面,跳回6318806扇区,搜索70656E6362600D59 ,在该MFT的第二个扇区里面找到了该文件夹的记录。 跳转到文件的“数据恢复”文件MFT记录号:23A100000000H,十进制为41251号,乘以2加上6291456,等于6373958。如图: 对NTFS多少有点了解的人都会发现,这并不是MFT。为什么?看一下我的MFT的分布情况,如图: 我的MFT是分三大块来存放的,(我自己的命名)接下来计算一下: 第一块:MFT从786432簇开始,到796687结束用了10255个簇=82040扇区,每2个扇区为一个完整的MFT。 第二块:MFT从397607开始到结束397686,用了79个簇632 第三块:…… 第一块MFT只用了10255个簇来记录,(我用簇为来但来计算)而我们要找的文件“数据恢复”存放在41251号,(41251*2/8= 10312.75簇)已经超出了第一块的记录范围,超出75.75个簇,经计算,在第二块里面才是存放的“数据恢复”的MFT。第二块的开始位置为397607簇,加上75簇,等于397664簇,由于硬盘是从0开始记录数据的,所以,这个地方应该还要减去1。跳转到397663簇的四分之三(0.75)位置,也就是第6个扇区 根据运行,得知其起始LCN为A08AH(35488*8=283904),占用一个簇。跳转到283904扇区:搜索文件名“MFT”结构分析4D0046005400D37E7E00H 其文件MFT号为26A1H(41254号记录),根据前面的MFT记录块的计算,在“数据恢复”MFT记录向下数三个记录,就是“MFT结构分析”这个文件的MFT记录了。跳转到该位置 其运行为3281000F8F00H,起始LCN为0F8F00(36623*8=292984扇区),长度为8100H(129*8=1032扇区),那么结束位置为292984+1032=294016扇区 跳转到文件的开始292984 跳转到294016,选取上一个扇区的结尾 编辑-复制-植入新文件-保存文件名为“MFT结构分析.jpg”。双击,能够正常打开。 NTFS文件系统结构解析NTFS是一个比FAT复杂的多的文件系统,我们一起努力来把它完整的解读出来。 NTFS 的引导扇区也是完成引导和定义分区参数,和FAT分区不同,FAT分区的BOOT记录正常,就显示分区没有错误,即使文件不正确,而NTFS分区的 BOOT不是分区的充分条件,它要求必须MFT中的系统记录如$MFT等正常该分区才能正常访问。其BPB参数如下表所示。 字节偏移 长度 常用值 意义 0x0B 字 0x0002 每扇区字节数 0x0D 字节 0x08 每簇扇区数 0x0E 字 0x0000 保留扇区 0x10 3字节 0x000000 总为0 0x13 字 0x0000 NTFS未使用,为0 0x15 字节 0xF8 介质描述 0x16 字 0x0000 总为0 0x18 字 0x3F00 每磁盘扇区数 0x1A 字 0xFF00 磁头数 0x1C 双字 0x3F000000 隐含扇区 0x20 双字 0x00000000 NTFS未使用,为0 0x28 8字节 0x4AF57F0000000000 扇区总数 0x30 8字节 0x0400000000000000 $MFT的逻辑簇号 0x38 8字节 0x54FF070000000000 $MFTMirr的逻辑簇号 0x40 双字 0xF6000000 每MFT记录簇数 0x44 双字 0x01000000 每索引簇数 0x48 8字节 0x14A51B74C91B741C 卷标 0x50 双字 0x00000000 检验和 MFT中的文件记录大小一般是固定的,不管簇的大小是多少,均为1KB。文件记录在MFT文件记录数组中物理上是连续的,且从 0开始编号,所以,NTFS是预定义文件系统。MFT仅供系统本身组织、架构文件系统使用,这在NTFS中称为元数据(metadata,是存储在卷上支 持文件系统格式管理的数据。它不能被应用程序访问,只能为系统提供服务)。其中最基本的前16个记录是操作系统使用的非常重要的元数据文件。这些元数据文 件的名字都以“$”开始,所以是隐藏文件,在Windows 2000/XP中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出。在WINHEX中带有NFI.EXE,用此工具可以显示这些记录与文件的 对应关系,下一次再详细解释。 这些元数据文件是系统驱动程序管理卷所必需的,Windows 2000/XP给每个分区赋予一个盘符并不表示该分区包含有Windows 2000/XP可以识别的文件系统格式。如果主文件表损坏,那么该分区在Windows 2000/XP下是无法读取的。为了使该分区能够在Windows 2000/XP下能被识别,就必须首先建立Windows 2000/XP可以识别的文件系统格式即主文件表,这个过程可通过高级格式化该分区来完成。Windows以簇号来定位文件在磁盘上的存储位置,在FAT 格式的文件系统中,有关簇号的指针包含在FAT表中,在NTFS中,有关簇号的指针则包含在$MFT及$MFTMirr文件中。 NTFS使用逻辑簇号(Logical Cluster Number,LCN)和虚拟簇号(Virtual Cluster Number,VCN)来对簇进行定位。LCN是对整个卷中所有的簇从头到尾所进行的简单编号。用卷因子乘以LCN,NTFS就能够得到卷上的物理字节偏 移量,从而得到物理磁盘地址。VCN则是对属于特定文件的簇从头到尾进行编号,以便于引用文件中的数据。VCN可以映射成LCN,而不必要求在物理上连 续。 在NTFS卷上,跟随在BPB后的数据字段形成一个扩展BPB。这些字段中的数据使得 Ntldr能够在启动过程中找到主文件表MFT(Master File Tabl )。在NTFS卷上,MFT并不象在FAT 16卷和FAT 32卷上一样,被放在一个预定义的扇区中。由于这个原因,如果在MTF的正常位置中有坏扇区的话,就可以把MFT移到别的位置。但是,如果该数据被破坏, 就找不到MFT的位置,Windows 2000假设该卷没有被格式化。 因此,如果一个ntfs的卷提示未格式化,可能并未破坏MFT,依据BPB的各字段的意思是可以重建BPB的。 NTFS的缺省簇的大小 卷大小 每簇的扇区 缺省的簇大小 小于等于512MB 1 512字节 513MB~1024MB(1GB) 2 1024字节(1KB) 1025MB~2048MB(2GB) 4 2048字节(2KB) 大于等于2049MB 8 4KB 从上面可以看出,也就是说不管驱动器多大 NTFS 簇的大小不会超过 4KB NTFS文档:文档属性定义 每个文档属性都由以下部分组成: 一个由该属性的实际值组成的被称为“流”的重要的字节序列,元数据可访问该流。 文件中的每个文件属性都可能会有一个名字:在这种情况下,在命令行方式下可以通过语法“文件名:属性名”来访问该流(这也是文 件名中不能使用“:”的原因)。Windows NT® 使用以下在元数据文件$AttrDef中预定义的文件属性列表(一般会有一个未命名流,为缺省流,未命名流只能有一个,而命名流可以有多个,NTFS支持 多流文件): 10 $STANDARD_INFORMATION (标准信息) 20 $ATTRIBUTE_LIST (属性列表) 30 $FILE_NAME (文件名) 40 $VOLUME_VERSION (卷版本) 50 $SECURITY_DEscriptOR (安全描述符) 60 $VOLUME_NAME (卷名) 70 $VOLUME_INFORMATION (卷信息) 80 $DATA (数据) 90 $INDEX_ROOT (索引根) A0 $INDEX_ALLOCATION (索引分配) B0 $BITMAP (位图) C0 $SYMBOLIC_LINK(符号链接) D0 $EA_INFORMATION (?信息) E0 $EA 属性流结构 每个文件属性都分为两部分:尽管这两部分属性在文件记录的属性列表中以倒序方式进行记录,但是为了更好的理解它,让我们按下面的顺序进行介绍: 内容部分: 它的结构总是以属性名开始(N字节长),在属性名之后定义该属性是否为常驻属性。当文件属性的数据流就存储在其属性名后时,它 就是常驻属性,这样,对于那些流较小且不会增长的文件属性就可以提供更佳的访问次数。如果一个文件属性是非常驻的,那么其流就存储在一个或多个扩展或称为 运行中。运行是一个在逻辑簇号上连续的区域。为访问这些运行,NTFS紧跟在文件属性名后存储有一个称为运行列表的表。 头部: 从头部开始的偏移长度描述: 0 4 Type (类型) 4 4 Length (长度) 8 1 Non-resident flag (非常驻标志) 9 1 N=Name length (文件名长度) A 2 Offset to the content part (相对内容部分的偏移值) C 2 Compressed flag (压缩标志) E 2 Identificator (标识) 文件名长度: 00 表示文件属性没有命名。 压缩标志:在NTFS中,数据压缩是在文件属性级别上实现的,这就意味着,如果出现意外,你也不会释放出很多的数据。这样,尽管只是对文件进行压缩,但压缩文件同时就意味着其属性数据也一样被压缩。从现在开始, 其头部的安排依赖文件的常驻属性: 对一个常驻属性来说,从头部开始的偏移描述如下: 10 4 Length of the stream (流长度) 14 2 Offset to the stream (流偏移) 16 2 Indexed flag (索引标志) 索引标志: 文件属性通过一个索引入口进行索引。 对于一个非常驻的文件属性,从头部开始的偏移描述如下: 10 8 Starting VCN (起始VCN) 18 8 Last VCN (结束VCN) 20 2 Offset to the runlist (运行列表偏移) 22 2? Number of compression engine ? (压缩引擎号) 28 8 Allocated size of the stream (为流分配的单元大小) 30 8 Real size of the stream (实际的流大小) 38 8 Initialized data size of the stream (流已初始化大小) VCN :Virtual Cluster Number(虚拟簇号)的缩略词。VCN是一个与非常驻属性相关联的概念。VCN从文件属性流的第一个运行的第一个簇(VCN 0)到最后一个运行的最后一个簇进行编号。 当某个运行列表非常大,文件属性不能放在一个文件记录中时,描述文件的文件属性就会存储在几个文件记录中,运行列表也分成几个小片。起始VCN域和结束 VCN域都用于定位其文件记录指示—即运行列表—运行所指定的VCN 。 注:如果属性可以放在一个文件记录内,则结束VCN域(这种情况下没有使用)可能是“00 00 00 00 00 00 00 00”。 压缩引擎的数量: 为达到最好的压缩比率,NTFS可以根据不同类型的数据使用不同的压缩引擎。当前的压缩引擎使用值04。 为流分配的单元大小:它几倍于卷上用来存储文件属性流所描述的分配空间。 如果流没有压缩,它就是数倍于簇空间大小的实际大小,相反,则比较小。 流的实际大小:文件属性流在压缩前的大小。 流的初始化大小:这是文件属性流的压缩后的大小(总是低于分配大小)。如果此流未被压缩,就是它的实际大小 。 注意:常驻文件属性从不被压缩(也没有压缩引擎号域),因为它的流太小。 信息是足够的:名字长+内容部分的偏移值 =到流的偏移值(常驻属性)或者到运行列表的偏移值(非常驻悔改)。 NTFS文件系统结构分析在NTFS文件系统中,文件存取是按簇进行分配,一个簇必需是物理扇区的整数倍,而且总是2的整数次方。NTFS文件系统并不 去关心什么是扇区,也不会去关心扇区到底有多大(如是不是512字节),而簇大小在使用格式化程序时则会由格式化程序根据卷大小自动的进行分配。 文件通过主文件表(MFT)来确定其在磁盘上的存储位置。主文件表是一个对应的数据库,由一系列的文件记录组成--卷中每一个文件都有一个文件记录(对于大型文件还可能有多个记录与之相对应)。主文件表本身也有它自己的文件记录。 NTFS卷上的每个文件都有一个64位(bit)称为文件引用号(File Reference Number,也称文件索引号)的唯一标识。文件引用号由两部分组成:一是文件号,二是文件顺序号。文件号为48位,对应于该文件在MFT中的位置。文件 顺序号随着每次文件记录的重用而增加,这是为NTFS进行内部一致性检查而设计的。 NTFS使用逻辑簇号(Logical Cluster Number,LCN)和虚拟簇号(Virtual Cluster Number,VCN)来进行簇的定位。LCN是对整个卷中所有的簇从头到尾所进行的简单编号。卷因子乘以LCN,NTFS就能够得到卷上的物理字节偏移 量,从而得到物理磁盘地址。VCN则是对属于特定文件的簇从头到尾进行编号,以便于引用文件中的数据。VCN可以映射成LCN,而不必要求在物理上连续。 NTFS的目录只是一个简单的文件名和文件引用号的索引,如果目录的属性列表小于一个记录的长度,那么该目录的所有信息都存储在主文件表的记录中,对于大于记录的目录则使用B+树进行管理。 主文件表中的基本文件记录中有一个指针指向一个存储非常驻索引缓冲--包括该目录下所有下一级子目录和文件的外部簇,而B+树结构便于大型目录中文件和子目录的快速查找。 在NTFS中,所有存储在卷上的数据都包含在文件中,包括用来定位和获取文件的数据结构,引导程序和记录这个卷的记录(NTFS元数据)的位图,这体现了 NTFS的原则:磁盘上的任何事物都为文件。在文件中存储一切使得文件系统很容易定位和维护数据,而在NTFS中,卷中所有存放的数据均在一个叫做MFT 的文件记录数组中,称为主文件表(Master File Table),MFT是由高级格式化产生的。而MFT则由文件记录(File Record)数组构成。File Record的大小一般是固定的,不管簇的大小是多少,均为1KB,这个概念相当于Linux中的inode(i节点)。File Record在MFT文件记录数组中物理上是连续的,且从0开始编号。MFT仅供系统本身组织、架构文件系统使用,这在NTFS中称为元数据 (metadata)。其中最基本的前16个记录是操作系统使用的非常重要的元数据文件。这些NTFS主文件表的重要的元数据文件都是以$(美元符号)开 始的名字,所以是隐藏文件,在Windows 2000中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出这些元数据文件。实际上File System Driver(ntfs.sys)维护了一个系统变量NTFS Protect System Files用于隐藏这些元数据。但是微软公司也提供了一个OEM TOOL,叫做NFI.EXE,用此工具可以转储NTFS主文件表的重要的元数据文件(元数据:是存储在卷上支持文件系统格式管理的数据。它不能被应用程 序来访问,它只能为系统提供服务),使用NFI显示结果如下: C:/>nfi C: |MORE 而这些元数据文件文件是系统驱动程序装配卷所必需的,WINDOWS 2000给每个分区赋予一个盘符并不表示该分区包含有WINDOWS 2000可以识别的文件系统格式,如果一旦主文件表损坏,那么该分区在WINDOWS 2000下是无法读取的。为了使该分区能够在WINDOWS 2000下能被识别,也就是必须首先建立WINDOWS 2000可以识别的文件系统格式即主文件表,这可通过高级格式化该分区来完成。众所周知,Windows以簇号来定位文件在磁盘存储的位置,在FAT格式 的文件系统中有关簇号的指针是包含在FAT表中的,而在NTFS中有关簇号的指针是包含在$MFT及$MFTMirr文件中的。 NTFS元文件 伴随着以上这些新增功能的是更多的用于存放与功能相关的数据的元文件。最后,在下面的表中罗列出NTFS5中所有的元文件: 每个MFT记录都对应着不同的文件,如果一个文件有很多属性或是分散成很多碎片,就很可能需要多个文件记录。这时,存放其文件记录位置的第一个记录就叫做“基文件记录”(base file record)。 MFT中的第1个记录就是MFT自身。由于MFT文件本身的重要性,为了确保文件系统结构的可靠性,系统专门为它准备了一个镜像文件($MftMirr),也就是MFT中的第2个记录。 第3个记录是日志文件($LogFile)。该文件是NTFS为实现可恢复性和安全性而设计 的。当系统运行时,NTFS就会在日志文件中记录所有影响NTFS卷结构的操作,包括文件的创建和改变目录结构的命令,例如复制,从而在系统失败时能够恢 复NTFS卷。 第4个记录是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一个标明该磁盘是否损坏的标志位(NTFS系统以此决定是否需要调用Chkdsk程序来进行修复)。 第5个记录是属性定义表($AttrDef,attribute definition table),其中存放了卷所支持的所有文件属性,并指出它们是否可以被索引和恢复等。 第6个记录是根目录(/),其中保存了存放于该卷根目录下所有文件和目录的索引。在访问了一个文件后,NTFS就保留该文件的MFT引用,第二次就能够直接进行对该文件的访问。 第7个记录是位图文件($Bitmap)。NTFS卷的分配状态都存放在位图文件中,其中每 一位(bit)代表卷中的一簇,标识该簇是空闲的还是已被分配了的,由于该文件可以很容易的被扩大,所以NTFS的卷可以很方便的动态的扩大,而FAT格 式的文件系统由于涉及到FAT表的变化,所以不能随意的对分区大小进行调整。 第8个记录是引导文件($Boot),它是另一个重要的系统文件,存放着Windows 2000/XP的引导程序代码。该文件必须位于特定的磁盘位置才能够正确地引导系统。该文件是在Format程序运行时创建的,这正体现了NTFS把磁盘 上的所有事物都看成是文件的原则。这也意味着虽然该文件享受NTFS系统的各种安全保护,但还是可以通过普通的文件I/O操作来修改。 第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记录是是系统保留记录,用于将来扩展。 MFT的前16个元数据文件是如此重要,为了防止数据的丢失,NTFS系统在该卷文件存储部分的正中央对它们进行了备份,参见下图。 NTFS把磁盘分成了两大部分,其中大约12%分配给了MFT,以满足其不断增长的文件数 量。为了保持MFT元文件的连续性,MFT对这12%的空间享有独占权。余下的88%的空间被分配用来存储文件。而剩余磁盘空间则包含了所有的物理剩余空 间--MFT剩余空间也包含在里面。MFT空间的使用机制可以这样来描述:当文件耗尽了存储空间时,Windows操作系统会简单地减少MFT空间,并把 它分配给文件存储。当有剩余空间时,这些空间又会重新被划分给MFT。虽然系统尽力保持MFT空间的专用性,但是有时不得不做出牺牲。尽管MFT碎片有时 是无法忍受的,却无法阻止它的发生。 那么NTFS到底是怎么通过MFT来访问卷的呢?首先,当NTFS访问某个卷时,它必须“装 载”该卷:NTFS会查看引导文件(在图中的$Boot元数据文件定义的文件),找到MFT的物理磁盘地址。然后它就从文件记录的数据属性中获得VCN到 LCN的映射信息,并存储在内存中。这个映射信息定位了MFT的运行(run或extent)在磁盘上的位置。接着,NTFS再打开几个元数据文件的 MFT记录,并打开这些文件。如有必要NTFS开始执行它的文件系统恢复操作。在NTFS打开了剩余的元数据文件后,用户就可以开始访问该卷了。 文件和目录记录 NTFS将文件作为属性/属性值的集合来处理,这一点与其他文件系统不一样。文件数据就是未命名属性的值,其他文件属性包括文件名、文件拥有者、文件时间标记等。下图显示了一个用于小文件的MFT记录。 每个属性由单个的流(stream)组成,即简单的字符队列。严格地说,NTFS并不对文件 进行操作,而只是对属性流进行读写。NTFS提供对属性流的各种操作:创建、删除、读取(字节范围)以及写入(字节范围)。读写操作一般是针对文件的未命 名属性的,对于已命名的属性则可以通过已命名的数据流句法来进行操作。 一个文件通常占用一个文件记录。然而,当一个文件具有很多项属性值或很零碎的时候,就可能需 要占用一个以上的文件记录。这种情况下,第一个文件记录是其基本的文件记录,存储有该文件需要的其它文件记录的位置。小文件和文件夹(典型的如1500字 节或更少)将全部存储在文件的MFT记录里。 文件夹记录包括索引信息,小文件夹记录完全存储在MFT结构内,然而大的文件夹则被组织成B+树结构,用一个指针指向一个外部簇,该簇用来存储那些MFT内存储不了的文件夹的属性。 NTFS卷上文件的常用属性在下表中列出(并不是所有文件都有所有这些属性)。 常驻属性与非常驻属性 当一个文件很小时,其所有属性和属性值可存放在MFT的文件记录中。当属性值能直接存放在 MFT中时,该属性就称为常驻属性(resident attribute)。有些属性总是常驻的,这样NTFS才可以确定其他非常驻属性。例如,标准信息属性和根索引就总是常驻属性。 每个属性都是以一个标准头开始的,在头中包含该属性的信息和NTFS通常用来管理属性的信息。该头总是常驻的,并记录着属性值是否常驻、对于常驻属性,头中还包含着属性值的偏侈量和属性值的长度。 如果属性值能直接存放在MFT中,那么NTFS对它的访问时间就将大大缩短。NTFS只需访问磁盘一次,就可立即获得数据;而不必像FAT文件系统那样,先在FAT表中查找文件,再读出连续分配的单元,最后找到文件的数据。 小文件或小目录的所有属性,均可以在MFT中常驻。小文件的未命名属性可以包括所有文件数据。建立一个小文件如下图所示:
如通过NFI查看文件“新建 文本文档.txt”的文件记录号为36,显示内容如下: File 36 /新建 文本文档.txt $STANDARD_INFORMATION (resident) $FILE_NAME (resident) $FILE_NAME (resident) $DATA (resident) 从显示内容可以看出文件的全部属性都是常驻属性,包括DATA属性,没有非常驻属性,所以,用WINHEX打开MFT,查看该文件记录,有如下图的内容 小文件的文件记录 小目录的索引根属性可以包括其中所有文件和子目录的索引。参见下图 小目录的MFT记录 大文件或大目录的所有属性,就不可能都常驻在MFT中。如果一个属性(如文件数据属性)太大而不能存放在只有1KB的MFT文件记录中,那么NTFS将从 MFT之外分配区域。这些区域通常称为一个运行(run)或一个盘区(extent),它们可用来存储属性值,如文件数据。如果以后属性值又增加,那么 NTFS将会再分配一个运行,以便用来存储额外的数据。值存储在运行中而不是在MFT文件记录中的属性称为非常驻属性(nonresident attribute)。NTFS决定了一个属性是常驻还是非常驻的;而属性值的位置对访问它的进程而言是透明的。 当一个属性为非常驻时,如大文件的数据,它的头部包含了NTFS需要在磁盘上定位该属性值的有关信息。下图显示了一个存储在两个运行中的非常驻属性。 存储在两个运行中的非常驻属性 在标准属性中,只有可以增长的属性才是非常驻的。对文件来说,可增长的属性有数据、属性列表等。标准信息和文件名属性总是常驻的。 一个大目录也可能包括非常驻属性(或属性部分),参见下图。在该例中,MFT文件记录没有足够空间来存储大目录的文件索引。其中,一部分索引存放在索引根 属性中,而另一部分则存放在叫作“索引缓冲区”(index buffer)的非常驻运行中。这里,索引根、索引分配以及位图属性都是简化表示的,这些属性将在后面详细介绍。对目录而言,索引根的头及部分值应是常驻 的。 大目录的MFT记录 当一个文件(或目录)的属性不能放在一个MFT文件记录中,而需要分开分配时,NTFS通过VCN-LCN之间的映射关系来记录运行(run)或盘区情 况。LCN用来为整个卷中的簇按顺序从0到n进行编号,而VCN则用来对特定文件所用的簇按逻辑顺序从0到m进行编号。下图显示了一个非常驻数据属性的运 行所使用的VCN与LCN编号。
当该文件含有超过2个运行时,则第三个运行从VCN8开始,数据属性头部含有前两个运行VCN的映射,这便于NTFS对磁盘文件分配的查询。为了便于NTFS快速查找,具有多个运行文件的常驻数据属性头中包含了VCN-LCN的映射关系,参见下图
虽然数据属性常常因太大而存储在运行中,但是其他属性也可能因MFT文件记录没有足够空间而需要存储在运行中。另外,如果一个文件有太多的属性而不能存放 在MFT记录中,那么第二个MFT文件记录就可用来容纳这些额外的属性(或非常驻属性的头)。在这种情况下,一个叫作“属性列表”(attribute list)的属性就加进来。属性列表包括文件属性的名称和类型代码以及属性所在MFT的文件引用。属性列表通常用于太大或太零散的文件,这种文件因 VCN-LCN映射关系太大而需要多个MFT文件记录。具有超过200个运行的文件通常需要属性列表。 MFT文件记录结构分析主文件表MFT的文件记录由记录头和属性列表组成,由“FF FF FF FF”结束,一般大小为1K,或一个簇大小(这样一般就更大),记录头包括以下一些域: 偏移 长度(字节) 属性 0X00 4 标志,一定是“FILE” 0X04 2 更新序列US的偏移 0X06 2 更新序列号USN的大小与数组,包括第一个字节 0X08 8 日志文件序列号LSN 0X10 2 序列号(SN) 0X12 2 硬连接数 0X14 2 第一个属性的偏移地址 0X16 2 标志,1表示记录正在使用,2表示该记录为目录 0X18 4 记录头和属性的总长度,即文件记录的实际长度, 0X1C 4 总共分配给记录的长度 0X20 8 基本文件记录中的文件索引号 0X28 2 下一属性ID 0X2A 2 XP中使用,边界 0X2C 4 XP中使用,本文件记录号 每次记录被修改都将导致日志文件序列号$LogFile Sequence Number(LSN)发生变化。 序列号Sequence Number(SN)用于记录主文件表记录被重复使用的次数。 硬连接数Hard Link Count记录硬连接的数目,只出现在基本文件记录中。 文件记录的实际长度是文件记录在磁盘上实际占用的字节空间。 基本文件记录中的文件索引号,对于基本文件记录,其值为0,如果不为0,则是一个主文件表的文件索引号,指向所属的基本文件记录中的文件记录号,在基本文件记录中包含有扩展文件记录的信息,存储在“属性列表ATTRIBUTE_LIST”属性中。 属性列表是可变长度区,以“FF FF FF FF”结束,对于1K长度的MFT记录,属性列表的起始偏移为0x30。 索引记录结构分析 第一个索引记录都是由一个标准的索引头和一些包含索引键和索引数据的块组成的。索引记录的大小在引导记录 $Boot中定义,一般总是4KB。 标准索引头的结构如下: 偏移 大小 说明 0X00 4 总是“INDX” 0X04 2 更新序号偏移 0X06 2 更新序列号USN的大小与排列,包括第一个字节 0X08 日志文件序列号LSN 0X10 8 该索引缓冲在索引分配中的索引VCN 0X18 4 索引入口的偏移(相对于0X18) 0X1C 4 索引入口的大小(相对于0X18) 0X20& 4 索引入口的分配大小(相对于0X18) 0X24 1 非页级节点为1(有子索引) 0X25 3 总是0 0X28 2 更新序列号 0X2A 2S-2 更新序列排列 常用索引列表 名称 索引 说明 $I30 文件名 目录使用 $SDH 安全描述 $SECURE $SII 安全IDS $SECURE $O 对象IDS $OBJID $O 所有者IDS $QUOTA $Q 配额 $QUOTA $R 重解析点 $REPARSE NTFS文件系统规范基本数据类型 MFT文件记录 文件记录是$MFT文件的基本组成部分,卷中的所有文件都由至少一个文件记录来描述,对于使用多个文件记录的文件,其第一个文件记录叫基本文件记录,其余的叫做扩展文件记录。 文件记录由记录头,数个文件属性和结束标志(0xFFFFFFFF)组成。 文件记录头格式:
目录记录目录记录由标准头和存储目录键及目录数据的数据块组成,在$Boot文件中定义了目录记录的尺寸,这个值通常是4KB(到目录为止没有使用其他值)。
更新序列号 更新序列号是Microsoft公司为了确保记录数据的可靠性而在NTFS卷中提出的一项技术,在NTFS卷中,所有的记录类型数据(FR、IR)占用的空间都是按扇区尺寸(512字节)对齐。保护记录数据时,在每512字节的最末2个字节都会写入一个校验值以确保记录中的所有数据都被正确的写入磁盘中,而校验值所在位置的数据被拷贝到记录头之后被称作USA(Update Sequence Array)的数据块中,系统将记录数据从磁盘读入内存时将检查每个校验值是否与记录头的中序列号是否相同,如果相同则用USA中相应位置的数据恢复校验值位置的数据,反之则表明该记录被没有正确地修改。 在每次写记录数据时序列号都会加1,当序列号为0时则再加1。
扇区数据结构 虚拟簇号 非驻留数据中的每个簇都有一个特定的序号,这个序号就叫做虚拟簇号,虚拟簇号0指向数据流的第一个簇。 逻辑簇号 卷中的每一个簇都有一个特定的序号,这个序号就叫做逻辑簇号,逻辑簇号0指向卷中的第一个簇(引导扇区)。 数据流描述 存放在间隔的簇中的属性数据称为流。每一个流都由起始簇号和尺寸来描述。流的起始簇号是相对于前一个流的偏移,该值是一个有符号数。流描述的格式如下:
一个流描述之后紧随着下一个流描述,如果下一个描述的SD_Desc为0则表示当前描述是最后一个。 一般情况下压缩文件和稀疏文件数据都以流的形式描述。 例1:通常情况 流描述:21 20 ED 5 22 48 7 48 22 21 28 C8 DB 0 流1:SD_Desc = 21 –偏移占2个字节,尺寸占1个字节。 SD_Size = 20 (1字节) SD_Off = 5ED (2字节) Offset = 5ED Length= 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:压缩流 流描述:11 08 40 01 08 11 10 08 11 0C 10 01 04 00 流1: SD_Desc = 11 –偏移占1个字节,尺寸占1个字节。 SD_Size = 8 (1字节) SD_Off = 40 (1字节) Offset = 40 Length= 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字节) Offset = 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 = 4 SD_Off = - Offset = - Length= 4 流6: SD_Desc = 0。流描述结束标志。 小计: 0x08 个簇存放在簇号0x40 开始处 0x08 个稀疏簇(未分配空间) 0x10 个簇存放在簇号0x48 开始处 0x0C 个簇存放在簇号0x58开始处 0x04 个稀疏簇(未分配空间) 引导扇区与BPB NTFS卷的第一个重要的数据区是BPB(BIOS Parameter Block),数据区位于卷中第一个个区域:$Boot文件的第一个扇区中。该扇区也叫做引导扇区。 引导扇区与BPB结构
注1:每个记录占用的簇数如果为正值则表示该记录占用的簇数;如果为负值则表明记录尺寸小于簇尺寸,此时计算记录尺寸的方法应该是:记录的尺寸=2^(~每文件记录占用簇数)。 比如:BS_ClusPerFR=0xF6(-10),此时记录的尺寸是 BytsPerRecord=2^(~0xf6) =2^10 =1024 系统文件 不同于FAT/FAT32分区固定的数据块布局,NTFS卷中所有的数据都以文件的方式保存,包括引导记录与目录等卷重要数据(在NTFS卷中重要数据块被称为系统文件),这样就允许将卷重要数据存放到卷中的任何地方(除了引导记录),并且对于所有重要数据都有一个标准的方法对其进行操作。这个特性使得任意改变卷尺寸十分方便(在卷位图文件后加上或减去增减的扇区信息就行了),而且也可以很容易地避免了FAT/FAT32卷中FAT表部分有物理损坏则卷中就会有很大部分空间使用的问题。 对应于重要数据的种类,NTFS分区共有12个系统文件,他们分别是:
文件属性记录 文件中的每个记录都是由属性组成。每个属性由相同的格式构成,首先是一个标准属性记录头,然后存放属性的专用数据。下面列出$AttrDef中定义的可用到的属性。
属性记录头 每个MFT属性记录都有一个属性记录头,这个头记录了属性的类型、名字(可选)、有两种格式: 1.驻留属性
>=24 bytes 2.非驻留属性
>=64 bytes 注意 1.只有非驻留的数据(Data)属性才可以被压缩或是稀疏类型。 2.只有驻留属性才有索引标志,是否表示只有驻留属性才能被索引? STANDARD_INFORMATION(0x10 常驻属性 len=0x30,0x48) 在老的NTFS版本中,STARDAND_INFORMATION属性只用于存放文件的时间和DOS文件属性信息。在Windows 2000中新引进了4个域来描述配额、安全、文件尺寸和日志信息。 属性描述如下表:
ATTRIBUTE_LIST(0x20 len > 26) 当MFT记录中的属性太多太长时,MFT记录就容纳不下这么多属性记录了,这时就只能将属性的数据以非驻留数据的形式存放到卷中的其他位置,如果这样还是存放不下,就必须用到属性表属性了。存放不下的属性会被转移到一个新分配的MFT记录中,然后在原MFT中加入一个属性表属性以描述如何搜索到当前文件的所有属性。 紧随标准属性头之后存放各属性的描述记录,记录了属性的位置和所在MFT记录,每个属性描述按4字对齐,记录了属性的类型、名字(有名属性)、序号。 属性表属性中不包括对自身的描述。
注:使用属性表属性通常因为以下情况: 1.文件有太多的别名。 2.碎片太多以至于数据流描述填满了MFT记录。 3.有太复杂的安全描述(在NTFS 3.0以后的版本中不会再出现这种情况)。 4.有太多的命令流,比如数据流。 FILE_NAME (0x30 常驻属性 len = 68~578)) 本属性用于描述文件的名字,本属性总是驻留在MFT记录中。 在$AttrDef的定义中,本属性的最小尺寸是68字节,最大是578字节,因此最大文件名长度是255个字节。
将POSIX或Win32文件名转换成DOS文件名要遵循以下步骤: 1.去掉所有的UNICODE字符。 2.去掉除最后一个以外的所有“.”,除非该符号在文件名的最前面。 3.所有字符转换成大写。 4.去掉所有禁止的字符。 5.把“.”号前面的字符减少到6个,然后在后面加上“~1”。 6.把“.”号后面的字符缩减为3个。 7.如果文件名已经存在,则增加字符串“~1”的值。 VOLUME_VERSION(0x40 NT) 本属性只用于Microsoft Windows NT。 OBJECT_ID (0x40 2K) 对象ID属性是从Microsoft Windows 2000开始引入的新属性。每个MFT记录都有一个唯一的GUID。同样地,一个记录也包含了出生卷ID,原始对象ID和域ID,它们都拥有GUID。 该属性没有最小尺寸限制,但最大尺寸不得超过256个字节。
SECRUITY_DESCRIPTOR(0x50)
VOLUME_NAME(0x60) 该属性记录卷的名字。该属性最小2个字节,最大256个字节,因此卷标最大允许有127个字符。卷名的UNICODE字符串紧随属性头存放,卷名的长度由记录头中的ATTR_DatSz来指定。 卷序列号存放在$Boot文件中。
VOLUME_INFORMATION (0x70 len = 0x0c ) 该属性记录卷的基本信息,如版本号。
操作系统格式化的卷对应的NTFS卷版本
DATA (0x80) 该属性包含文件的数据,文件的尺寸就是记录中无名数据流的尺寸。该属性没有最大最小值限制。
对于驻留数据,数据紧接着记录头存放;对于非驻留数据,记录头后存放的是数据流的描述。 通常目录文件没有数据属性,文件的数据属性是没有名字的。文件必须有一个无名的数据属性。 注:NTFS有一个特性:允许在一个文件存放多个数据属性,这就使得用户可以轻松的实现HFS提供的那种将文件分为两部分(在HFS术语中被称为叉):一个资源块一个数据块。对于数据块可以使用缺省的无名数据属性,对于资源块可以使用一个命名数据属性,如:“resource” INDEX_ROOT (0x90) 该属性作为B+树的根节点以实现目录功能(比如目录文件)。该属性总是驻留。
Standard Attribute Header · Index Root · Index Header · Index Entry · Index Entry
索引块头(16 bytes)
索引项(目录项)
IE_SubNodeFR 对簇尺寸!=4k的有用 INDEX_ALLOCATION (0xA0大目录使用) 该属性是索引数据(比如磁盘目录)的基本组成部分,用于存放B+树的子节点和实现索引数据。属性非驻留,则属性的数据流描述指向一个外部索引(索引项(目录项))区。
IA索引块(INDEX_ALLOCATION指向的外部索引区) 索引项(目录项)记录由标准头和存储目录键及目录数据的数据块组成,在$Boot文件中定义了目录记录的尺寸,这个值通常是4KB(到目录为止没有使用其他值)。
BITMAP(0xB0 MFT文件或外部索引块使用) 该属性记录了一组BIT序列,每个位描述一个单元的使用情况。 该属性主要用于两种情况:索引(比如目录)和$MFT文件中。 在用于索引时,每个位表示一个索引项是否被使用。每个位描述一个虚拟簇号(VCN)。 在用于$MFT文件时,每个位记录一个文件记录是否使用。 位序列表紧随属性头存放。同DATA(0x80)
SYMBOL_LINK (0xC0 NT) 本属性只用于Microsoft Windows NT。 REPARSE_POINT (0xC0 2K) 该属性描述对象的解析信息,该属性最大尺寸是16384字节。
EA_INFORMATION (0xD0 ) 该属性用于实现为OS/2子系统或Windows NT服务器的OS/2客户提供基于NTFS的HPFS扩展属性。因为数据流可能会增大,所以该属性可以是非驻留的。
EA(0xE0) 该属性用于在NTFS卷上实现HPFS的扩展属性。因为数据流可能会增大,所以该属性可以是非驻留的。该属性的最大尺寸是65536字节。 该属性保存HPFS卷所需的名字-参数对。
EA名字不使用UNICODE字符。关于该属性的特性,参考一下HPFS的规范会很有帮助。 PROPERTY_SET(0xF0 NT) 本属性只用于Microsoft Windows NT。 LOGGED_UNTILITY_STREAM(0x100 2K) 该属性记录日志操作的元数据。
系统文件 不同于FAT/FAT32分区固定的数据块布局,NTFS卷中所有的数据都以文件的方式保存,包括引导记录与目录等卷重要数据(在NTFS卷中重要数据块被称为系统文件),这样就允许将卷重要数据存放到卷中的任何地方(除了引导记录),并且对于所有重要数据都有一个标准的方法对其进行操作。这个特性使得任意改变卷尺寸十分方便(在卷位图文件后加上或减去增减的扇区信息就行了),而且也可以很容易地避免了FAT/FAT32卷中FAT表部分有物理损坏则卷中就会有很大部分空间使用的问题。 对应于重要数据的种类,NTFS分区共有16个系统文件,他们分别是:
文件至少含有$STANDARD_INFORMATION , $FILE_NAME属性 $MFT 在MFT 文件的属性记录集
未命名数据流格式
$MFTMirr 该文件是$MFT文件的备份,存放了$MFT中前4个文件的文件记录。该文件的作用就是当$MFT文件被损坏时恢复卷中的数据。 在MFT=文件的属性记录集
未命名数据流格式
$LogFile 在MFT 文件的属性记录集
$Volume 在MFT 文件的属性记录集
未命名数据流格式 0字节长 $AttrDef 在MFT文件的属性记录集
未命名数据流格式
整理规则
$AttrDef Flags
. (Root Directory) 在MFT文件的属性记录集
MountMgrDatabase 数据流 仅当Reparse Points on the Volume.
$Bitmap 该文件记录了卷中所有逻辑簇的使用情况。文件中每个BIT表示一个逻辑簇。在每个字节中,逻辑簇号按从小到大的顺序排列,如:BIT0对应逻辑簇号A,则BIT1对应逻辑簇号A+1。 在MFT 文件的属性记录集
$Boot 在MFT 文件的属性记录集
未命名数据流格式 引导扇区与BPB NTFS卷的第一个重要的数据区是BPB(BIOS Parameter Block),数据区位于卷中第一个个区域:$Boot文件的第一个扇区中。该扇区也叫做引导扇区。 引导扇区与BPB结构
注1:每个记录占用的簇数如果为正值则表示该记录占用的簇数;如果为负值则表明记录尺寸小于簇尺寸,此时计算记录尺寸的方法应该是:记录的尺寸=2^(~每文件记录占用簇数)。 比如:BS_ClusPerFR=0xF6(-10),此时记录的尺寸是 BytsPerRecord=2^(~0xf6)=2^10=1024 $BadClus 该文件记录了卷中的坏簇的信息。该文件是一个稀疏文件,只记录有坏簇的描述。该文件拥有两个数据属性,第一个数据属性无名且是空属性,第二个数据属性名为:“$Bad”,该属性记录了卷中的坏簇的VCN,该属性中的数据分配的空间是整个卷的尺寸,数据占用的实际空间也是卷的尺寸,已初始化数据尺寸为0。在属性的数据流描述中非稀疏的描述就是坏簇的VCN。 坏簇在$Bitmap文件中相应的位总是被标记为已使用。 在MFT 文件的属性记录集
$Secure
$SDS 数据流
$SDH Index
$SII Index
$UpCase 在MFT 文件的属性记录集
未命名数据流格式 $Extend This is a directory containing the Metadata files: $ObjId, $Quota, $Reparse and $UsnJrnl.
$ObjId This system file is an index of all the $OBJECT_ID Attributes in use on the volume.
$ObjId:$O
Flags
$Quota
$Quota:$O
$Quota:$Q
$Quota flags
$Reparse
$Reparse:$R
$UsnJrnl 在MFT 文件的属性记录集
$UsnJrnl:$J
$UsnJrnl reason flags
$UsnJrnl source info flags
$UsnJrnl:$Max
NTFS卷初始化 NTFS卷初始化时系统首先检查引导扇区中的卷类型签名,如果签名不是“NTFS”则认为该卷不是NTFS卷。然后读取引导扇区中的卷BPB数据确定卷布局,然后读取$MFT文件自己的文件记录,按记录中描述读取$Bitmap、$Root文件用于分配/释放簇及目录树访问。 分区结尾与备份主引导扇区 在NTFS卷,$Boot文件中的卷尺寸(BS_TotSec64)的值至少比分区表中的分区尺寸少一个扇区。这个扇区用来存放$Boot文件第一个扇区的副本,这个扇区一定位于NTFS卷的最后一个扇区的下一个扇区的位置。如果NTFS卷的头部数据被破坏可以通过这个扇区来恢复。 目录结构 在NTFS卷中,文件在目录中以B+树的形式排列,在目录中查找文件时按B+树的搜索方法先搜索根节点(从根目录开始),然后按要找的文件名与根节点中的子节点对应的文件名相比较以确定在哪个子节点对应的存储区中搜索,然后以子节点为当前的根节点再搜索,直到找到文件为止。 |
|