NTFS
開發者 | Microsoft |
---|---|
全稱 | New Technology File System |
發布 | 1993年7月 (Windows NT 3.1) |
分區標識 | 主引導記錄(MBR):0x07 GUID磁碟分割表(GPT):EBD0A0A2-B9E5-4433-87C0-68B6B72699C7(基本數據分區(BDP)) |
結構 | |
目錄內容 | 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) |
透明壓縮 | 對每個文件,LZ77(Windows NT 3.51 以上) |
透明加密 | 對每個文件 DESX(Windows 2000 以上) Triple DES(Windows XP 以上) 高級加密標準(AES) (Windows XP Service Pack 1、Windows Server 2003 以上) |
單一實例存儲(SIS) | 是 |
操作系統支持 | Windows NT 家族(Windows NT 3.1 到 Windows NT 4.0、Windows 2000、Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008、Windows 7、Windows 8、Windows Server 2012)、Unix-like(NTFS-3G) |
NTFS(英語:New Technology File System),是Windows NT以及之後的Windows 2000、Windows XP、Windows Server 2003、Windows Server 2008、Windows Vista、Windows 7、Windows Server 2012和Windows 8的標準文件系統。[4]
NTFS取代了文件分配表文件系統,為Microsoft的Windows系列操作系統提供文件系統。NTFS對FAT和HPFS(高性能文件系統)作了若干改進,例如,支持元數據,並且使用了高級數據結構,以便於改善性能、可靠性和磁盤空間利用率,並提供了若干附加擴展功能,如訪問控制列表和文件系統日誌。該文件系統的詳細定義屬於商業秘密[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擁有超過九個編號(FAT12、FAT16、FAT32 等等每個都有一個)。用於區分文件系統的算法當遇到代碼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 提供了事務 NTFS、NTFS 符號鏈接、收縮卷以及自我恢復功能,[12]但這些附加功能由操作系統提供,而非文件系統自身的功能。
值得注意的是,許多人會將 NTFS.sys 文件版本(如 Windows 2000 中引入的 NTFS v5.0)和 NTFS 磁盤格式版本(如 Windows XP 開始的 v5.1)相混淆。[13]NTFS v5.1 磁盤格式自從 Windows XP 開始就保持不變,也被隨後用於 Windows Server 2003、Windows Server 2008、Windows 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 能夠使用 LZNT1 算法(LZ77 算法的一種變種)壓縮文件。[27] )文件壓縮以 16 個簇為一個獨立區塊進行,也即如果簇大小為 4KB,則壓縮時的區塊大小為 64KB。如果壓縮可以將 64KB 數據壓縮到 60KB 或者更小,則 NTFS 會將多餘的 4KB 頁面視為稀疏文件簇,認為他們未經寫入。對此類簇的隨機訪問的性能是可以接受的,操作系統只需跟蹤碎片鏈接即可。但如果處理大型可壓縮文件,則會產生大量碎片,因為 NTFS 會將每個小於 64KB 的區塊都看成一個碎片區域。[28][29] 硬盤空間受限的單用戶系統可以使用 NTFS 壓縮在使用小文件(4KB 到 64KB,或者更大尺寸,具體範圍取決於壓縮比)時受益。小於 900 字節的文件將被直接存儲在 MFT 的目錄項中。[30]
閃存設備(如 |固態硬盤)沒有傳統硬盤的磁頭移動延遲,因此對此類設備,磁盤碎片的影響非常有限。具有快速多處理器系統的用戶可以通過壓縮應用程序文件和數據以提升速度並降低磁盤空間使用率。[31]請注意,使用 Sandforce 控制器的 SSD 本身也會壓縮數據,但由於傳輸的數據量變少,I/O 負載負載也會降低。
數據壓縮的最佳目標是內容具有重複性、很少寫入、通常順序訪問,並且尚未被壓縮過的文件。例如,日誌文件就是一種理想的壓縮目標。壓縮系統引導時需要使用的文件,如驅動程序、NTLDR、winload.exe,或者 BOOTMGR,會導致系統無法正確啟動。[32]不過在較新版本的 Windows 系統中,壓縮重要的系統文件操作會被直接禁止。
Files may be compressed or decompressed individually (via changing the advanced attributes) for a drive, directory, or directory tree, becoming a default for the files inside.
對於壓縮文件的讀寫絕大部分時候是|網絡的[33],但 Microsoft 建議避免對服務器系統或者通過網絡共享的遠程配置文件進行壓縮,因為這可能增加處理器的負擔。[34]Microsoft 建議不要壓縮超過 30MB 的文件,因為這可能會產生性能問題。[來源請求]由於壓縮文件會產生很多碎片,因此磁盤碎片整理過程通常需要花費更長時間。
計算機系統中最慢的設備通常不是 CPU 而是硬盤,因此 NTFS 壓縮通常可以更有效地利用慢速的非 RAM 存儲系統,節省空間和時間。[35] (前提是假設壓縮文件的碎片不會連續存放。)
如果一個程序(如下載管理器)無法將沒有內容的文件創建為稀疏文件,NTFS 壓縮也可以作為稀疏文件的替代技術[來源請求]
單實例存儲(SIS)
當若干個不同目錄中存有內容相同的文件時,單實例存儲允許將相同文件歸併到一個單一文件中,並創建對歸併後的文件的引用。單實例存儲包含一個用於管理複製、修改和歸併文件的文件系統過濾器和一個用於搜索需要歸併的相同文件的用戶空間服務(「groveler」)。單實例存儲的主要設計目標是遠程安裝服務器,這些服務器上往往擁有多個包含許多相同文件的安裝鏡像,單實例存儲可以將它們統一起來。但和硬鏈接不同,每個文件仍然是獨立的,更改任何一個副本都不會影響其它文件。和寫入時複製類似,該技術不會立即完成內存複製,直到某個副本被更改。[36]
加密文件系統(EFS)
加密文件系統(EFS)提供對 NTFS 卷上任意文件和文件夾的用戶透明的強保護。 加密文件系統與 EFS 服務、Microsoft 的加密應用程序接口(CryptoAPI)以及 EFS 文件運行時庫(FSRTL)聯合工作。 EFS 使用塊對稱密鑰(也被稱為「文件加密密鑰(FEK)」)加密文件,這比起使用非對稱密鑰加密在加密和解密大量數據時消耗的時間較少。該對稱密鑰使用一個和加密文件的用戶相關的公鑰加密文件,加密後的數據儲存在被加密文件的可選數據流中。當需要解密文件時,文件系統使用用戶的密鑰解密儲存在文件頭中的對稱密鑰,然後使用該對稱密鑰解密文件。這些操作在文件系統級別完成,因此對用戶來說是透明的。[37] 同時,為了處理用戶丟失密鑰的情況,加密文件系統中提供了對附加解密密鑰的支持,因此恢復代理在需要時仍然可以訪問數據。NTFS 提供的加密和壓縮功能是互相排斥的——NTFS 只能使用其中一種功能,另一種功能可以使用其它第三方工具完成。
EFS 在 Basic、Home 和 MediaCenter 版本的 Windows 上不受支持,必須安裝 Professional、Ultimate 或者服務器版本的 Windows,或者上使用 Windows 域中的企業部署工具來使用這項功能。
事務 NTFS
在 Windows Vista 中,應用程序可以使用事務 NTFS(Transactional NTFS)將一系列對文件的更改歸組到一個事務中。事務能夠確保所有更改要麼同時生效,要麼同時作廢,並能確保在事務提交完成前,外部應用程序無法獲知任何更改。[38]
該技術使用和卷影複製類似的技術,以確保被改寫的數據可以安全地回滾,通用日誌文件系統的日誌將記錄下尚未成功提交或者已經提交但尚未完全生效的事務,通常情況下這是因為事務的某個參與者在提交過程中系統意外崩潰引起的。
事務 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 可以通過一個用戶級驅動程序對文件和目錄進行有限的讀寫操作。[39]
- Tuxera NTFS: 高性能可讀寫上業內核驅動, 主要是針對嵌入式設備, 他還開發了開源的 NTFS-3G 驅動.
- 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 分區,會導致這些先前的版本產生丟失。[40]
其他
eComStation、KolibriOS,以及 Mac OS X 版本 10.3 及以後版本都提供對 NTFS 的只讀訪問支持(eComStation 有一個測試版本的驅動程序允許寫入/刪除操作,但通常認為該驅動程序還不安全)。BeOS 有一個基於 NTFS-3G 的的第三方工具,允許完整的 NTFS 讀寫操作。除了 Linux, NTFS-3G 也能工作在 Mac OS X、FreeBSD、NetBSD、Solaris 以及 Haiku 上。同時,也有一個稱為「NTFS4DOS」的商用驅動程序允許在 DOS 下進行讀寫。[41]Mac OS X 有一個商用的可讀寫的 NTFS 驅動程序,名稱為「Paragon NTFS for Mac OS X」。[42]
從其它文件系統轉換
Microsoft 當前提供了一個工具(convert.exe),可以將HPFS(僅 Windows NT 3)、FAT16 以及在 Windows2000 以上的 FAT32 卷轉換為 NTFS。[43]
調整大小
有許多第三方工具可以安全地重新調整 NTFS 分區的大小。在 Windows Vista 中,Microsoft 添加了收縮和擴展分區的功能,但該功能非常有限,因為該功能不會整理頁面文件碎片或標記為不可移動的文件,因此限制了對分區的收縮能力。取消頁面文件重新啟動或使用第三方的工具進行磁盤碎片整理可能能產生一定效果。
協調時間
由於歷史原因,所有不支持 NTFS 的 Windows 系統內部都將時間記錄為本地時區時間,因此當前版本的 Windows 支持其他所有版本的文件系統。而 Windows NT 及以此派生的系統使用通用協調時間(UTC)記錄內部時間戳,並在顯示時進行必要的轉換,也就是說,NTFS 是 UTC 時間。這意味着當在 NTFS 和非 NTFS 分區間移動或複製文件時,操作系統需要轉換時間戳。但如果被移動的部分文件使用了夏時制,而其他文件使用了標準時間,則轉換會導致不能確定結果。特別是當在本地時區時間更改的短暫時刻中,用戶可能會發現部分文件的時間戳錯開了一小時。由於夏時制在南北半球的實現不一致,可能會導致在任意 12 個月中產生最多 4 個小時的時間戳錯誤。[44]
內部實現
在 NTFS 中,所有文件數據——文件名、創建日期、訪問權限,以及內容——都作為元數據儲存在主文件表中。這種抽象的實現方式使得隨着 Windows NT 的發展而添加文件系統功能變得非常容易。一個很典型的例子是為使用 Active Directory(活動目錄)的應用程序添加用於索引的字段。
NTFS 允許為名稱編碼(包括文件名稱、流名稱、索引名稱等)使用任意序列的 16 位值。這意味着支持 UTF-16 碼位,但文件系統不會檢查某個 UTF-16 序列是否有效(也即允許任意短整數序列,不受 Unicode 標準的限制)。
在內部,NTFS 使用 B+樹索引文件系統數據。儘管該方式實現較為複雜,但能夠在大多數情況下提高文件的查找速度。文件系統日誌用於確保文件的元數據完整,而不是孤立的文件內容。相比於使用 FAT 的文件系統,使用 NTFS 的文件系統能夠提高可靠性。[45]
主文件表(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 | 卷引導記錄,該文件位於卷的第一個簇,其中包含引導代碼(用於定位並啟動 NTLDR/BOOTMGR)、一個 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 記錄,某些流類型是必須的,除非是一個用空流類型表示的未使用記錄。
- 某些流類型不能包含名稱,必須是匿名的。
- 這裡指的是標準屬性、 NTFS 的「文件名」流類型,以及「短文件名」流類型(這個流並不一定出現,通常是為了兼容 DOS 風格的應用程序)。有些時候文件也可能只包含短文件名,這時候短文件名就會變成 Windows 資源管理器中顯示的文件名。
- 流存儲區中存儲的文件名流並不會使得文件能夠馬上在分層的文件系統中出現。事實上,所有文件名必須在同一卷的至少一個獨立目錄中被索引,在目錄中的文件信息擁有獨立於文件本身的 MFT 項、自己的安全描述符、屬性表,以及對文件所在的 MFT 項編號的引用。因此,這種方式也可以讓同一個文件或者目錄在一個卷的多個目錄中中被「硬鏈接」多次,並且可以具有不同的名稱。
- 一個常規文件的默認數據流的流類型為 $DATA,但沒有流名稱。可選數據流使用同樣的類型,但必須具有名稱。
- 與此相反的,目錄的默認數據流具有不同的類型,但不是匿名的:他們使用流名稱(如在 NTFS 3 以上版本中為「$I30」)來指示索引的格式。
對任意文件的所有流,可以使用 nfi.exe—「NTFS 文件扇區信息實用工具」進行查看,該文件包含在 Microsoft OEM Support Tools 中,可以免費發布。[46]
常駐文件和非常駐文件
為了優化通常情況下小數據文件的存儲並降低 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 字符的的路徑[47]。每個路徑組成部分(目錄或文件名)最多可以有 255 個字符[47]長,但不允許使用某些特定名稱,因為 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 個字符[47]。相對路徑被限制在 255 個字符。
- 日期範圍
- NTFS 使用和 Windows NT 相同的計算方式:64 位時間戳,允許範圍從 1601年1月到 60056年5月28日,分辨率是每秒鐘一百萬個計數單位。
開發者
NTFS 開發者包括:
- Tom Miller
- Gary Kimura
- Brian Andrew
- David Goebel
另請參閱
- 文件系統比較
- Files-11 — ODS-2 非常類似於 NTFS(如相比較於
INDEXF.SYS
和$Mft
,BITMAP.SYS
和$Bitmap
) - HPFS,為 OS/2 操作系統開發的文件系統
- ntfsresize
- Samba(軟件)
參考文獻
- ^ 1.0 1.1 1.2 1.3 1.4 Mark Russinovich. Inside Win2K NTFS, Part 1. Microsoft Developer Network. [2008-04-18].
- ^ 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.0 3.1 Richard Russon and Yuval Fledel. NTFS Documentation. [2007-07-01].
- ^ Custer, Helen. Inside the Windows NT File System. Microsoft Press. 1994. ISBN 978-1-55615-660-1.
- ^ File Systems Unraveled: New Technolgy File Systems. How-To Guides. pcnineoneone: 3. [2008-06-17].
- ^ Chris Quirke. NTFS vs. FAT32. May 2004 [2008-06-17].
- ^ 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].
- ^ Inside Windows NT Disk Defragmenting. Microsoft Technet. Microsoft. March 3,2007 [2008-09-17].
- ^ Paul Thurrott. NTFS Licensee Reports Microsoft Threat, Apology. Windows IT Pro. February 2001 [2008-06-17].
- ^ Kozierok, Charles M. Overview and History of NTFS. PCGuide. April 17, 2001.
- ^ Recovering Windows NT After a Boot Failure on an NTFS Drive. Microsoft. November 1, 2006.
- ^ Loveall, John. Storage improvements in Windows Vista and Windows Server 2008 (PowerPoint). Microsoft Corporation: 14–20. 2006 [2007-09-04].
- ^ New Capabilities and Features of the NTFS 3.1. Microsoft. December 1, 2007.
- ^ 引用錯誤:沒有為名為
Inside Win2K NTFS, Part 1
的參考文獻提供內容 - ^ Change Journals (Windows). MSDN. [2010-04-16].
- ^ Creating, Modifying, and Deleting a Change Journal (Windows). MSDN. [2010-04-16].
- ^ MS Windows NT Workstation 4.0 Resource Guide, "POSIX Compatibility"
- ^ MSDN
- ^ Malware utilising Alternate Data Streams?, AusCERT Web Log, 21 August 2007
- ^ Sysinternals Streams v1.56
- ^
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 資源管理器可能會警告用戶
- ^ 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
- ^ Sparse Files. MSDN Platform SDK: File Systems. [2005-05-22].
- ^ Sparse FIles and Disk Quotas. Win32 and COM Development: File Systems. [2007-12-05].
- ^ Symbolic Links (Windows). MSDN.
- ^ John Saville, "What is Native Structured Storage?"
- ^ File Compression and Decompression. MSDN Platform SDK: File Systems. [2005-08-18].
- ^ Understanding NTFS Compression. [2011-03-16].
- ^ Shrinking the gap: carving NTFS-compressed files. [2011-05-29].
- ^ How NTFS Works. 2003-03-28 [2011-10-24].
- ^ Should You Compress Data On Your SSD?. 2011-12-01 [2013-04-05].
- ^ Disk Concepts and Troubleshooting. Microsoft. [2012-03-26].
- ^ Read-Only Filegroups and Compression. SQL Server 2008 Books Online (November 2009). [2010-04-20].
- ^ "Best practices for NTFS compression in Windows." Microsoft Knowledge Base. Retrieved on 2005-08-18.
- ^ Daily, Sean. Optimizing Disks. IDG books. January 1998 [2007-12-17].
- ^ Single Instance Storage in Windows 2000 (PDF). Microsoft Research and Balder Technology Group.
- ^ How EFS Works, Microsoft Windows 2000 Resource Kit
- ^ Transactional NTFS. MSDN. [2007-02-02].
- ^ "ntfsmount wiki page on linux-ntfs.org"
- ^ 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].
- ^ Recovery information
- ^ Paragon NTFS for MAC OS X - full read and write access to Windows NTFS partitions under Mac OS X
- ^ How to Convert FAT Disks to NTFS. Microsoft Corporation. 2001-10-25 [2007-08-27].
- ^ "Beating the Daylight Savings Time bug and getting correct file modification times" The Code Project
- ^ "Microsoft TechNet Resource Kit"
- ^
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
- ^ 47.0 47.1 47.2 更精確地說,32767 表示 255個 UTF-16 編碼字。某些特殊的 Unicode 字符可能需要兩個字的空間
- Bolosky, William J.; Corbin, Scott; Goebel, David; & Douceur, John R. Single Instance Storage in Windows 2000 (PDF). Microsoft Research & Balder Technology Group, Inc. date.
- Custer, Helen. Inside the Windows NT File System. Microsoft Press. 1994. ISBN 978-1-55615-660-1.
- Nagar, Rajeev. Windows NT File System Internals: A Developer's Guide. O'Reilly. 1997. ISBN 978-1-56592-249-5.
外部連結
- 文獻:
- Low-level description of NTFS disk structures from the Linux-NTFS project
- NTFS.com – documentation and resources for NTFS
- Microsoft NTFS Technical Reference
- 實現技術:
- 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