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中定义,⼀般总是cvr
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提供了分区格式转换⼯具“”。是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”添加设置。此后系统会重新引导启动,并完成分区格式的转换操作。

本文发布于:2024-09-22 00:57:16,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/285068.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:属性   记录   系统   数据   常驻   磁盘   分区   需要
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议