NTFS

{{Infobox filesystem
| name = NTFS
| full_name=New Technology File System
| developer = Microsoft
| introduction_os = Windows NT 3.1
| introduction_date = 1993年7月
| partition_id =主引导记录(MBR):0x07
GUID磁碟分割表(GPT):EBD0A0A2-B9E5-4433-87C0-68B6B72699C7(基本数据分区(BDP))
| directory_struct = B+树
| file_struct = 位图
| bad_blocks_struct = $BadClus(MFT记录)
| max_filename_size = 255个UTF-16编码单元
| max_files_no = 4,294,967,295(232-1)
| max_volume_size =理論:264-1簇

NTFS取代FAT(文件分配表)和HPFS(高性能文件系统)并进行一系列改进成为更加完善的安全系统,例如增强对元数据的支持,使用更高级的数据结构以提升性能、可靠性和磁盘空间利用率,并附带一系列增强功能,如访问控制表(ACL)和文件系统日志。

其他台式机和服务器操作系统也支持NTFS。Linux和Windows提供代码的软件NTFS-system,可用于读写NTFS文件。Mac OS X内核不能对NTFS进行寫入操作。

歷史
20世纪80年代中期,微软(Microsoft)和IBM合作,希望创建下一代的图形操作系统。该项目的成果為OS/2,但由于微軟和IBM在很多重要问题上无法达成共识,最后合作被终止,目前OS/2至今仍属於IBM,而Microsoft从此后开始研究Windows NT。

OS/2的文件系统HPFS包含许多重要功能,当Microsoft开始创建他们自己的新操作系统时,NTFS文件系统的很多功能正是从HPFS中借鉴改善的。可能正是因为他们来自于同一个项目,HPFS和NTFS使用相同的磁盘分区标识代码(0x07)。这是一种非常特殊的情况,因为可用的标识码并不匮乏,其它每个文件系统具有自己的标识码,例如,FAT拥有超过九个编号(FAT12、FAT16、FAT32等等各自都拥有不同的标识码)。这种特例也导致之后用于区分文件系统的算法当遇到代码0x07时候不得不进行额外的检测。

NTFS的开发者包括:Tom Miller、Gary Kimura、Brian Andrew以及David Goebel。

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

操作系统首先通过0x30位置的8个字节找到 $MFT 所在的簇编号,然后将其和每簇扇区数(0x0D位置的1字节)以及每扇区字节数(0x0B位置的2字节)相乘,获得$MFT的字节偏移量。

主文件表(MFT)
在NTFS中,所有文件数据——文件名、创建日期、访问权限(使用访问控制表(ACL)实现),以及内容——都作为元数据储存在主文件表中。这种抽象的实现方式能够大大简化为文件系统添加功能的成本。例如,Active Directory(活动目录)服务可以很容易在文件系统中为文件添加索引字段。这种设计方式也使得Everything或者Ultrasearch一类的软件可以不依赖于Windows Search实现对文件和文件夹名称的实时搜索。

MFT结构支持最小化磁盘碎片的算法。一个目录项同时包含“文件名”和“文件ID”,后者是用于在主文件表中标识文件的记录编号。文件ID也包含“重用次数”信息,可用于检测对文件的过期引用。这点设计非常类似于Files-11文件系统的W FID,和NTFS的其他部分迥然不同。

元文件
NTFS包含若干用于定义和组织文件系统的文件。总体来说,这些文件中的绝大多数结构和其它用户文件类似(只有“$Volume”比较特殊),但不能被文件系统客户端直接访问。这些元文件为定义文件、备份文件系统的关键数据、缓存文件系统的更改、管理空闲空间的分配、满足BIOS的要求、跟踪坏扇区单元,以及储存安全信息和磁盘空间使用情况等等多种不同需求提供支持。

{| class="wikitable"
! 区段编号 !! 文件名 !! 作用
|-
| 0 || $MFT || 描述卷上的所有文件,包括文件名、时间戳、流名称和数据流所在的簇的编号列表、索引、安全标识符,以及文件属性(如“只读”、“压缩”、“加密”等)。
|-
| 1 || $MFTMirr || $MFT的最开始的几个关键项的副本,通常是4项(4KiB)。
|-
| 2 || $LogFile || 文件系统更改的事务日志,用于保护元数据的稳定性。
|-
| 3 || $Volume || 卷的相关信息,如卷对象标识符、卷标、文件系统版本,以及若干卷标志(包括:“正在加载”、“需要扫描”、“需要调整$LogFile大小”、“在NT4上加载”、“正在更新卷序列号”、“需要升级结构”等)。这些数据不直接在数据流中存储,而是存储于特殊的 MFT 属性中。如果卷对象标识符存在,则将会在一个 $OJBECT_ID 记录中;卷标存储在 $VOLUME_NAME 记录中;其它数据存储在 $VOLUME_INFORMATION 记录中;卷序列号储存在$Boot文件中(请参见下文)。
|-
| 4 || $AttrDef || 所有NTFS项目使用到的属性的定义表,包含属性名称、属性编号和属性描述等。
|-
| 5 || . || 根目录。目录数据存储在两个名称均为 $I30 的 $INDEX_ROOT 和 $INDEX_ALLOCATIOn 属性中
|-
| 6 || $Bitmap || 一个位图,每一位按顺序指示卷上的对应簇正在被使用(1)或空闲(0)。
|-
| 7 || $Boot || 卷引导记录,该文件始终位于卷的第一个簇,其中包含引导代码(用于定位并启动NTLDR/BOOTMGR)、BIOS参数块(其中包含卷序列号),以及$MFT和$MFTMirr所在的簇编号。
|-
| 8 || $BadClus || 包含所有标记为“有坏扇区”的簇的一个文件。该文件通常被chkdsk(磁盘扫描)工具使用,用于管理所有簇状态,记录坏扇区,以及标记空白簇。该文件包含两个数据流(无论卷是否有坏道):一个包含所有坏扇区编号的无名称流(如果卷没有坏扇区则该流长度为零),以及名称为$Bad的流,包含所有包含记录在第一个流中的簇。
|-
| 9 || $Secure || 访问控制表(ACL)数据库,NTFS将所有ACL信息集中存储于该数据库(而非每个文件独立存储各自的ACL)以节省磁盘占用并提高执行效率。此部分包含两个索引,分别是:“$SII”——可能是安全ID索引,以及“$SDH”——安全描述符哈希。注意大部分ACL列表通常都很长,因此这个部分只是索引,记录的是实际存储ACL数据的$SDS流的位置。

常驻文件和非常驻文件
为了优化小数据文件的资源占用并降低I/O负荷,在流描述符和文件数据大小总和不超过单个MFT最大记录大小时,NTFS会直接将数据放入流描述符区域中(通常情况下,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个常驻文件。

机会锁
机会锁(Oplock)允许网络客户端改变对文件或数据流的缓存策略,以便于增强性能或降低网络占用。机会锁应用到文件某个打开的流上,不影响同一个文件的其它流。

机会锁可以用于在后台透明访问文件。如果没有其它进程访问服务器文件,网络客户端可以避免向文件写入数据;而如果没有其他进程正在写入数据,客户端可以缓存即将读取的数据。

Windows支持四种不同类型的机会锁:

  • 等级2(共享):多个读取,不可写入(也即读缓存)。
  • 等级1(独占):任意缓冲方式的独占访问(也即读写缓存)。
  • 批量锁(也是独占的):在服务器上打开流,在客户端关闭流(读、写和句柄缓存)。
  • 过滤锁(也是独占的):当其它程序尝试访问流时,应用程序和系统过滤器可以放弃该锁(读写缓存,从Windows 2000开始受支持)

在Windows 7和Windows Server 2008 R2系统中,机会锁得到增强,支持每个客户端使用独立的机会锁键。

时间
Windows NT和后续产品使用UTC作为内部时间戳,并在显示时进行适当的转换。也就是说,NTFS时间戳使用UTC模式。

由于历史原因,不支持NTFS的Windows使用本地时区作为时间戳,而目前版本的Windows对非NTFS分区也是用此方式进行处理。这意味着当文件在NTFS和非NTFS分区间进行移动时,操作系统需要实时转换时间戳。如果某些文件移动时处于夏令时,而某些文件处于标准时间,则可能移动后的时间可能会产生歧义,特别是当执行时间正好在时制转换前后时,用户可能会看到一小时的时间差。基于不同地区的不同夏令时规则,在任意12个月中,可能会产生最多4个小时的永久时间戳错误。

互操作性
NTFS具体的内部实现细节属于商业秘密,这给第三方开发者制作NTFS文件系统处理程序带来很大的困难。

Microsoft Windows
尽管绝大多数NTFS版本的绝大部分都完全向前以及向后兼容,但在旧版本的Microsoft Windows加载新版本的NTFS卷仍然会产生不少技术问题。这种问题往往来自于同一台计算机的多重启动功能,或者使用移动硬盘设备传输文件。

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

Windows提供了一个命令行工具“convert.exe”可用于将部分文件系统转换为NTFS,包括HPFS(仅在Windows NT 3.1、3.5和3.51中受支持)、FAT16和FAT32(在Windows 2000及后续版本中受支持)。
Mac OS X
Mac OS X 10.3及后续版本包含对NTFS格式分区的只读支持。基于GPL授权的NTFS-3G也可以通过用户空间文件系统在Mac OS X上使用并读写NTFS分区。NTFS-3G的开发团队还提供一个性能更好的商业版本,名称为“Tuxera NTFS for Mac”。Paragon Software Group也出售可执行读写操作的驱动程序,名称为“NTFS for Mac OS X”,部分希捷(Seagate)硬盘包含该组件。Mac OS X 10.6和后续版本中包含有本机NTFS的写入支持,默认情况下此功能未激活,可以通过特定方法打开。但有用户报告此功能不稳定并会导致内核错误,可能这也是该功能未启动或者被宣告的原因之一。

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

  • Linux内核2.2:从版本2.2.0开始,可以读取NTFS分区。
  • Linux内核2.6:包含一个由Anton Altaparmakov(来自剑桥大学)和Richard Russon编写的驱动程序,该驱动程序支持读取文件以及在部分情况下的改写文件和调整文件大小。
  • NTFSMount:使用ntfsmount可以通过一个用户级驱动程序对文件和目录进行有限的读写操作。
  • Tuxera NTFS:高性能可读写商业内核驱动,主要是针对嵌入式设备,他还开发了开源的NTFS-3G驱动。
  • NTFS for Linux:由Paragon Software Group提供的对NTFS提供完整读写支持的商用驱动程序,桌面版可免费下载,嵌入式Linux版本则需要收费。
  • Captive NTFS(已停止维护):一个使用Windows自身的驱动程序“ntfs.sys”并进行简单封装的驱动程序。

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

其他
eComStation和FreeBSD都提供对NTFS的只读访问支持(eComStation有一个测试版本的驱动程序允许写入/删除操作,但通常认为该驱动程序还不安全)。BeOS有一个基于NTFS-3G的第三方工具,允许完整的NTFS读写操作。除了Linux,NTFS-3G也能工作在Mac OS X、FreeBSD、NetBSD、Solaris以及Haiku上。同时,也有一个称为“NTFS4DOS”的商用驱动程序允许在DOS下进行读写。Ahead Software曾经在2002至2004年间开发了一个名为“NTFSREAD”的驱动程序(版本1.200),可用于DR-DOS,并曾包含在他们的Nero Burning ROM软件中。OpenBSD在2011年5月1日发布的4.9版本中提供了针对i386和amd64体系结构的NTFS只读支持。Google開發的Chrome OS作業系統也支援NTFS。

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

另请参阅

  • 文件系统的对比
  • NTFSDOS
  • Files-11—ODS-2非常类似于NTFS(如相比较于INDEXF.SYS和$Mft,BITMAP.SYS和 $Bitmap)
  • HPFS,为OS/2操作系统开发的文件系统
  • ntfsresize
  • Samba(软件)

参考文献
*
*
*

外部链接

  • 文献:

** [http://sourceforge.net/project/showfiles.php?group_id=13956&package_id=16543 Low-level description of NTFS disk structures] from the Linux-NTFS project
** [http://www.ntfs.com/ NTFS.com] – documentation and resources for NTFS
** [https://web.archive.org/web/20080704051237/http://technet2.microsoft.com/WindowsServer/en/library/81cc8a8a-bd32-4786-a849-03245d68d8e41033.mspx Microsoft NTFS Technical Reference]

  • 实现技术:

** [http://www.ntfs-3g.org/ NTFS-3G] – an open source read/write NTFS driver for Linux, FreeBSD, Mac OS X, NetBSD, Solaris and Haiku.
** [http://linux-ntfs.org/ 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 [https://web.archive.org/web/20081112060709/http://www.linux-faqs.com/faq/misc/ntfs.php FAQ] and [https://web.archive.org/web/20081207193302/http://www.linux-faqs.com/Forum/viewtopic.php?t=7 howto]
** [http://www.jankratochvil.net/project/captive/ Captive NTFS] – a shim which used the Windows NTFS driver to access NTFS file systems under Linux

评论 (0)

  • 还没有评论,来抢沙发吧。