Ntfs

**NTFS**（英語：**New Technology File System**），是 Microsoft 公司開發的專用檔案系統，從 Windows NT 3.1 開始成為 Windows NT 家族的預設檔案系統。

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 版本有五個：

`NTFS.sys` 的檔案版本號（例如在 Windows 2000 裡面是 v5.0）是基於作業系統版本號的，不該與 NTFS 版本號（例如 Windows XP 裡面是 v3.1）混淆。

後續的 Windows 的版本更新增加了許多檔案系統相關的功能，但並沒有改變 NTFS 本身。例如 Windows Vista 增加了 NTFS 符號連結、事務 NTFS、磁碟收縮和自我修復，但除了符號連結外其他功能其實都由作業系統實現。

## 功能

相對於之前的版本，NTFS v3.0 包含若干新功能：磁碟使用限額、稀疏檔案支援、重解析點、分布連結跟蹤，以及檔案級加密（即「加密檔案系統（EFS）」）。

### 可伸縮性

理論上，NTFS 卷的最大容量為 264-1 簇。在 Windows XP 專業版中，由於分割區表限制，實際實現的最大容量為 232-1 簇。例如，在當簇的從大小為 64 KiB 時，Windows XP 的 NTFS 卷的最大容量為 256 TiB 減去 64 KiB；而當簇大小為預設的 4 KiB 時，卷最大容量將變為 16 TiB 減去 4 KiB（但這都超過了 Windows XP SP1 對磁碟容量的 128 GiB 限制）。由於主開機紀錄（MBR）分割區表最大支援單個分割區容量為 2 TiB，因此如果要建立超過 2 TiB 的 NTFS 卷，必須要使用動態卷或者 GPT 卷。注意：微軟預設的引導程式必須使用 UEFI 和 64 位元作業系統才能從 GPT 卷引導系統。

### 紀錄檔

NTFS 是一個紀錄檔檔案系統，使用 NTFS 紀錄檔（$Logfile）記錄卷更改元資料。這是 NTFS 一個非常關鍵的功能（FAT/FAT32 不提供此項功能），可確保其內部的複雜資料結構（如比較重要的如卷分配圖、磁碟重組 API 產生的資料轉移操作、MFT（主檔案表）記錄的更改情況（包括移動 MFT 記錄中儲存的變長屬性和屬性表等））和索引（在目錄和安全描述符中使用）即使在系統崩潰後仍然能保證一致性，而當在卷被重新載入後，可以非常容易地回滾這些關鍵資料的意外修改。

USN 紀錄檔是一項系統管理功能，用於記錄卷中所有檔案、資料流、目錄的內容、屬性以及各項安全設定的更改情況。應用程式可以利用紀錄檔追蹤卷的更改。對於非系統卷，可以選擇打開或關閉紀錄檔。當添加一個新卷後，預設情況下紀錄檔功能處於打開狀態。

### 硬連結

硬連結可用於將不同的檔名直接關聯到同樣的檔案內容。

硬連結類似於目錄連接，但必須參照到檔案。硬連結只能連接到同一個卷內的檔案，因為每個卷擁有自己的主檔案表（MFT）。硬連結有自己的元資料，因此如果更改某個硬連結的檔案大小或尺寸，其他硬連結在被打開前可能不會自動更新這些資訊。

硬連結原本用於支援 Windows NT 的 POSIX 子系統。

Windows 使用硬連結實現對 8.3 檔名的支援。作業系統需要該功能，因為有些古老的應用程式只能使用短檔名。NTFS 將會為檔案和目錄建立額外的 NTFS 記錄，但他們將總是自動同步更新（常規硬連結並不會同步更新）。

NTFS 檔案系統限制單個檔案只能關聯到 1024 個硬連結。

### 可選資料流（ADS）

可選資料流使單個檔案可以關聯到多個資料流。NTFS 資料流的表述方式為「檔名：流名」，例如「text.txt:extrastream」。

NTFS 流從 Windows NT 3.1 開始被引入，起初設計目的是為了 Services for Macintosh（SFM）能夠正確儲存 Macintosh 的資源分岔。現在的 Windows 伺服器已經不再包含此功能，但很多第三方的 Apple 歸檔服務（AFP）產品（例如 Group Logic 的 ExtremeZ-IP）仍然會繼續使用可選資料流。Internet Explorer 和其它一些瀏覽器會在從網路上下載的檔案中添加一個非常小的可選資料流，用於標記它們來自於外部網站（表示可能會存在安全風險），使用者在打開這些檔案前系統將會顯示一個確認提示。當使用者表示不希望再次看到這個確認對話方塊的時候，這個可選流將會從下載的檔案中被直接刪除。

可選資料流不會顯示在 Windows 檔案總管中，也不會算入檢視檔案屬性時顯示的檔案大小。如果將檔案複製到 FAT 格式的磁碟、附加到電子郵件、上傳到網站，或者移動到任何其它不支援可選流的位置上時，則只有主資料流會被保留下來，其它可選流將被全部丟棄，因此使用可選流來儲存重要資料很可能會發生意外。Microsoft 提供了一個叫作 Streams 的工具，使用者可以使用這個工具檢視卷中的可選流。從 Windows Powershell 3.0 版本開始，以下 cmdlet 支援對可選資料流進行操作：Add-Content、Clear-Content、Get-Item、Out-String、Remove-Item，以及 Set-Item。

有些媒體播放器也嘗試使用可選資料流記錄多媒體檔案的自訂元資料，用於管理媒體檔案。MPEG、OGG 等格式通常在檔案內簽入資訊標籤記錄媒體資訊，但不是所有格式都支援這種設計，而使用可選資料流的好處正是他不會影響檔案本身的內容。在 Windows 中註冊外殼擴充程式後，系統就可以解析這些資料，然後可以在 Windows 檔案總管的資訊欄中顯示它們。但大部分媒體播放器還是選擇使用獨立資料庫而非可選資料流來儲存這些資訊，因為可選資料流可能帶來一些其它問題，一個典型問題是檔案上的資訊對於所有使用者都可見並且是共享的，因此使用可選資料流將無法根據不同使用者的安全設定和喜好進行分別管理和保護。

一些惡意軟體會使用可選資料流來隱藏程式碼，不過不少惡意軟體掃描程式和特殊工具現在已經能夠檢查可選資料流中的內容。

### 檔案壓縮

NTFS 能夠使用 LZNT1 演算法（LZ77 演算法的一種變種）壓縮檔案。檔案壓縮以 16 個簇為一個區塊進行，也即如果簇大小為 4KB，則壓縮時單個區塊的大小為 64KB。NTFS 壓縮演算法支援的最大簇大小為 4KB，如果簇大小超過 4KB，則壓縮功能將不可用。 如果壓縮可以將 64KB 資料壓縮到 60KB 或者更小，則 NTFS 會將多餘的 4KB 頁面視為稀疏檔案簇，認為他們未經寫入。對此類簇的隨機存取的效能是可以接受的，作業系統只需跟蹤碎片連結即可。但如果處理大型可壓縮檔案，則會產生大量碎片，因為 NTFS 會將每個小於 64KB 的區塊都看成一個碎片區域。微軟 NTFS 開發團隊的研究表明，在簇大小為 4KB（預設設定）時，NTFS 卷上壓縮檔案的合理最大尺寸應當在 50-60GB 之間。當簇大小更小時，最大尺寸也會減小。硬碟空間受限的單使用者系統可以使用 NTFS 壓縮在處理小檔案（4KB 到 64KB，或者更大尺寸，具體範圍取決於壓縮比）時受益。小於 900 位元組的檔案將被直接儲存在 MFT 的目錄項中。

快閃記憶體裝置（如固態硬碟）沒有傳統硬碟的磁頭移動延遲，因此對此類裝置，磁碟碎片的影響非常有限。具有快速多處理器系統的使用者可以通過壓縮應用程式檔案和資料以提升速度並降低磁碟空間使用率。請注意，使用 Sandforce 控制器的 SSD 本身也會壓縮資料，但檔案系統壓縮會導致傳輸的資料量變少，因此 I/O 負載會降低。

資料壓縮的最佳目標是內容具有重複性、很少寫入、通常順序存取，並且尚未被壓縮過的檔案。例如，紀錄檔檔案就是一種理想的壓縮目標。

壓縮系統引導時需要使用的檔案，如驅動程式、NTLDR、winload.exe，或者 BOOTMGR，會導致系統無法正確啟動。不過在較新版本的 Windows 系統中，重要的系統檔案會被禁止壓縮。

當在驅動器或目錄的「進階設定」中更改「將檔案進行壓縮」的設定時，每個檔案將被獨立進行壓縮或者解壓縮。

對於壓縮檔案的讀寫絕大部分時候是透明的，但 Microsoft 建議避免對伺服器系統或者通過網路共享的遠端設定檔進行壓縮，因為這可能增加處理器的負擔。Microsoft 建議不要壓縮超過 30MB 的檔案，因為這可能會產生效能問題。由於壓縮檔案會產生很多碎片，因此磁碟重組過程通常需要花費更長時間。

電腦系統中最慢的裝置通常不是 CPU 而是硬碟，因此 NTFS 壓縮通常可以更有效地利用慢速的非 RAM 儲存系統，節省空間和時間（前提是假設壓縮檔案的碎片不會連續存放）
。

### 稀疏檔案

稀疏檔案是包含稀疏資料集的檔案，稀疏檔案只儲存檔案中各個有意義的片段，而片段之間的空白將被忽略，這種設計特別適合實際資料非常少、大部分割區域空白的檔案。讀取檔案時，對任何被忽略的位置，檔案系統程式都會返回資料 0，因此檔案內容看起來幾乎全是零。很多資料庫和科學程式使用稀疏檔案。Microsoft 實現對稀疏檔案的高效儲存支援，允許應用程式指定檔案的空（零）資料區域。讀取稀疏檔案的應用程式不需要做單獨處理，可以繼續使用常規方法讀取資料，作業系統將根據讀取的位置決定返回零或者實際資料。和壓縮檔案類似，磁碟限額對稀疏檔案的尺寸判斷以聲明大小而非實際占用大小為準。

### 卷影複製

卷影複製（VSC）服務通過將新覆寫的資料複製到卷影（寫入時複製）來儲存 NTFS 卷上的檔案和資料夾的歷史版本。當使用者請求恢復檔案的早期版本時，舊的檔案資料將會覆蓋新資料。該功能也使得資料備份程式可以存檔當前系統正在使用的檔案。對於負載較重的系統，Microsoft 建議將卷影副本設定到單獨的磁碟上，以減小系統主要卷的 I/O 負載。

Windows Vista 通過持久卷影副本實現系統還原和先前的版本功能。但舊版本的作業系統載入 NTFS 卷時，由於其無法辨識持久卷影副本的資料格式，這些副本將被刪除。

### 事務

在 Windows Vista 中，應用程式可以使用事務 NTFS（Transactional NTFS，TxF）將一系列對檔案的更改歸組到一個事務中。事務能夠確保所有更改要麼同時生效，要麼同時作廢，並能確保在事務提交完成前，其它應用程式無法無法檢測到其中的更改。

該技術使用和卷影複製類似的技術（也即寫入時複製）以確保在事務不成功時，被覆寫的資料可以安全地回滾。通用紀錄檔檔案系統的紀錄檔將記錄下尚未成功提交或者已經提交但尚未完全生效的事務（常見原因是事務的某個參與者在提交過程中系統意外崩潰）。

事務 NTFS 並不要求事務是本機 NTFS 卷的檔案操作，可以包含在其它位置的任意事務資料或操作，例如對其它卷、本地登錄檔、SQL 資料庫中、系統服務或者遠端服務中的事務修改。所有這些事務使用 Windows 系統中的「分布事務協調器（DTC）」服務在網路級別協調所有參與者，以確保所有參與者都能接收到同樣的提交狀態，並傳輸所有經過確認的更改。分散式 NTFS 事務的一個典型例子是可以以事務方式建立一個網路級別的分散式檔案系統，並且每個客戶端都保留每個檔案的準確的離線快取。

### 安全

在 NTFS 中，每個檔案或資料夾具有一個安全描述符，用於說明其所有者，並包含兩個安全控制列表（ACL）。

第一個列表被稱為自主存取控制列表（DACL），用於描述是否允許或禁止特定的使用者或使用者群組進行特定的操作（如讀取、寫入、執行或刪除）。例如，「C:\Program Files」資料夾可能被設定為允許所有使用者讀取並執行，但只有具有管理員權限的使用者才能修改其內容。Windows Vista 為 DACL 增加了強制存取控制功能。DACL 是 Windows Vista 及後續作業系統的使用者帳戶控制功能的主要檢查點。

第二個列表被稱為系統存取控制列表（SACL），用於描述對檔案或資料夾的特定行為是否應當被稽核，以及在操作成功後是否應當記錄操作。例如，企業可能會對高度敏感的檔案開啟稽核功能，這樣管理員就可以了解到是否有人嘗試刪除或複製這些檔案，以及他們的操作是否成功完成。

### 加密

加密檔案系統（EFS）提供對 NTFS 卷上任意檔案和資料夾的使用者透明的強保護。加密檔案系統需要與 EFS 服務、Microsoft 的加密應用程式介面（CryptoAPI）以及 EFS 檔案執行時庫（FSRTL）聯合工作。

EFS 使用對稱金鑰（也被稱為「檔案加密金鑰（FEK）」）加密檔案，這比起使用非對稱金鑰加密在加密和解密大量資料時消耗的時間較少。該對稱金鑰使用一個和請求加密檔案的使用者相關的公鑰加密檔案的內容，加密後的資料儲存在被加密檔案的可選資料流中。當需要解密檔案時，檔案系統使用使用者的金鑰解密儲存在檔案頭中的對稱金鑰，然後使用該對稱金鑰解密檔案。這些操作在檔案系統級別完成，因此對使用者來說是透明的。為了處理使用者遺失金鑰的情況，加密檔案系統中還支援多個附加解密金鑰，因此除使用者外，授權過的恢復代理也能存取資料。NTFS 提供的加密和壓縮功能是互相排斥的 —— 如果同時希望加密和壓縮，則 NTFS 檔案系統級別只能打開其中一種功能，另一種功能需要使用其它第三方工具完成。

Basic、Home 和 MediaCenter 版本的 Windows 上不支援 EFS 功能。要使用這個功能，必須安裝 Professional、Ultimate 或者伺服器版本的 Windows，或者使用 Windows 域中的企業部署工具進行部署。

### 限額

磁碟限額是 NTFS v3 開始提供的功能。此功能允許電腦管理員在受支援的 Windows 作業系統上為每個使用者分別設定允許使用的磁碟空間閾值，或者跟蹤檢視每個使用者使用的磁碟空間使用量。管理員可以設定當某個使用者使用特定量的磁碟空間後收到「磁碟空間超限」的警告，甚至拒絕他們繼續占用更多空間。如果有檔案或者目錄使用 NTFS 檔案壓縮，則磁碟限額管理的尺寸以壓縮後的實際尺寸為準。如果應用程式通過作業系統介面查詢使用者可用的剩餘磁碟空間大小，開啟限額後程式得到的大小將是在限額範圍內的剩餘空間，而不再是磁碟的總剩餘空間。

Basic、Home 和 MediaCenter 版本的 Windows 不支援磁碟限額功能。要使用這個功能，必須安裝 Professional、Ultimate 或者伺服器版本的 Windows，或者使用 Windows 域中的企業部署工具進行部署。

### 重解析點

該功能從 NTFS v3 開始可用。該功能可以在使用者空間中為檔案或目錄添加一個關聯的重解析點屬性。當物件管理器（請參見 Windows NT 線執行）解析檔案系統名稱並遇到重解析點屬性時，它將「重新解析」名稱，具體做法是：Windows 會將需要重解析的名稱傳遞給已經載入的所有檔案過濾驅動程式，每個過濾驅動程式都會檢查重解析資料並判斷自己是否和該重解析點相關聯。如果某個過濾驅動程式判定自己匹配該重解析點，則它將攔截這次檔案系統呼叫，然後執行對應的特定功能。重解析點是實現卷載入點、目錄連接、分層儲存管理、本機結構儲存，以及單實例儲存等功能的基礎。

### 卷載入點

類似於 Unix 載入點，可以將一個卷的根目錄附加到另一個檔案系統的某個目錄下。這項功能可以讓驅動器不需要單獨的卷標（如 C:或 D:）就可以被存取。

當卷被載入到另一個卷的某個目錄時，該目錄原來的內容將無法存取，而被新載入的卷中的內容所代替。被載入的卷仍然可以繼續擁有獨立的卷標。NTFS 檔案系統不允許卷之間相互載入。卷載入點可以是永久的，也可以是非永久的。前者在系統重新啟動後會自動載入，而後者需要手動重新載入。

被載入的卷可以使用 NTFS 外的其它檔案系統。一個常見的例子是，被載入的卷一個遠端共享的目錄，該目錄擁有自己的權限設定，並且能夠根據實際檔案系統的策略為當前作業系統設定特定的存取權限。

### 目錄連接

類似於卷載入點，但目錄連接的連接目標是檔案系統中的某個其它目錄。例如，目錄 `C:\exampledir` 帶有一個目錄連接屬性，連接到 `D:\linkeddir`。當使用者級別的應用程式存取時，NTFS 將自動把所有參照重新導向到 `D:\linkeddir`。目錄連接功能在概念上類似於 Unix 的目錄符號連結，但符號連結可以連接到任何目標，而 NTFS 目錄連接只允許連接到目錄。

目錄連接可以在控制台中通過命令 MKLINK /J 連接名目標目錄建立，使用 RMDIR 連接名刪除。目錄連接是永久性的，如果在客戶端存取伺服器的目錄連接，則作業系統會使用被連結的目錄所屬的系統（或域）的安全設定。但連接本身可能擁有獨立的安全設定，並且刪除一個目錄連接不會同時刪除目標目錄。

有些目錄連接是 Windows Vista 系統建立的，用於保持和早期版本的 Windows 的相容性，例如系統驅動器中的 Documents and Settings 資料夾會被連接到同一個卷中的 Users 物理目錄上。這些目錄預設情況下是隱藏的，並且進行相關的安全設定，因此 Windows 檔案總管不允許外殼或者大部分應用程式直接打開它們，這樣的設定可能是為了防止使用者發現兩個看上去相同的資料夾，然後錯誤地刪除其中的某一個。預設情況下只有本機的 SYSTEM 帳戶或者的 Administrators 使用者群組成員可以存取這些目錄，這是考慮到這些帳戶安裝軟體的權限，而安裝時可能會產生相容性問題。

目錄連接屬於軟連結（即使目標目錄已經被刪除，他們也仍然存在），使用一種類似符號連結的方式工作（只不過對於目標位置和類型有額外的限制），但 NTFS 檔案系統對它們進行特殊最佳化，解析更快，相比於之後提出的 NTFS 符號連結，目錄連接的開銷更小，且可以在伺服器端解析，因此可以在遠端共享目錄中使用它們。

### 符號連結

符號連結（或稱軟連結）從 Windows Vista 開始引入。符號連結在客戶端解析，因此如果伺服器上共享一個符號連結，則客戶端存取時將服從本機而非伺服器端的存取限制。

符號連結可以連結到檔案（使用 MKLINK 符號連結目的檔名建立），也可以連結到目錄（使用 MKLINK /D 符號連結目標目錄建立）。和 Unix 符號連結不同的一點是，NTFS 符號連結在建立的時候就要決定目標類型（目錄或檔案），但建立符號連結的時候並不需要目標已經存在或可以存取，在存取時才會實際檢查可存取性。NTFS 在存取符號連結時也會檢查目標的類型，由於 NTFS 不允許在任何位置有目錄和檔案同名，因此如果目標名稱存在但是類型不正確，系統也會返回一個找不到目標的錯誤。

符號連結也可以參照遠端主機上的共享資料夾或者其中的檔案、子資料夾。但目標並不會被立即載入，而是在應用程式使用 OpenFile () 或者 CreateFile () API 請求打開目標的時候才載入到系統中。符號連結是永久的（重新啟動後仍然保留在對應的卷上），可以在命令列或者指令碼中使用 DEL 符號連結刪除它們。

### 分層儲存管理（HSM）

分層儲存管理是一種轉移一定時間不用的檔案到價值更低的儲存媒介中的方法。當檔案再次被存取時，檔案上的重解析點將判定檔案需要被使用，並將檔案從儲存媒介中恢復出來。分層儲存不但可以節省儲存開銷，也可以提高作業系統的資料讀寫和執行效率。

### 本機結構儲存（NSS）

本機結構儲存是一種已經被 Microsoft 終止使用的 ActiveX 文件儲存技術。這項技術允許 ActiveX 文件使用和 ActiveX 內部的多流格式相同的方式進行儲存。作業系統會載入一個 NSS 檔案過濾驅動程式，可以在應用程式使用檔案時透明地處理多流格式。當 NSS 檔案被傳輸到非 NTFS 格式的磁碟卷上時，檔案內部的多個流將被合併轉換為一個流。

### 分布連結跟蹤（DLT）

分布連結跟蹤功能允許應用程式跟蹤被重新命名或者移動到同一電腦、域或工作群組的其它卷中的檔案、捷徑和 OLE 連結。跟蹤功能由一個系統服務提供，使用儲存在元檔案中的物件識別碼（OID）索引實現。當應用程式請求跟蹤某個檔案或目錄後，跟蹤服務將會建立物件的 OID 項並指向目標。在一個 NTFS v3 上執行檔案重新命名、複製或移動操作時，也會同時複製物件的 OID，這樣跟蹤服務就可以有效地尋找到目標。

### 單實例儲存（SIS）

當若干個不同目錄中存有內容相同的檔案時，單實例儲存允許將相同檔案合併到一個單一檔案中，並將所有檔案參照到實際的檔案上。單實例儲存功能包含一個用於管理複製、修改和合併檔案的檔案系統過濾器和一個用於搜尋需要合併的相同檔案的使用者空間服務（「groveler」）。單實例儲存提出時的主要針對目標是遠端安裝伺服器，這些伺服器上往往擁有若干個包含大量相同檔案的安裝鏡像，單實例儲存可以將它們統一起來，因而節省需要占用的總尺寸。和硬連結不同的一點是，在 SIS 下，每個檔案在邏輯上仍然是獨立的，更改被合併為單個檔案的任意其中一個檔案都不會影響其它檔案，而是會取消對該檔案的合併並產生一個新的副本。不過新檔案不會立即寫入到硬碟，NTFS 使用類似於寫入時複製的技術，在檔案最終需要儲存時才執行複製。

## 內部實現

在內部，NTFS 使用 B + 樹索引檔案系統資料。這種資料結構的方式實現比較複雜，但能夠在大多數情況下提高檔案的尋找速度。檔案系統紀錄檔用於確保檔案的元資料完整，不存在孤立的檔案內容。相比於 FAT 檔案系統，NTFS 檔案系統的可靠性更高。

NTFS 允許對名稱（包括檔案名稱、流名稱、索引名稱等）使用除了 0x0000 以外的任意 16 位元值序列進行編碼。這意味著支援 NTFS 支援 UTF-16 碼位，但檔案系統並不會檢查某個 UTF-16 序列是否有效（也即允許 NTFS 內部任意 16 位元整數序列，不受 Unicode 標準的限制）。

###  分割區引導磁區

作業系統首先通過 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 的要求、跟蹤壞磁區單元，以及儲存安全資訊和磁碟空間使用情況等等多種不同需求提供支援。

Windows 對這些元檔案的處理方式較為特殊，直接由 NTFS.SYS 進行處理，因此難以直接檢視，需要使用特殊工具進行提取。從 Windows 7 開始，NTFS 驅動程式完全阻擋了使用者存取權限，任何嘗試存取元檔案的請求都會直接進入藍白當機介面。微軟「OEM 支援工具」中的「nfi.exe（NTFS 檔案磁區資訊實用工具）」是一個可檢視這些檔案的工具 l.liru，要檢視「$MFT」的內容，只需使用下列命令列：`nfi.exe c:\$MFT`。另一個繞過作業系統保護限制的方法是使用 7-Zip 檔案管理器工具並輸入低階 NTFS 路徑 `\\.x:\`，此時將會出現三個新的資料夾：`$extend`、`$[DELETED]` 以及 `[SYSTEM]`。這個操作可以用於任何抽取式裝置，但如果需要存取當前活動分割區，則需要進入離線模式（也即 WinRE）。

### 從 MFT 到屬性、屬性表和流

對於每個 MFT 記錄所描述的檔案或目錄，都有一個線性存放的流描述符（也即_屬性_）儲存區，被打包後存放在一個變長記錄（也即_屬性表_）中，然後使用額外的填充符填充以滿足 MFT 記錄的 1Kib 對齊要求。這部分資料完整地描述了和檔案相關聯的所有資料流。注意此處的「流」和檔案資料流不是一個概念，而是所有資料資訊的統稱。

每個流（或稱_屬性_）本身包含如下資料：類型（內部通常儲存為一個固定長度的整數或者一個描述符，但通常開發應用程式開發時呼叫 FileOpen() 或者 FileCreate() API 時會使用等效的識別碼來代表它）、流名稱（可選，注意和檔名沒有任何關係），以及資料（可選，但大部分流具有資料）。對於 NTFS 而言，檔案的主資料（也即檔案內容）、目錄的索引資訊、檔案的可選資料流、以及檔案的所有屬性，處理方式都是完全相同的，他們都是屬性表中的某個屬性而已。

* 對於每個 MFT 中描述的檔案（或非常駐的流描述符儲存區，此概念請參考下文），每種流描述符（使用流類型 + 流名稱聯合區分）必須唯一。此外，NTFS 還對於描述符有一些用於排序的約束要求。
* NTFS 預定義了一種稱為「空流」的類型，用於在流儲存區中表明流描述符的結尾。空流必須是每個儲存區中的最後一個流描述符，所有之後的剩餘空間都將被忽略，只包含填充位元組（用於滿足 MFT 的記錄尺寸要求或者非常駐流儲存區的簇尺寸要求）。
* 對於每個 MFT 記錄，某些類型的流必須存在，例外是整個記錄只有一個空流表示該記錄未使用。
  * 這裡的「某些」具體指的是包含時間戳和其它單位元（Bit）的屬性的「標準屬性」，這種屬性的長度和格式是固定的，這是為了相容 DOS 或者 Windows 95/98 管理的 FAT/FAT32 檔案。
* 某些類型的流不能包含名稱，必須是匿名的。
  * 這裡的「某些」包括標準屬性、NTFS 的「檔名」流，以及「短檔名」流（注意如果該檔案無需考慮對 DOS 應用程式的相容性，則「短檔名」流並不一定出現）。有些時候檔案也可能只包含「短檔名」而沒有「檔名」，這時候短檔名會代替檔名顯示在檔案總管的「檔名」一欄中。
  * 即使流儲存區中包含有「檔名」流，也並不表示檔案一定會出現在檔案系統中。要顯示檔案，該專案還必須要進入卷上的某個目錄的索引表。注意目錄的索引表中除了記錄該檔案的 MFT 記錄編號外，也對檔案單獨提供一份 MFT 記錄、安全描述符、屬性表等，因此理論上單個檔案可以被多個目錄「硬連結」多次，並且在每個目錄中顯示為不同的名稱。
* 表示檔案資料的預設資料流的流類型為 $DATA，該資料流沒有名稱。可選資料流使用同樣的流類型，但必須具有流名稱。
* 目錄的預設資料流和檔案的情況不同，目錄的資料流（存放檔案的索引表）不是匿名的，NTFS 會通過目錄的資料流的名稱（如在 NTFS 3 以上版本中為「$I30」）來表明目錄索引的格式。

可以使用 nfi.exe（NTFS 檔案磁區資訊實用工具）檢視任意檔案或者目錄的資料流，這個實用工具目前包含在 Microsoft OEM Support Tools 中，可以免費發布。

### 常駐檔案和非常駐檔案

為了最佳化小資料檔案的資源占用並降低 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（軟體）

## 參考文獻

## 外部連結

* 文獻：
  * 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