NTFS文件系统详细分析
NTFS文件系统详细分析
第一部分 什么是NTFS文件系统
想要了解NTFS,我们首先应该认识一下FAT。FAT(File Allocation Table)是“文件分配表”的意思。对我们来说,它的意义在于对硬盘分区的管理。FAT16、FAT32、NTFS是目前最常见的三种文件系统。
FAT16:我们以前用的DOS、Windows 95都使用FAT16文件系统,现在常用的Windows 98/2000/XP等系统均支持FAT16文件系统。它最大可以管理大到2GB的分区,但每个分区最多只能有65525个簇(簇是磁盘空间的配置单位)。随着硬盘或分区容量的增大,每个簇所占的空间将越来越大,从而导致硬盘空间的浪费。
FAT32:随着大容量硬盘的出现,从Windows 98开始,FAT32开始流行。它是FAT16的增强版本,可以支持大到2TB(2048GB)的分区。FAT32使用的簇比FAT16小,从而有效地节约了硬盘空间。
NTFS:微软Windows NT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式。随着以NT为内核的Windows 2000/XP的普及,很多个人用户开始用到了NTFS。NTFS也是以簇为单位来存储数据文件,但NTFS中簇的大小并不依赖于磁盘或分区的大小。簇尺寸的缩小不但降低了磁盘空间的浪费,还减少了产生磁盘碎片的可能。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+树结构便于大型目录中文件和子目录的快速查找。
主文件表中的基本文件记录中有一个指针指向一个存储非常驻索引缓冲--包括该目录下所有下一级子目录和文件的外部簇,而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编号。
非常驻数据属性的VCN
当该文件含有超过2个运行时,则第三个运行从VCN8开始,数据属性头部含有前两个运行VCN的映射,这便于NTFS对磁盘文件分配的查询。为了便于NTFS快速查找,具有多个运行文件的常驻数据属性头中包含了VCN-LCN的映射关系,参见下图
非常驻数据属性的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 8 日志文件序列号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
第四部分 FAT32怎样转换成NTFS
Windows 2000/XP提供了分区格式转换工具“Convert.exe”。Convert.exe是Windows 2000附带的一个DOS命令行程序,通过这个工具可以直接在不破坏FAT文件系统的前提下,将FAT转换为NTFS。它的用法很简单,先在Windows 2000环境下切换到DOS命令行窗口,在提示符下键入:
D:>convert 需要转换的盘符 /FS:NTFS
如系统E盘原来为FAT16/32,现在需要转换为NTFS,可使用如下格式:
D:>convert e: /FS:NTFS
所有的转换将在系统重新启动后完成。
此外,你还可以使用专门的转换工具,如著名的硬盘无损分区工具Partition Magic,使用它完成磁盘文件格式的转换也是非常容易的。首先在界面中的磁盘分区列表中选择需要转换的分区。从界面按钮条中选择“Convert Partition”按钮,或者是从界面菜单条“Operations”项下拉菜单中选择“Convert”命令。激活该项功能界面。在界面中选择转换输出为“NTFS”,之后单击“OK”按钮返回程序主界面。单击界面右下角的“Apply”添加设置。此后系统会重新引导启动,并完成分区格式的转换操作。
NTFS文件系统详细分析
第一部分 什么是NTFS文件系统
想要了解NTFS,我们首先应该认识一下FAT。FAT(File Allocation Table)是“文件分配表”的意思。对我们来说,它的意义在于对硬盘分区的管理。FAT16、FAT32、NTFS是目前最常见的三种文件系统。
FAT16:我们以前用的DOS、Windows 95都使用FAT16文件系统,现在常用的Windows 98/2000/XP等系统均支持FAT16文件系统。它最大可以管理大到2GB的分区,但每个分区最多只能有65525个簇(簇是磁盘空间的配置单位)。随着硬盘或分区容量的增大,每个簇所占的空间将越来越大,从而导致硬盘空间的浪费。
FAT32:随着大容量硬盘的出现,从Windows 98开始,FAT32开始流行。它是FAT16的增强版本,可以支持大到2TB(2048GB)的分区。FAT32使用的簇比FAT16小,从而有效地节约了硬盘空间。
NTFS:微软Windows NT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式。随着以NT为内核的Windows 2000/XP的普及,很多个人用户开始用到了NTFS。NTFS也是以簇为单位来存储数据文件,但NTFS中簇的大小并不依赖于磁盘或分区的大小。簇尺寸的缩小不但降低了磁盘空间的浪费,还减少了产生磁盘碎片的可能。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+树结构便于大型目录中文件和子目录的快速查找。
主文件表中的基本文件记录中有一个指针指向一个存储非常驻索引缓冲--包括该目录下所有下一级子目录和文件的外部簇,而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编号。
非常驻数据属性的VCN
当该文件含有超过2个运行时,则第三个运行从VCN8开始,数据属性头部含有前两个运行VCN的映射,这便于NTFS对磁盘文件分配的查询。为了便于NTFS快速查找,具有多个运行文件的常驻数据属性头中包含了VCN-LCN的映射关系,参见下图
非常驻数据属性的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 8 日志文件序列号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
第四部分 FAT32怎样转换成NTFS
Windows 2000/XP提供了分区格式转换工具“Convert.exe”。Convert.exe是Windows 2000附带的一个DOS命令行程序,通过这个工具可以直接在不破坏FAT文件系统的前提下,将FAT转换为NTFS。它的用法很简单,先在Windows 2000环境下切换到DOS命令行窗口,在提示符下键入:
D:>convert 需要转换的盘符 /FS:NTFS
如系统E盘原来为FAT16/32,现在需要转换为NTFS,可使用如下格式:
D:>convert e: /FS:NTFS
所有的转换将在系统重新启动后完成。
此外,你还可以使用专门的转换工具,如著名的硬盘无损分区工具Partition Magic,使用它完成磁盘文件格式的转换也是非常容易的。首先在界面中的磁盘分区列表中选择需要转换的分区。从界面按钮条中选择“Convert Partition”按钮,或者是从界面菜单条“Operations”项下拉菜单中选择“Convert”命令。激活该项功能界面。在界面中选择转换输出为“NTFS”,之后单击“OK”按钮返回程序主界面。单击界面右下角的“Apply”添加设置。此后系统会重新引导启动,并完成分区格式的转换操作。
NTFS文件系统详细分析的更多相关文章
- 文件系统取证分析(第11章:NTFS概念)
/* Skogkatt 开始翻译于2015-01-24,仅作为学习研究之用,谢绝转载. 2015-01-31更新MFT entry 属性概念. 2015-02-01翻译完成. 译注:我翻译这本书的这三 ...
- NTFS 文件系统解析
1. windows 下磁盘文件读写 下面是读取D:\磁盘上的第0扇区 512 Bytes CreateFile()打开磁盘,获取文件句柄: SetFilePointer()设置读写的位置: Read ...
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- linux如何编译安装新内核支持NTFS文件系统?(以redhat7.2x64为例)
内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修订了旧内核 ...
- 详解NTFS文件系统
一.分析NTFS文件系统的结构 当用户将硬盘的一个分区格式化为NTFS分区时,就建立了一个NTFS文件系统.NTFS文件系统同FAT32文件系统一样,也是用“簇”为存储单位,一个文件总是占用一个或多个 ...
- Linux系统挂载NTFS文件系统
今天尝试并成功的将一块500G的移动硬盘挂载到了RHEL5的系统上,甚感欣慰.想到也许以后自己或其他同学们会有类似经历,于是尽量细致的记录于此. 无论是一块安装了Windows/Linu ...
- 1-18 编译安装内核支持ntfs文件系统
大纲: 源码编译Linux内核 使用Linux内核模块 实战:编译一个NTFS内核模块,实现Linux挂载NTFS文件系统并实现读写功能 =============================== ...
- Linux系统挂载NTFS文件系统(转载)
转自:http://hermesbox.blogbus.com/logs/47386987.html 今天尝试并成功的将一块500G的移动硬盘挂载到了RHEL5的系统上,甚感欣慰.想到也许以后自己或其 ...
- Linux操作系统内核编译之NTFS文件系统模块支持案例
Linux操作系统内核编译之NTFS文件系统模块支持案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内核编译概述 单内核体系设计.但充分借鉴了微内核设计体系的优点,为内核引 ...
随机推荐
- How to avoid the 0-byte file on Webclient download error
_client.DownloadDataAsync(new Uri(url)); _client.DownloadDataCompleted += (sender, e) => { try { ...
- L1-Day1
L1-Day11.我是一个网虫.(描述关系)[我的翻译]I am a net worm.[标准答案]I am a webaholic.[对比分析]我的worm是实实在在的虫子,本句话想表达的意思是对网 ...
- Problem B: Battle Royale(简单几何)
题目链接: B - Battle Royale Gym - 102021B 题目大意:给你两个坐标,表示起点和终点,然后给你两个圆,第一个圆包含两个圆,然后问你起点到终点的最短距离(不经过第二个圆 ...
- matplotlib中的plt.ion()和plt.ioff()函数
转自https://blog.csdn.net/yzy__zju/article/details/85008603 Matplotlib的显示模式默认为阻塞(block)模式,因此若想动态显示图像,则 ...
- 论http弥补技术ajax、comet、SPADY、websocket
为什么要弥补http?http有什么缺陷? 查询资料中
- verilog 仿真时读取txt文件
:]data; initial begin # clk =; clk = ~clk; end initial begin # rst=; # rst=; end :]data_sin[:]; //// ...
- django第三天
从后台传入一层的字典数据 后台代码 前台代码一 浏览器结果 前台代码二 前台代码三 前台代码四 注意 默认遍历为KEY .values .keys .items 都不加括号
- 分享腾讯云的Linux服务器连接速度很慢的解决心得(原创)
最近发觉连接服务器非常慢,之前没有出现过这种情况. 我在这个腾讯云的服务器上弄了很多虚拟服务器,估计是数据量太大 造成了冗余数据较多的原因,咨询了下腾讯云的小哥, 给我了个明确的回复: 您反馈Xshe ...
- Codeforces 522D Closest Equals
题解: 傻逼题 直接从左向右扫描每个点作为右端点 然后单点修改区间查询就行了 另外一种更直观的做法就是$(i,j)$之间产生了$(j-i)$ 于是变成矩形查最大值,kd-tree维护 代码: #inc ...
- .net core 2.x - 缓存的四种方式
其实这些微软docs都有现成的,但是现在的人想对浮躁些,去看的不会太多,所以这里就再记录下 ,大家一起懒一起浮躁,呵呵. 0.基础知识 通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性 ...