跳转到内容

NTFS

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是本页的一个历史版本,由Sgjsakura留言 | 贡献2012年8月15日 (三) 05:35 从 MFT 到属性、属性表和流编辑。这可能和当前版本存在着巨大的差异。

NTFS
开发者Microsoft
全称New Technology File System
发布1993年7月 (Windows NT 3.1)
分区标识0x07 (主引导记录(MBR))
基本数据分区(BDP) (GUID磁碟分割表(GPT))
结构
目录内容B+树[1]
文件分配Bitmap/Extents
坏块$badclus
限制
最大文件尺寸論理:16EiB減1KiB[2]
實際:16TiB減64KiB[2]
最大文件数量4,294,967,295個 (232-1)[2]
最长文件名255 UTF-16 编码单元[3]
最大卷容量論理:264減1簇[2]
實際:232減1簇[2]
文件名字符集Posix命名空间中,非U+0000 (NUL)和/ (斜杠)的任何UTF-16 字符(大小写敏感)。在Win32命名空间中,非U+0000 (NUL)、/ (斜杠)、\ (反斜杠)、: (冒号)、* (星号)、? (问号)、" (引号)、< (小于号)、> (大于号)和| (竖线管道符)的任何UTF-16字符(大小写不敏感)。[3]
功能
日期记录创建、修改、POSIX 更改、访问
日期范围1601年1月1日 – 60056年5月28日(文件时间为 64 位数字,计时间隔为 100 纳秒(每秒一百万次),从 1601 年开始持续 58000+ 年)
日期分辨率100ns
岔流是(请参见下面的可选数据流')
属性只读、隐藏、系统、存档、内容未索引、脱机、临时
文件系统权限访问控制列表(ACL)
透明压缩对每个文件,LZ77Windows NT 3.51 以上)
透明加密对每个文件
DESXWindows 2000 以上)
Triple DESWindows XP 以上)
高级加密标准(AES) (Windows XP Service Pack 1、Windows Server 2003 以上)
单一实例存储(SIS)
操作系统支持Windows NT 家族(Windows NT 3.1Windows NT 4.0Windows 2000Windows XPWindows Server 2003Windows VistaWindows Server 2008Windows 7)

NTFS全稱New Technology File System,是Windows NT以及之后的Windows 2000Windows XPWindows Server 2003Windows Server 2008Windows VistaWindows 7的标准文件系统[4]

NTFS取代了文件分配表(FAT)文件系统,为MicrosoftWindows系列操作系统提供文件系统。NTFS对FAT和HPFS(高性能文件系统)作了若干改进,例如,支持元数据,并且使用了高级数据结构,以便于改善性能、可靠性和磁盘空间利用率,并提供了若干附加扩展功能,如访问控制列表(ACL)和文件系统日志。该文件系统的详细定义属于商业秘密[5][6][7]Microsoft已经将其注册为知识产权产品。[8][9]

歷史

1990年代早期,微軟(Microsoft)和IBM组建了一个联合计划,目标是创建一个下一代的操作系统。该项目的结果是诞生了OS/2,但由於Microsoft和IBM在很多重要问题上不能达成共识而最後分裂, OS/2至今仍属於IBM。Microsoft开始研究Windows NT。OS/2的文件系统HPFS包含了若干重要功能,而当Microsoft开始创建他们自己的新操作系统时,他们的NTFS从中借用汲取了很多方面。[10] 也许是因为它们有共同的祖先,HPFS和NTFS共享了相同的磁盘分区标识代码(0x07)。共享标识是很不寻常的,因为可用的代码还有很多,其他文件系统都使用它们自己的编号。例如,FAT拥有超过九个编号(FAT12FAT16FAT32 等等每个都有一个)。用於区分文件系统的算法当遇到代码0x07的时候就不得不进行额外的检查。

版本

NTFS 有五个正式发布的版本:

  • v1.0,随 NT 3.1 一起发布[來源請求],发布于 1993 年中旬
  • v1.1,随 NT 3.5 一起发布[來源請求],发布于 1994 年秋季
  • v1.2,由 NT 3.51(1995 年中旬)和 NT 4(1996 年中旬)提供(有时候也被称为“NTFS 4.0”,因为操作系统版本是 4.0)
  • v3.0 来自 Windows 2000(有时称作“NTFS 5.0”)
  • 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 系统的长文件名支持。[11] V1.2 支持压缩文件命名流、基于 ACL(访问控制列表)的安全性等功能。[1]
V3.0 支持磁盘限额、加密、稀疏文件重解析点[來源請求]更新序列数(USN)日志、$Extend 文件夹以及其中的文件,并改进了安全描述符,以便于使用相同安全设置的多个文件共享一个安全描述符。[1]
V3.1 使用冗余 MFT 记录数(用于恢复受损的 MFT 文件)扩展了主文件表(MFT)项

Windows Vista 提供了事务 NTFSNTFS 符号链接、收缩卷以及自我恢复功能,[12]但这些附加功能由操作系统提供,而非文件系统自身的功能。

请不要将 NTFS.sys 文件版本(如 Windows 2000 中引入的 NTFS v5.0)和 NTFS 磁盘格式版本(如 Windows XP 开始的 v5.1)相混淆。[13]NTFS v5.1 磁盘格式自从 Windows XP 开始就保持不变,也被随后用于 Windows Server 2003Windows Server 2008Windows Vista 以及 Windows 7。造成这种混乱的原因是 NTFS.sys 驱动程序的新功能是由 Windows 操作系统提供的,而非 NTFS 磁盘格式提供的。Microsoft 曾经在推出 Windows 2000 时详细列举了 NTFS 文件系统的新功能,并且将其称为 NTFS v5.0,但事实上这个版本号指的是 NTFS.sys 文件的版本,而磁盘格式版本仅仅是 v3.0。[14]

功能

相对于之前的版本,NTFS v3.0 包含若干新功能:磁盘使用限额、稀疏文件支持、重解析点、分布链接跟踪,以及文件级加密(也即“加密文件系统(EFS)”)。

NTFS 日志

NTFS 是一个日志文件系统,使用 NTFS 日志($Logfile)记录卷更改元数据。

这是 NTFS 一个非常关键的功能(FAT/FAT32 不提供此项功能),用于确保其内部的复杂数据结构(比较重要的如卷分配图、磁盘碎片整理 API 进行的数据转移操作、MFT(主文件表)记录的更改情况(如移动 MFT 记录中存储的变长属性和属性表))和索引(用于目录和安全描述符)即使在系统发生崩溃后仍然能保持一致,并且在卷被重新加载后能够方便地对这些关键数据结构的失败提交进行回滚。

USN 日志

USN 日志(更新序列数日志)是一项系统管理功能,用于记录卷中所有文件、数据流、目录的内容、各项属性以及安全设置的更改情况。应用程序可以利用日志追踪卷的更改。[15]对于非系统卷,可以选择打开或关闭日志[16],当添加一个新卷后,默认情况下日志功能处于打开状态。

硬链接和短文件名

硬链接原本用于支持 Windows NT 的 POSIX 子系统[17],该功能类似于目录链接,不过作用目标是文件而非目录。硬链接只能作用到同一个卷的文件中,因为它需要在文件的 MTF 记录中增加一个额外的文件名记录。短(8.3)文件名也同样使用额外文件名实现,以便于实现同步更新。当更改文件的尺寸或属性时,不会立即更新对应的目录或者链接,直到打开它们的时候才能体现相对应的变化。[18]

可选数据流(ADS)

可选数据流使得一个文件可以同时和多个数据流相关联,数据流的表述方式为“文件名:流名”,例如“text.txt:extrastream”。可选流不会显示在 Windows 资源管理器中,查看文件大小时它们的大小也不包含在内。如果将文件复制到 FAT 格式的磁盘、附加到电子邮件、上传到网站,或者移动到任何其它不支持可选流的位置上时,只有主数据流会被保留下来,其它可选流将被全部丢弃。因此,使用可选流来保存重要数据很可能发生意外。NTFS 流从 Windows NT 3.1 开始被引入,起初设计目的是为了 Services for Macintosh(SFM)能够正确存储 Macintosh资源分岔。尽管现在 Windows 服务器已经不再包含 SFM 功能,很多第三方的Apple 归档服务(AFP)产品(例如 Group Logic 的 ExtremeZ-IP)仍然使用文件系统的这项功能。

有些恶意软件会使用可选数据流来隐藏程序代码。[19]一些恶意软件扫描程序和其它特殊工具现在已经可以检查可选流中的内容。 Microsoft 提供了一个叫作 Streams[20] 的工具,使得用户可以查看卷中的可选流。

Internet Explorer 和其它一些浏览器会在从网络上下载的文件中添加一个非常小的可选数据流,用于指示他们是从外来网站获得的,运行的时候可能不安全,因此在打开它们之前系统将会显示一个提示确认信息。.[21]当用户表示不希望再次看到这个确认对话框的时候,这个可选流将会从下载的文件中被直接删除。

有些媒体播放器也尝试使用可选数据流记录多媒体文件的自定义元数据以便于用户管理媒体文件,而这种方式无需修改媒体文件自身的内容(例如 MPEG、OGG 等格式提供的嵌入在文件内的标签信息)。Windows 资源管理器可能会作为额外的信息栏显示这些元数据。使用注册的 Windows 外壳扩展程序可以有效地解析这些数据,但是大部分媒体播放器还是使用自己的独立数据库而非可选数据流来保存这些信息。可选数据流的一个问题是受影响的文件上的信息对于所有用户都是可见的并且是共享的,因此无法有效地根据每个用户的安全设置和个人偏好而进行分别进行管理、设定和保护。

限额

磁盘限额是 NTFS v3 提出的功能。该功能允许计算机管理员在支持该功能的 Windows 版本上为用户允许占用的磁盘空间设置阈值,同时也允许管理员跟踪察看每个用户使用的磁盘空间量。管理员可以为用户设置需要收到警告的磁盘空间使用级别,并当他们超过使用上限时拒绝对磁盘的访问。当 NTFS 的文件压缩启用时,磁盘限额不会影响该功能。当应用程序查询用户可用的剩余磁盘空间时,如果设置了磁盘限额,也会收到限额的数值。

磁盘限额功能在 Basic、Home 和 MediaCenter 版本的 Windows 上不受支持,必须安装 Professional、Ultimate 或者服务器版本的 Windows,或者上使用 Windows 域中的企业部署工具来使用这项功能。

稀疏文件

稀疏文件是包含稀疏数据集的文件,这些文件将储存文件在不同位置的多个片段的内容,而片段之间的内容将不会储存,特别适合大部分内容为空、只有少量实际数据的文件。当读取文件的时候,文件系统驱动程序将会对任何不存在的位置上的信息返回 0,因此文件内容看起来几乎全是零。很多数据库和科学程序有时会用到稀疏文件。[22]。因此,Microsoft 实现了对稀疏文件的高效存储支持,允许应用程序指定文件的空(零)数据区域。读取稀疏文件的应用程序可以使用常规方法读取数据,操作系统将根据当前位置的偏移量决定需要返回什么数据。和压缩文件相同,文件的实际大小不会影响对磁盘限额的判断。[23][24]

重解析点

该功能在 NTFS v3 中可用。该功能将在用户空间中为文件或目录添加一个关联的重解析标记属性。当对象管理器(请参见Windows NT 线执行)解析文件系统名称并遇到重解析点属性时,它将“重解析”名称,将用户控制的重解析数据传递给所有 Windows 系统加载的文件过滤驱动程序。每个过滤驱动程序都将检查重解析数据,判断是否和该重解析点相关联。如果过滤驱动程序判定匹配,则将拦截文件系统调用,并执行自己的特定功能。重解析点用于实现卷加载点目录连接分层存储管理本机结构存储,以及单实例存储

卷加载点

类似于 Unix 加载点,是另一个文件系统附加到目录的根位置。在 NTFS 中,该功能允许附加的文件系统无需为每个驱动器分配单独的卷标(如 C:D:)而加载。

当卷被加载到另一个卷的根目录的时候,该目录原来的内容变得不可见,被新加载的卷的根目录中的内容替代。被加载的卷仍然可以自己的独立卷标。文件系统不允许卷之间相互加载。卷加载点可以是永久的(系统重新引导后自动重新加载),也可以是非永久的(系统重新引导后需要手动重新加载)。

被加载的卷可以使用 NTFS 外的其它文件系统。一个常见的例子是它可以是一个远程共享的目录,并且可能拥有自己的权限设置,并且根据远程文件系统的策略重新映射当前系统的访问权限。

目录连接

类似于卷加载点,但 目录连接将对象连接到文件系统中的其他目录而非卷。例如,目录 C:\exampledir 带有一个目录连接属性,链接到 D:\linkeddir,则当用户级别的应用程序访问时,将自动引用到目录 D:\linkeddir[1]该功能在概念上类似于 Unix 的目录符号链接,只是在 NTFS 中目标必须是另一个目录(典型的 Unix 文件系统允许将符号链接连接到任何其它类型的文件),而语义上等效于硬链接。

目录连接(可以在控制台中通过命令 MKLINK /J 连接名 目标目录 创建,使用 RMDIR 连接名junctionName 删除)是永久性的,在服务端进行解析时,使用和所属的卷相同的本地系统或域的安全领域,并且访问它和它的内容时,使用和目标目录以及其内容使用同样的安全设置。但连接本身可能拥有独立的安全设置,并且删除一个目录连接不会同时删除目标目录。

有些目录连接时 Windows Vista 系统创建的,用于保持和早期版本的 Windows 的兼容性,例如系统驱动器中的 Documents and Settings 文件夹会被连接到同一个卷中的 Users 物理目录上。但这些目录默认情况下是隐藏的,并且进行了相关的安全设置,因此 Windows 资源管理器将拒绝外壳或者大部分应用程序直接打开它们,除非使用本机内置的 SYSTEM 账户或者本机的 Administrators 用户组成员访问(这些账户是系统软件安装程序所使用的)。这些附加的安全限制可能是为了防止用户发现两个看上去相同的文件夹,然后错误地删除它们。

目录连接属于软链接(即使目标目录已经被删除,他们也仍然存在),使用一种类似于有限制的符号链接的形式工作(对于目标位置有额外的限制),但它们是经过特殊处理优化的,可以加快重解析点的处理速度,相对于更新的 NTFS 符号连接而言开销更小,并且可以在服务器端解析,因此可以在远程共享目录中访问它们。

符号链接

符号链接(或称软链接)从 Windows Vista 开始被引入。[25]符号链接在客户端解析,因此如果共享一个符号链接,则目标将服从客户端的访问限制,而非服务端的限制。

符号链接可以链接到文件(使用 MKLINK 符号链接 目标文件名 创建),也可以链接到目录(使用 MKLINK /D 符号链接 目标目录 创建),不过和 Unix 符号链接不同,必须在创建链接的时候设定链接语义。但创建符号链接的时候目标并不需要存在或者可以访问,只有当访问符号链接的时候才会检查目标的可访问性。NTFS 也会同时检查符号链接的类型(文件或目录)是否正确,如果目标存在但是类型不正确,则系统会返回一个找不到目标的错误。

符号链接也可以引用远程主机上的共享文件夹,或者其中的文件或者子文件夹。但目标并不会被立即加载,而是在使用 OpenFile() 或者 CreateFile() API 请求打开的时候临时加载到系统中。符号链接将在被创建的 NTFS 上永久保留,所有类型的符号连接都可以通过文件的方式进行删除,可以命令行或者脚本中使用 DEL 符号链接 删除它们。

分层存储管理(HSM)

分层存储管理是一种转移一定时间不用的文件到价值更低的储存介质中的方法。当文件再次被访问时,文件上的重解析点将判定文件需要被使用,并将文件从储存介质中恢复出来。 分层存储的目的不仅是为了节省存储开销,而且也是对存储数据的有效管理。

本机结构存储(NSS)

本机结构存储是一种已经被 Microsoft 终止使用的 ActiveX 文档存储技术。该技术允许 ActiveX 文档 使用和 ActiveX 内部是用的多流格式相同的方式进行储存。系统将加载一个本机结构存储文件系统过滤器以用于为应用程序透明地处理多流格式。当文件被传输到非 NTFS 格式的磁盘卷上时,也将同时将多个流转换为一个流。[26]

卷影复制

卷影复制(VSC)服务通过将新改写的数据复制到卷影(写入时复制)来保存 NTFS 卷上的文件和文件夹的历史版本。当用户请求恢复旧早期版本时,旧的文件数据将会覆盖新的文件数据。该功能也使得数据备份程序可以存档当前系统正在使用的文件。对于负载较重的系统,Microsoft 建议将卷影副本设置到单独的磁盘上,以减小系统主要卷的 I/O 负载。

文件压缩

NTFS 压缩文件使用多种 LZ77 算法。 [27]在 4KB 的簇大小下,文件将以 64KB 为区块大小进行压缩。如果压缩后区块尺寸从 64KB 减小到了 60KB 或者更小,则 NTFS 就认为多余的 4KB 是空白的稀疏文件簇,也即认为它们没有内容。因此,这种模式将会有效的提升随机访问的速度。但是在随即写入的时候,大文件可能会被分割成非常多的小片段,片段之间会有许多很小的空隙。[28]

压缩文件最合适用于很少写入、平常顺序访问、本身没有被压缩的文件。压缩小于 4KB 或者本身已经被压缩过(如 .zip、.jpg 或者 .avi 格式)的文件可能会导致文件比原来更大并且显著降低速度。应该尽量避免压缩可执行文件,如 .EXE 和 .DLL 文件,因为他们可能内部也会使用 4KB 的大小对内容进行分页。决不要压缩引导系统时需要的系统文件,例如驱动程序,或者 NTDLR、winload.exe 或者 BOOTMGR。

压缩高压缩比的文件,例如 HTML 或者文本文件,可能会增加对他们的访问速度,因为解压缩所需的时间要小于读取完整数据所花费的时间。

通常情况下对于文件的读写是透明的,但并非所有情况下都始终如此。 [29] Microsoft 建议避免在保存远程配置文件的服务器系统或者网络共享位置上使用压缩,因为这会显著地增加让处理器的负担。[30]

硬盘空间受限的单用户操作系统可以有效地利用 NTFS 压缩。由于在计算机中速度最慢的访问不是 CPU 而是硬盘,因此 NTFS 压缩可以同时提高受限制的、慢速储存空间的空间和速度利用率。[31]

当某个程序(如下载管理器)无法创建没有内容的稀疏文件的时候,NTFS 压缩也可以作为稀疏文件的替代实现方式。

单实例存储(SIS)

当若干个不同目录中存有内容相同的文件时,单实例存储允许将相同文件归并到一个单一文件中,并创建对归并后的文件的引用。单实例存储包含一个用于管理复制、修改和归并文件的文件系统过滤器和一个用于搜索需要归并的相同文件的用户空间服务(“groveler”)。单实例存储的主要设计目标是远程安装服务器,这些服务器上往往拥有多个包含许多相同文件的安装镜像,单实例存储可以将它们统一起来。但和硬链接不同,每个文件仍然是独立的,更改任何一个副本都不会影响其它文件。和写入时复制类似,该技术不会立即完成内存复制,直到某个副本被更改。[32]

加密文件系统(EFS)

加密文件系统(EFS)提供对 NTFS 卷上任意文件和文件夹的用户透明的强保护。 加密文件系统与 EFS 服务、Microsoft 的加密应用程序接口(CryptoAPI)以及 EFS 文件运行时库(FSRTL)联合工作。 EFS 使用块对称密钥(也被称为“文件加密密钥(FEK)”)加密文件,这比起使用非对称密钥加密在加密和解密大量数据时消耗的时间较少。该对称密钥使用一个和加密文件的用户相关的公钥加密文件,加密后的数据储存在被加密文件的可选数据流中。当需要解密文件时,文件系统使用用户的密钥解密储存在文件头中的对称密钥,然后使用该对称密钥解密文件。这些操作在文件系统级别完成,因此对用户来说是透明的。[33] 同时,为了处理用户丢失密钥的情况,加密文件系统中提供了对附加解密密钥的支持,因此恢复代理在需要时仍然可以访问数据。NTFS 提供的加密和压缩功能是互相排斥的——NTFS 只能使用其中一种功能,另一种功能可以使用其它第三方工具完成。

EFS 在 Basic、Home 和 MediaCenter 版本的 Windows 上不受支持,必须安装 Professional、Ultimate 或者服务器版本的 Windows,或者上使用 Windows 域中的企业部署工具来使用这项功能。

事务 NTFS

在 Windows Vista 中,应用程序可以使用事务 NTFS(Transactional NTFS)将一系列对文件的更改归组到一个事务中。事务能够确保所有更改要么同时生效,要么同时作废,并能确保在事务提交完成前,外部应用程序无法获知任何更改。[34]

该技术使用和卷影复制类似的技术,以确保被改写的数据可以安全地回滚,通用日志文件系统的日志将记录下尚未成功提交或者已经提交但尚未完全生效的事务,通常情况下这是因为事务的某个参与者在提交过程中系统意外崩溃引起的。

事务 NTFS 并不要求事务必须在本地 NTFS 卷中,也可以包含在其它位置的事务数据或操作,例如在其它卷中、本地注册表中、 SQL 数据库中、系统服务或者远程服务中存储的数据。这些事务使用一个特定的服务“分布事务协调器(DTC)”在网络级别协调所有参与者,以确保所有参与者都能接收到同样的提交状态,以及传输任何参与者确认的更改(这样其它参与者就可以清理过期的缓存数据或者回滚尚未提交的更改)。一个常见的用途是,利用事务 NTFS 可以很容易地创建一个网络级别的一致性分布式文件系统,并且每个参与者都可以保留文件的脱机缓存。

互操作性

NTFS 具体实现的内部细节被保密,因此这导致第三方开发者试图制作处理 NTFS 的工具变得异常困难。

Linux

完整并安全的对 NTFS 的读写功能由 NTFS-3G 驱动程序提供。该驱动程序包含在绝大多数Linux发行版中。同时也存在过时的,大部分仅只读的解决方案:

  • Linux 内核 2.2:从版本 2.2.0 开始,可以读取 NTFS 分区。
  • Linux 内核 2.6:包含一个由 Anton Altaparmakov(来自剑桥大学)和 Richard Russon 编写的驱动程序,该驱动程序支持读取文件以及在部分情况下的改写文件和调整文件大小。
  • NTFSMount:使用 ntfsmount 可以通过一个用户级驱动程序对文件和目录进行有限的读写操作。[35]
  • NTFS for Linux:由 Paragon 提供的对 NTFS 提供完整读写支持的商用驱动程序。
  • Captive NTFS:一个使用 Windows 自身的驱动程序“ntfs.sys”并进行简单封装的驱动程序。

请注意,上面所有三个用户级别驱动程序(NTFSMount、NTFS-3G 以及 Captive NTFS)都基于用户空间文件系统(FUSE),该系统是一个用于在用户空间和内核代码间通讯以获取或保存数据的 Linux 内核模块。技术上面所有的驱动程序(除了 Paragon NTFS for Linux)都是开源GPL)的。由于 NTFS 内部结构非常复杂,内置的 2.6.14 内核驱动程序和 FUSE 都不允许修改被认为是不安全的卷,以避免发生损坏事故。

Microsoft Windows

尽管绝大多数 NTFS 版本的绝大部分都完全向前以及向后兼容,在旧版本的 Microsoft Windows 加载新版本的 NTFS 卷仍然存在不少技术问题。这往往会影响到多重启动,以及外部可携带的硬盘。

例如,在不支持的操作系统上尝试使用带有“先前版本”(严格的说称为卷影副本)的 NTFS 分区,会导致这些先前的版本产生丢失。[36]

其他

eComStationKolibriOS,以及 Mac OS X 版本 10.3 及以后版本都提供对 NTFS 的只读访问支持(eComStation 有一个测试版本的驱动程序允许写入/删除操作,但通常认为该驱动程序还不安全)。BeOS 有一个基于 NTFS-3G 的的第三方工具,允许完整的 NTFS 读写操作。除了 Linux, NTFS-3G 也能工作在 Mac OS XFreeBSDNetBSDSolaris 以及 Haiku 上。同时,也有一个称为“NTFS4DOS”的商用驱动程序允许在 DOS 下进行读写。[37]Mac OS X 有一个商用的可读写的 NTFS 驱动程序,名称为“Paragon NTFS for Mac OS X”。[38]

从其它文件系统转换

Microsoft 当前提供了一个工具(convert.exe),可以将HPFS(仅 Windows NT 3)、FAT16 以及在 Windows2000 以上的 FAT32 卷转换为 NTFS。[39]

调整大小

有许多第三方工具可以安全地重新调整 NTFS 分区的大小。在 Windows Vista 中,Microsoft 添加了收缩和扩展分区的功能,但该功能非常有限,因为该功能不会整理页面文件碎片或标记为不可移动的文件,因此限制了对分区的收缩能力。取消页面文件重新启动或使用第三方的工具进行磁盘碎片整理可能能产生一定效果。

协调时间

由于历史原因,所有不支持 NTFS 的 Windows 系统内部都将时间记录为本地时区时间,因此当前版本的 Windows 支持其他所有版本的文件系统。而 Windows NT 及以此派生的系统使用通用协调时间(UTC)记录内部时间戳,并在显示时进行必要的转换,也就是说,NTFS 是 UTC 时间。这意味着当在 NTFS 和非 NTFS 分区间移动或复制文件时,操作系统需要转换时间戳。但如果被移动的部分文件使用了夏时制,而其他文件使用了标准时间,则转换会导致不能确定结果。特别是当在本地时区时间更改的短暂时刻中,用户可能会发现部分文件的时间戳错开了一小时。由于夏时制在南北半球的实现不一致,可能会导致在任意 12 个月中产生最多 4 个小时的时间戳错误。[40]

内部实现

在 NTFS 中,所有文件数据——文件名、创建日期、访问权限,以及内容——都作为元数据储存在主文件表中。这种抽象的实现方式使得随着 Windows NT 的发展而添加文件系统功能变得非常容易。一个很典型的例子是为使用 Active Directory(活动目录)的应用程序添加用于索引的字段。

NTFS 允许为名称编码(包括文件名称、流名称、索引名称等)使用任意序列的 16 位值。这意味着支持 UTF-16 码位,但文件系统不会检查某个 UTF-16 序列是否有效(也即允许任意短整数序列,不受 Unicode 标准的限制)。

在内部,NTFS 使用 B+树索引文件系统数据。尽管该方式实现较为复杂,但能够在大多数情况下提高文件的查找速度。文件系统日志用于确保文件的元数据完整,而不是孤立的文件内容。相比于使用 FAT 的文件系统,使用 NTFS 的文件系统能够提高可靠性。[41]

主文件表(MFT)包含每个文件及目录的元数据,以及 NTFS 卷的元文件。这其中包括文件名、位置、大小,以及权限。它的结构和算法被设计为可以最小化磁盘碎片。目录项包含一个文件名和一个“文件 ID”,该 ID 表示文件在主文件表中的记录编号。文件 ID 同时包含重复使用计数值,用于检测过期的引用。这种结构非常类似 Files-11 的 W_FID,但 NTFS 的其他结构却有着根本的区别。

元文件

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 卷引导记录,该文件位于卷的第一个簇,其中包含引导代码(用于定位并启动 NTLDRBOOTMGR)、一个 BIOS 参数区块(其中包含卷序列号),以及 $MFT 和 $MFTMirr 所在的簇编号。
8 $BadClus 包含所有标记为“有坏扇区”的簇的一个文件。该文件用于为 chksdk(磁盘扫描)工具简化簇的管理,用于放置新发现的坏扇区,以及标识未被引用的簇。
9 $Secure 访问控制列表(ACL)数据库,统一将 ACL 存储于该数据库中而非每个文件存储各自的 ACL 以减少总体代价。包含两个索引:$SII——可能是[來源請求]安全 ID 索引,以及 $SDH——安全描述符哈希,用于索引包含实际 ACL 列表的称为 $SDS 的流的位置。[1]
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)。

从 MFT 到属性、属性表和流

对于每个 MFT 记录中描述的文件或目录,都有一个线性存放的流描述符(被称作属性)存储区,被打包后存放在一个变长记录(称为属性表)中,然后使用额外的填充符填充以满足 MFT 记录的 1Kib 对齐要求。这部分完整的描述了和文件相关联的所有有效流。注意此处的“流”和文件数据流不是一个概念,是所有数据信息的统称。

每个流(或称属性)本身是包含了一个类型(内部通常存储为一个固定长度的整数或者一个描述符,但通常程序中在 FileOpen() 或者 FileCreate() API 调用时会使用等效的符号名称来处理它)、一个可选的流名称(和对应的文件名完全无关),以及一段可选的与流相对应的数据。 对于 NTFS 而言,文件的标准(主)数据、目录的索引信息、文件的可选数据流、以及文件的所有属性,处理方式都是完全相同的,他们都是若干属性表中的某个属性而已。

  • 对于每个 MFT 中描述的文件(或非常驻的流描述符存储区,具体概念请参考下面),流描述符(使用流类型和名称标识)必须唯一。此外,NTFS 还对于描述符有一些用于排序的约束要求。
  • NTFS 预定义了一种空流类型,用来在文件的流存储区中指示流描述符的结尾。空类型必须是每个存储区中的最后一个流描述符,所有之后的剩余空间都将被忽略,只包含填充字节,用于满足 MFT 的记录尺寸要求或者非常驻流存储区的簇尺寸要求。
  • 对于每个 MFT 记录,某些流类型是必须的,除非是一个用空流类型表示的未使用记录。
    • 这里指的是包含时间戳和其它单比特(Bit)的属性的标准属性,这种记录使用固定长度的记录存放,这是为了兼容 DOS 或者 Windows 95/98 管理的 FAT/FAT32 文件。
  • 某些流类型不能包含名称,必须是匿名的。
    • 这里指的是标准属性、 NTFS 的“文件名”流类型,以及“短文件名”流类型(这个流并不一定出现,通常是为了兼容 DOS 风格的应用程序)。有些时候文件也可能只包含短文件名,这时候短文件名就会变成 Windows 资源管理器中显示的文件名。
    • 流存储区中存储的文件名流并不会使得文件能够马上在分层的文件系统中出现。事实上,所有文件名必须在同一卷的至少一个独立目录中被索引,在目录中的文件信息拥有独立于文件本身的 MFT 项、自己的安全描述符、属性表,以及对文件所在的 MFT 项编号的引用。因此,这种方式也可以让同一个文件或者目录在一个卷的多个目录中中被“硬链接”多次,并且可以具有不同的名称。
  • 一个常规文件的默认数据流的流类型为 $DATA,但没有流名称。可选数据流使用同样的类型,但必须具有名称。
  • 与此相反的,目录的默认数据流具有不同的类型,但不是匿名的:他们使用流名称(如在 NTFS 3 以上版本中为“$I30”)来指示索引的格式。

对任意文件的所有流,可以使用 nfi.exe—“NTFS 文件扇区信息实用工具”进行查看,该文件包含在 Microsoft OEM Support Tools 中,可以免费发布。[42]

常驻文件和非常驻文件

为了优化通常情况下小数据文件的存储并降低 I/O 负荷,NTFS 选择在流描述符尺寸不超过 MFT 最大记录尺寸或者非常驻文件流存储区尺寸的情况下,将数据放入流描述符中,而不是使用 MFT 空间标记包含数据的簇的列表,在后者情况下,MFT 中并不直接存储数据,而是存储卷中实际存储数据的的位置的分配表。可以直接从流描述符中获得数据的文件被计算机取证工作者称为“常驻数据”。满足条件的数据量和文件的特征高度相关,但通常情况下,一个单流、文件名不长且无 ACL 的文件大概包含 700 到 800 个字节。

  • 部分流描述符(例如首选文件名、基本文件属性、非常驻流的主分配表)必须以常驻形式存在。
  • 使用 NTFS 加密的流、稀疏数据流,以及压缩数据流无法常驻。
  • 非常驻流得分配图格式依赖于对稀疏数据存储的支持性。在当前 NTFS 的实现方式下,如果一个非常驻数据流被标记并转换为稀疏流,将无法还原为非稀疏格式,因此将无法重新变为常驻文件,除非将流完全截断并且丢弃稀疏分配图。
  • 如果一个非常驻数据流碎片太多,在 MFT 记录中无法放下整个分配图,则分配图可能也会被存放到一个非常驻流当中,而文件本身只包含一个小型的常驻数据流,用以支持非常驻数据对应的非常驻分配图所在的位置。
  • 如果一个文件的流太多(包括可选数据流、扩展属性、安全描述符等),流描述符无法完整放入 MFT 中,则 NTFS 也会建立一个非常驻数据流用以提供额外的存储区存放必须常驻的流之外的其它流描述,使用和 MFT 记录一样的格式存放它们,不过不再有空间尺寸限制。

由于常驻文件不直接占据簇(“分配单元”),使得 NTFS 卷有个能包含比簇更多的文件。例如,一个 80GB(74.5GiB)的分区,NTFS 格式化为 19,543,064 个 4KiB 的簇。除去系统文件(64MiB 日志文件,一个 2,442,888 字节的位图,以及大约 25 个簇的固定头部),还剩余 19,526,158 个簇可用于文件和索引。由于每个簇有 4 个 MFT 记录,因此卷理论上可以包含将近 4 × 19,526,158 = 78,104,632 个常驻文件。

限制

下面是一些 NTFS 的限制:

保留的文件名
尽管文件系统支持最长 32767 个 Unicode 字符的的路径[43]。每个路径组成部分(目录或文件名)最多可以有 255 个字符[43]长,但不允许使用某些特定名称,因为 NTFS 将元数据储存在通常(尽管是隐藏的,并且大部分不可访问)的文件夹中。同理,用户也不能使用这些名称作为文件名。这些文件都存在于卷的根目录中(名称也仅在根目录中被保留)。被保留的名称有:$MFT、$MFTMirr、$LogFile、$Volume、$AttrDef、.(点)、$Bitmap、$Boot、$BadClus、$Secure、$Upcase,以及 $Extend[2]。.(点)和 $Extend 是文件夹,其它项目是文件。
最大卷尺寸
理论上来说,NTFS 的最大尺寸是 264-1 个簇。但是目前在 Windows XP Professional 中实现的 NTFS 卷的最大尺寸是 232-1 个簇。例如,使用大小为 64KiB 的簇,则 NTFS 卷的最大尺寸是 256TiB 减去 64KiB。使用默认的 4KiB 的簇大小,则 NTFS 卷的最大尺寸是 16TiB 减去 4KiB。由于主引导记录(MBR)上的分区表只支持最大 2TiB 的分区,要创建超过 2TiB NTFS 卷,必须使用动态卷或者 GPT 卷。
最大文件尺寸
理论值:16EiB 减去 1KiB( 字节)。实际实现:16TiB 减去 64KiB( 字节)
可选数据流
Windows 系统调用可能处理,也可能不处理可选数据流。[2]根据操作系统、工具和远程文件系统的情况,文件传输过程可能会无任何提示地丢弃数据流。[2]复制或移动文件的安全方式是使用 BackupRead 和 BackupWrite 系统调用,这些调用允许程序枚举流并验证每个流是否被需要写入目标卷以跳过不需要的流。[2]
最大路径长度
绝对路径最多允许 32767 个字符[43]。相对路径被限制在 255 个字符。
日期范围
NTFS 使用和 Windows NT 相同的计算方式:64 位时间戳,允许范围从 1601年1月到 60056年5月28日,分辨率是每秒钟一百万个计数单位。

开发者

NTFS 开发者包括:

另请参阅

参考文献

  1. ^ 1.0 1.1 1.2 1.3 1.4 Mark Russinovich. Inside Win2K NTFS, Part 1. Microsoft Developer Network. [2008-04-18]. 
  2. ^ 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 Microsoft Corporation. How NTFS Works. [2008-01-27]. 
  3. ^ 3.0 3.1 Richard Russon and Yuval Fledel. NTFS Documentation. [2007-07-01]. 
  4. ^ Custer, Helen. Inside the Windows NT File System. Microsoft Press. 1994. ISBN 978-1-55615-660-1. 
  5. ^ File Systems Unraveled: New Technolgy File Systems. How-To Guides. pcnineoneone: 3. [2008-06-17]. 
  6. ^ Chris Quirke. NTFS vs. FAT32. May 2004 [2008-06-17]. 
  7. ^ Attachment A: Additional Laptop Security Considerations. Technical Guidance for HIV/AIDS Surveillance Programs. Centers for Disease Control and Prevention, Dept. of Health and Human Services. May 2004 [2008-06-17]. 
  8. ^ Inside Windows NT Disk Defragmenting. Microsoft Technet. Microsoft. March 3,2007 [2008-09-17]. 
  9. ^ Paul Thurrott. NTFS Licensee Reports Microsoft Threat, Apology. Windows IT Pro. February 2001 [2008-06-17]. 
  10. ^ Kozierok, Charles M. Overview and History of NTFS. PCGuide. April 17, 2001. 
  11. ^ Recovering Windows NT After a Boot Failure on an NTFS Drive. Microsoft. November 1, 2006. 
  12. ^ Loveall, John. Storage improvements in Windows Vista and Windows Server 2008 (PowerPoint). Microsoft Corporation: 14–20. 2006 [2007-09-04]. 
  13. ^ New Capabilities and Features of the NTFS 3.1. Microsoft. December 1, 2007. 
  14. ^ 引用错误:没有为名为Inside Win2K NTFS, Part 1的参考文献提供内容
  15. ^ Change Journals (Windows). MSDN. [2010-04-16]. 
  16. ^ Creating, Modifying, and Deleting a Change Journal (Windows). MSDN. [2010-04-16]. 
  17. ^ MS Windows NT Workstation 4.0 Resource Guide, "POSIX Compatibility"
  18. ^ MSDN
  19. ^ Malware utilising Alternate Data Streams?, AusCERT Web Log, 21 August 2007
  20. ^ Sysinternals Streams v1.56
  21. ^ Russinovich, Mark E.; Solomon, David A.; Ionescu, Alex. File Systems. Windows Internals 5th. Microsoft Press. 2009: 921. ISBN 978-0-7356-2530-3. 一个使用多数据流的 Windows 组件例子是附件执行服务[...],根据文件所下载位置的所属区域不同[...],Windows 资源管理器可能会警告用户 
  22. ^ Sparse File Errors: 1450 or 665 due to file fragmentation: Fixes and Workarounds, Microsoft Customer Service and Support (CSS) SQL Server Engineers Blog, March 4, 2009
  23. ^ Sparse Files. MSDN Platform SDK: File Systems. [2005-05-22]. 
  24. ^ Sparse FIles and Disk Quotas. Win32 and COM Development: File Systems. [2007-12-05]. 
  25. ^ Symbolic Links (Windows). MSDN. 
  26. ^ John Saville, "What is Native Structured Storage?"
  27. ^ File Compression and Decompression. MSDN Platform SDK: File Systems. [2005-08-18]. 
  28. ^ Understanding NTFS Compression. [2011-03-16]. 
  29. ^ Read-Only Filegroups and Compression. SQL Server 2008 Books Online (November 2009). [2010-04-20]. 
  30. ^ "Best practices for NTFS compression in Windows." Microsoft Knowledge Base. Retrieved on 2005-08-18.
  31. ^ Daily, Sean. Optimizing Disks. IDG books. January 1998 [2007-12-17]. 
  32. ^ Single Instance Storage in Windows 2000 (PDF). Microsoft Research and Balder Technology Group. 
  33. ^ How EFS Works, Microsoft Windows 2000 Resource Kit
  34. ^ Transactional NTFS. MSDN. [2007-02-02]. 
  35. ^ "ntfsmount wiki page on linux-ntfs.org"
  36. ^ cfsbloggers. How restore points and other recovery features in Windows Vista are affected when dual-booting with Windows XP. The Filing Cabinet. July 14, 2006 [2007-03-21]. 
  37. ^ Recovery information
  38. ^ Paragon NTFS for MAC OS X - full read and write access to Windows NTFS partitions under Mac OS X
  39. ^ How to Convert FAT Disks to NTFS. Microsoft Corporation. 2001-10-25 [2007-08-27]. 
  40. ^ "Beating the Daylight Savings Time bug and getting correct file modification times" The Code Project
  41. ^ "Microsoft TechNet Resource Kit"
  42. ^ OEM Support Tools Phase 3 Service Release 2 Availability. Microsoft Corporation. 2007-02-21 [2010-06-16]. Windows NT File System (NTFS) File Sector Information Utility [...] A tool used to dump information about an NTFS volume 
  43. ^ 43.0 43.1 43.2 更精确地说,32767 表示 255个 UTF-16 编码字。某些特殊的 Unicode 字符可能需要两个字的空间

外部链接

  • 文献:
  • 实现技术:
    • NTFS-3G – an open source read/write NTFS driver for Linux, FreeBSD, Mac OS X, NetBSD, Solaris and Haiku.
    • Linux-NTFS – an open source project to add NTFS support to the Linux kernel (write support is limited, but can be used for simple tasks), and write POSIX-compatible utilities for accessing and manipulating NTFS (ntfsprogs; includes ntfsls, ntfsresize, ntfsclone, etc). Linux NTFS FAQ and howto
    • Captive NTFS – a shim which used the Windows NTFS driver to access NTFS file systems under Linux