NTFS文件系统简介
原文地址:http://www.cnblogs.com/watertao/archive/2011/11/28/2266595.html
1、简介
NTFS(New Technology File System)是Windows NT以及之后的Windows 2000、Windows XP、Windows Server 2003、Windows Server 2008、Windows Vista和Windows 7的标准文件系统.
NTFS取代了文件分配表(FAT)文件系统,为Microsoft的Windows系列操作系统提供文件系统。NTFS对FAT和HPFS(高性能文件系统)作了若干改进,例如,支持元数据,并且使用了高级数据结构,以便于改善性能、可靠性和磁盘空间利用率,并提供了若干附加扩展功能,如访问控制列表(ACL)和文件系统日志。该文件系统的详细定义属于商业秘密,Microsoft已经将其注册为知识产权产品。
2、版本
NTFS 有五个正式发布的版本:
1) v1.0,随 NT 3.1 一起发布[来源请求],发布于 1993 年中旬
2) v1.1,随 NT 3.5 一起发布[来源请求],发布于 1994 年秋季
3) v1.2,由 NT 3.51(1995 年中旬)和 NT 4(1996 年中旬)提供(有时候也被称为“NTFS 4.0”,因为操作系统版本是 4.0)
4) v3.0 来自 Windows 2000(有时称作“NTFS 5.0”)
5)v3.1 来自 Windows XP(2001 年秋季,有时称作“NTFS 5.1”),Windows Server 2003(2003 年春季,有时称作“NTFS 5.2”),Windows Vista(2005 年中旬,有时称作“NTFS 6.0”),Windows Server 2008(2008 年初),Windows Server 2008 R2(有时称作“NTFS 6.1”)以及 Windows 7
V1.0 和 V1.1 以及所有以后版本不兼容,也就是说,使用 NT 3.5x 写入的卷无法被 NT 3.1 读取,除非使用 NT 3.5x 光盘更新 NT 3.1,并添加对 FAT 系统的长文件名支持。V1.2 支持压缩文件、命名流、基于 ACL(访问控制列表)的安全性等功能。
V3.0 支持磁盘限额、加密、稀疏文件、重解析点,更新串行数(USN)日志、$Extend 文件夹以及其中的文件,并改进了安全描述符,以便于使用相同安全设置的多个文件共享一个安全描述符。
V3.1 使用冗余 MFT 记录数(用于恢复受损的 MFT 文件)扩展了主文件表(MFT)项Windows Vista 提供了事务 NTFS、NTFS 符号链接、收缩卷以及自我恢复功能,但这些附加功能由操作系统提供,而非文件系统自身的功能。
请不要将 NTFS.sys 文件版本(如 Windows 2000 中引入的 NTFS v5.0)和 NTFS 磁盘格式版本(如 Windows XP 开始的 v3.1)相混淆。NTFS v3.1 磁盘格式自从 Windows XP 开始就保持不变,也被随后用于 Windows Server 2003、Windows Server 2008、Windows Vista 以及 Windows 7。造成这种混乱的原因是 NTFS.sys 驱动程序的新功能是由 Windows 操作系统提供的,而非 NTFS 磁盘格式提供的。
3、功能简介
3.1 NTFS 日志
NTFS 是一个日志文件系统,使用 NTFS 日志($Logfile)记录卷更改元数据。
这是 NTFS 一个非常关键的功能(FAT/FAT32 不提供此项功能),用于确保其内部的复杂数据结构(比较重要的如卷分配图、磁盘碎片整理 API 进行的数据转移操作、MFT(主文件表)记录的更改情况(如移动 MFT 记录中存储的变长属性和属性表))和索引(用于目录和安全描述符)即使在系统发生崩溃后仍然能保持一致,并且在卷被重新加载后能够方便地对这些关键数据结构的失败提交进行回滚。
3.2 USN 日志
USN 日志(更新串行数日志)是一项系统管理功能,用于记录卷中所有文件、数据流、目录的内容、各项属性以及安全设置的更改情况。应用程序可以利用日志追踪卷的更改。对于非系统卷,可以选择打开或关闭日志,当添加一个新卷后,默认情况下日志功能处于打开状态。
3.3 硬链接和短文件名
硬链接原本用于支持 Windows NT 的 POSIX 子系统,该功能类似于目录链接,不过作用目标是文件而非目录。硬链接只能作用到同一个卷的文件中,因为它需要在文件的 MTF 记录中增加一个额外的文件名记录。短(8.3)文件名也同样使用额外文件名实现,以便于实现同步更新。当更改文件的尺寸或属性时,不会立即更新对应的目录或者链接,直到打开它们的时候才能体现相对应的变化。
3.4 可选数据流(ADS)
可选数据流使得一个文件可以同时和多个数据流相关联,数据流的表述方式为“文件名:流名”,例如“text.txt:extrastream”。可选流不会显示在 Windows 资源管理器中,查看文件大小时它们的大小也不包含在内。如果将文件复制到 FAT 格式的磁盘、附加到电子邮件、上传到网站,或者移动到任何其它不支持可选流的位置上时,只有主数据流会被保留下来,其它可选流将被全部丢弃。因此,使用可选流来保存重要数据很可能发生意外。NTFS 流从 Windows NT 3.1 开始被引入,起初设计目的是为了 Services for Macintosh(SFM)能够正确存储 Macintosh的资源分岔。尽管现在 Windows 服务器已经不再包含 SFM 功能,很多第三方的Apple 归档服务(AFP)产品(例如 Group Logic 的 ExtremeZ-IP)仍然使用文件系统的这项功能。
有些恶意软件会使用可选数据流来隐藏程序代码。一些恶意软件扫描程序和其它特殊工具现在已经可以检查可选流中的内容。 Microsoft 提供了一个叫作 Streams 的工具,使得用户可以查看卷中的可选流。
Internet Explorer 和其它一些浏览器会在从网络上下载的文件中添加一个非常小的可选数据流,用于指示他们是从外来网站获得的,运行的时候可能不安全,因此在打开它们之前系统将会显示一个提示确认信息。当用户表示不希望再次看到这个确认对话框的时候,这个可选流将会从下载的文件中被直接删除。
有些媒体播放器也尝试使用可选数据流记录多媒体文件的自定义元数据以便于用户管理媒体文件,而这种方式无需修改媒体文件自身的内容(例如 MPEG、OGG 等格式提供的嵌入在文件内的标签信息)。Windows 资源管理器可能会作为额外的信息栏显示这些元数据。使用注册的 Windows 外壳扩展程序可以有效地解析这些数据,但是大部分媒体播放器还是使用自己的独立数据库而非可选数据流来保存这些信息。可选数据流的一个问题是受影响的文件上的信息对于所有用户都是可见的并且是共享的,因此无法有效地根据每个用户的安全设置和个人偏好而进行分别进行管理、设定和保护。
3.5 限额
磁盘限额是 NTFS v3 提出的功能。该功能允许计算机管理员在支持该功能的 Windows 版本上为用户允许占用的磁盘空间设置阈值,同时也允许管理员跟踪察看每个用户使用的磁盘空间量。管理员可以为用户设置需要收到警告的磁盘空间使用级别,并当他们超过使用上限时拒绝对磁盘的访问。当 NTFS 的文件压缩启用时,磁盘限额不会影响该功能。当应用程序查询用户可用的剩余磁盘空间时,如果设置了磁盘限额,也会收到限额的数值。
磁盘限额功能在 Basic、Home 和 MediaCenter 版本的 Windows 上不受支持,必须安装 Professional、Ultimate 或者服务器版本的 Windows,或者上使用 Windows 域中的企业部署工具来使用这项功能。
3.6 稀疏文件
稀疏文件是包含稀疏数据集的文件,这些文件将储存文件在不同位置的多个片段的内容,而片段之间的内容将不会储存,特别适合大部分内容为空、只有少量实际数据的文件。当读取文件的时候,文件系统驱动程序将会对任何不存在的位置上的信息返回 0,因此文件内容看起来几乎全是零。很多数据库和科学程序有时会用到稀疏文件。因此,Microsoft 实现了对稀疏文件的高效存储支持,允许应用程序指定文件的空(零)数据区域。读取稀疏文件的应用程序可以使用常规方法读取数据,操作系统将根据当前位置的偏移量决定需要返回什么数据。和压缩文件相同,文件的实际大小不会影响对磁盘限额的判断。
3.7 重解析点
该功能在 NTFS v3 中可用。该功能将在用户空间中为文件或目录添加一个关联的重解析标记属性。当对象管理器(请参见Windows NT 线执行)解析文件系统名称并遇到重解析点属性时,它将“重解析”名称,将用户控制的重解析数据传递给所有 Windows 系统加载的文件过滤驱动程序。每个过滤驱动程序都将检查重解析数据,判断是否和该重解析点相关联。如果过滤驱动程序判定匹配,则将拦截文件系统调用,并执行自己的特定功能。重解析点用于实现卷加载点、目录连接、分层存储管理、本机结构存储,以及单实例存储。
3.8 目录连接
类似于卷加载点,但 目录连接将对象连接到文件系统中的其他目录而非卷。例如,目录 C:\exampledir 带有一个目录连接属性,链接到 D:\linkeddir,则当用户级别的应用程序访问时,将自动引用到目录 D:\linkeddir。该功能在概念上类似于 Unix 的目录符号链接,只是在 NTFS 中目标必须是另一个目录(典型的 Unix 文件系统允许将符号链接连接到任何其它类型的文件),而语义上等效于硬链接。
目录连接(可以在控制台中通过命令 MKLINK /J 连接名 目标目录 创建,使用 RMDIR 连接名junctionName 删除)是永久性的,在服务端进行解析时,使用和所属的卷相同的本地系统或域的安全领域,并且访问它和它的内容时,使用和目标目录以及其内容使用同样的安全设置。但连接本身可能拥有独立的安全设置,并且删除一个目录连接不会同时删除目标目录。
有些目录连接时 Windows Vista 系统创建的,用于保持和早期版本的 Windows 的兼容性,例如系统驱动器中的 Documents and Settings 文件夹会被连接到同一个卷中的 Users 物理目录上。但这些目录默认情况下是隐藏的,并且进行了相关的安全设置,因此 Windows 资源管理器将拒绝外壳或者大部分应用程序直接打开它们,除非使用本机内置的 SYSTEM 账户或者本机的 Administrators 用户组成员访问(这些账户是系统软件安装程序所使用的)。这些附加的安全限制可能是为了防止用户发现两个看上去相同的文件夹,然后错误地删除它们。
目录连接属于软链接(即使目标目录已经被删除,他们也仍然存在),使用一种类似于有限制的符号链接的形式工作(对于目标位置有额外的限制),但它们是经过特殊处理优化的,可以加快重解析点的处理速度,相对于更新的 NTFS 符号连接而言开销更小,并且可以在服务器端解析,因此可以在远程共享目录中访问它们。
3.9 符号链接
符号链接(或称软链接)从 Windows Vista 开始被引入。符号链接在客户端解析,因此如果共享一个符号链接,则目标将服从客户端的访问限制,而非服务端的限制。
符号链接可以链接到文件(使用 MKLINK 符号链接 目标文件名 创建),也可以链接到目录(使用 MKLINK /D 符号链接 目标目录 创建),不过和 Unix 符号链接不同,必须在创建链接的时候设定链接语义。但创建符号链接的时候目标并不需要存在或者可以访问,只有当访问符号链接的时候才会检查目标的可访问性。NTFS 也会同时检查符号链接的类型(文件或目录)是否正确,如果目标存在但是类型不正确,则系统会返回一个找不到目标的错误。
符号链接也可以引用远程主机上的共享文件夹,或者其中的文件或者子文件夹。但目标并不会被立即加载,而是在使用 OpenFile() 或者 CreateFile() API 请求打开的时候临时加载到系统中。符号链接将在被创建的 NTFS 上永久保留,所有类型的符号连接都可以通过文件的方式进行删除,可以命令行或者脚本中使用 DEL 符号链接 删除它们。
3.10 分层存储管理(HSM)
分层存储管理是一种转移一定时间不用的文件到价值更低的储存介质中的方法。当文件再次被访问时,文件上的重解析点将判定文件需要被使用,并将文件从储存介质中恢复出来。
3.11 卷影复制
卷影复制(VSC)服务通过将新改写的数据复制到卷影(写入时复制)来保存 NTFS 卷上的文件和文件夹的历史版本。当用户请求恢复旧早期版本时,旧的文件数据将会覆盖新的文件数据。该功能也使得数据备份程序可以存档当前系统正在使用的文件。对于负载较重的系统,Microsoft 建议将卷影副本设置到单独的磁盘上,以减小系统主要卷的 I/O 负载。
3.12 文件压缩
NTFS 压缩文件使用多种 LZ77 算法。在 4KB 的簇大小下,文件将以 64KB 为区块大小进行压缩。如果压缩后区块尺寸从 64KB 减小到了 60KB 或者更小,则 NTFS 就认为多余的 4KB 是空白的稀疏文件簇,也即认为它们没有内容。因此,这种模式将会有效的提升随机访问的速度。但是在随即写入的时候,大文件可能会被分区成非常多的小片段,片段之间会有许多很小的空隙。
压缩文件最合适用于很少写入、平常顺序访问、本身没有被压缩的文件。压缩小于 4KB 或者本身已经被压缩过(如 .zip、.jpg 或者 .avi 格式)的文件可能会导致文件比原来更大并且显著降低速度。应该尽量避免压缩可执行文件,如 .EXE 和 .DLL 文件,因为他们可能内部也会使用 4KB 的大小对内容进行分页。决不要压缩引导系统是需要的系统文件,例如驱动程序,或者 NTDLR、winload.exe 或者 BOOTMGR。
压缩高压缩比的文件,例如 HTML 或者文本文件,可能会增加对他们的访问速度,因为解压缩所需的时间要小于读取完整数据所花费的时间。
通常情况下对于文件的读写是透明的,但并非所有情况下都始终如此。 Microsoft 建议避免在保存远程配置文件的服务器系统或者网络共享位置上使用压缩,因为这会显著地增加让处理器的负担。
硬盘空间受限的单用户操作系统可以有效地利用 NTFS 压缩。由于在计算机中速度最慢的访问不是 CPU 而是硬盘,因此 NTFS 压缩可以同时提高受限制的、慢速储存空间的空间和速度利用率。
当某个程序(如下载管理器)无法创建没有内容的稀疏文件的时候,NTFS 压缩也可以作为稀疏文件的替代实现方式。
3.13 单实例存储(SIS)
当若干个不同目录中存有内容相同的文件时,单实例存储允许将相同文件归并到一个单一文件中,并创建对归并后的文件的引用。单实例存储包含一个用于管理复制、修改和归并文件的文件系统过滤器和一个用于搜索需要归并的相同文件的用户空间服务(“groveler”)。单实例存储的主要设计目标是远程安装服务器,这些服务器上往往拥有多个包含许多相同文件的安装镜像,单实例存储可以将它们统一起来。但和硬链接不同,每个文件仍然是独立的,更改任何一个副本都不会影响其它文件。和写入时复制类似,该技术不会立即完成内存复制,直到某个副本被更改。
3.14 加密文件系统(EFS)
加密文件系统(EFS)提供对 NTFS 卷上任意文件和文件夹的用户透明的强保护。 加密文件系统与 EFS 服务、Microsoft 的加密应用程序接口(CryptoAPI)以及 EFS 文件运行时库(FSRTL)联合工作。 EFS 使用块对称密钥(也被称为“文件加密密钥(FEK)”)加密文件,这比起使用非对称密钥加密在加密和解密大量数据时消耗的时间较少。该对称密钥使用一个和加密文件的用户相关的公钥加密文件,加密后的数据储存在被加密文件的可选数据流中。当需要解密文件时,文件系统使用用户的密钥解密储存在文件头中的对称密钥,然后使用该对称密钥解密文件。这些操作在文件系统级别完成,因此对用户来说是透明的。同时,为了处理用户丢失密钥的情况,加密文件系统中提供了对附加解密密钥的支持,因此恢复代理在需要时仍然可以访问数据。NTFS 提供的加密和压缩功能是互相排斥的——NTFS 只能使用其中一种功能,另一种功能可以使用其它第三方工具完成。
EFS 在 Basic、Home 和 MediaCenter 版本的 Windows 上不受支持,必须安装 Professional、Ultimate 或者服务器版本的 Windows,或者上使用 Windows 域中的企业部署工具来使用这项功能。
3.15 事务 NTFS
在 Windows Vista 中,应用程序可以使用事务 NTFS(Transactional NTFS)将一系列对文件的更改归组到一个事务中。事务能够确保所有更改要么同时生效,要么同时作废,并能确保在事务提交完成前,外部应用程序无法获知任何更改。
该技术使用和卷影复制类似的技术,以确保被改写的数据可以安全地回滚,通用日志文件系统的日志将记录下尚未成功提交或者已经提交但尚未完全生效的事务,通常情况下这是因为事务的某个参与者在提交过程中系统意外崩溃引起的。
事务 NTFS 并不要求事务必须在本地 NTFS 卷中,也可以包含在其它位置的事务数据或操作,例如在其它卷中、本地注册表中、 SQL 数据库中、系统服务或者远程服务中存储的数据。这些事务使用一个特定的服务“分布事务协调器(DTC)”在网络级别协调所有参与者,以确保所有参与者都能接收到同样的提交状态,以及传输将任何参与者确认的更改(这样其它参与者就可以清理过期的缓存数据或者回滚尚未提交的更改)。一个常见的用途是,利用事务 NTFS 可以很容易地创建一个网络级别的一致性分布式文件系统,并且每个参与者参与者都可以保留文件的脱机缓存。
4、内部实现
在 NTFS 中,所有文件数据——文件名、创建日期、访问权限,以及内容——都作为元数据储存在主文件表中。这种抽象的实现方式使得随着 Windows NT 的发展而添加文件系统功能变得非常容易。一个很典型的例子是为使用 Active Directory(活动目录)的应用程序添加用于索引的字段。
NTFS 允许为名称编码(包括文件名称、流名称、索引名称等)使用任意串行的 16 位值。这意味着支持 UTF-16 码位,但文件系统不会检查某个 UTF-16 串行是否有效(也即允许任意短整数串行,不受 Unicode 标准的限制)。
在内部,NTFS 使用 B+树索引文件系统数据。尽管该方式实现较为复杂,但能够在大多数情况下提高文件的查找速度。文件系统日志用于确保文件的元数据完整,而不是孤立的文件内容。相比于使用 FAT 的文件系统,使用 NTFS 的文件系统能够提高可靠性。
主文件表(MFT)包含每个文件及目录的元数据,以及 NTFS 卷的元文件。这其中包括文件名、位置、大小,以及权限。它的结构和算法被设计为可以最小化磁盘碎片。目录项包含一个文件名和一个“文件 ID”,该 ID 表示文件在主文件表中的记录编号。文件 ID 同时包含重复使用计数值,用于检测过期的引用。
4.1 元文件
NTFS 包含若干用于定义和组织文件系统的文件。总体来说,这些文件中的绝大多数结构和其它用户文件类似(“$Volume”是最特殊的),但不能被文件系统客户端直接访问。这些元文件用于定义文件、备份文件系统关键数据、缓存文件系统的更改、管理空闲空间的分配、满足 BIOS 的要求、跟踪坏扇区单元,以及储存安全信息和磁盘空间使用情况。
区段编号 | 文件名 | 作用 |
---|---|---|
0 | $MFT | 描述卷上的所有文件,包括文件名、时间戳、流名称和数据流所在的簇的编号列表、索引、安全标识符,以及文件属性(如“只读”、“压缩”、“加密”等)。 |
1 | $MFTMirr | $MFT 的最开始的几个关键项的副本,通常是 4 项(4KiB)。 |
2 | $LogFile | 包含文件系统更改的事务日志,以保护元数据的稳定性。 |
3 | $Volume | 包含卷的相关信息,如卷对象标识符、卷标、文件系统版本,以及卷标志(加载、需要扫描、需要调整 $LogFile 大小、在 NT4 上加载、正在更新卷串行号、需要升级结构)。卷串行号储存在 $Boot 文件中。 |
4 | $AttrDef | 使用的 NTFS 属性的表,包含名称、编号和描述。 |
5 | . | 根目录。 |
6 | $Bitmap | 一个位图,用于指示卷上的指定簇正在被使用或空闲。 |
7 | $Boot | 卷引导记录,该文件位于卷的第一个簇,其中包含引导代码(用于定位并启动 NTLDR/BOOTMGR)、一个 BIOS 参数区块(其中包含卷串行号),以及 $MFT 和 $MFTMirr 所在的簇编号。 |
8 | $BadClus | 包含所有标记为“有坏扇区”的簇的一个文件。该文件用于为 chksdk(磁盘扫描)工具简化簇的管理,用于放置新发现的坏扇区,以及标识未被引用的簇。 |
9 | $Secure | 访问控制列表(ACL)数据库,统一将 ACL 存储于该数据库中而非每个文件存储各自的 ACL 以减少总体代价。包含两个索引:$SII——可能是安全 ID 索引,以及 $SDH——安全描述符哈希,用于索引包含实际 ACL 列表的称为 $SDS 的流的位置。 |
10 | $UpCase | 一个 Unicode 大写字母表,用于确保在 Win32 和 DOS 命名空间下大小写不敏感。 |
11 | $Extend | 一个文件系统目录,包含若干不定的可选扩展,如 $Quota、$ObjId、$Reparse、$UsnJrnl 等。 |
12 ... 23 | 保留。 | |
通常是 24 | $Extend\$Quota | 包含关于磁盘限额的信息。 |
通常是 25 | $Extend\$ObjId | 包含用于分布链接跟踪的信息。 |
通常是 26 | $Extend\$Reparse | 包含对卷上所有重解析点(如符号链接)的反引用。 |
27 ... | file.ext | 常规文件项的开始位置。 |
这些元文件会被 NTFS 专门处理,很难直接查看。需要使用专门为此设计的工具完成实现该功能(例如WinHex)。