NTFS，是 Microsoft 公司開發的專用檔案系統，從 Windows NT 31 開始成為 Windows NT 家族的預設檔案系統。它提供了一整套功能，包括安全描述符、加密、磁碟配額和豐富的元資料。 它可以和群集共享卷 CSV 一起使用，以提供可以從故障轉移群集的多個節點同時訪問的連續可用卷。 NTFS 取代 FAT（檔案分配表）和 HPFS（高效能檔案系統）並進行一系列改進成為更加完善的安全系統，例如增強對元資料的支援，使用更高階的資料結構以提升效能、可靠性和磁碟空間利用率，並附帶一系列增強功能，如訪問控制表（ACL）和檔案系統日誌。 其他桌上型電腦和伺服器作業系統也支援 NTFS。Linux 和 windows 提供程式碼的軟體 NTFSsystem，可用於讀寫 NTFS 檔案。Mac OS X 核心不能對 NTFS 進行寫入操作。 歷史 20 世紀 80 年代中期，微軟（Microsoft）和 IBM 合作，希望建立下一代的圖形作業系統。該專案的成果為 OS2，但由於微軟和 IBM 在很多重要問題上無法達成共識，最後合作被終止，目前 OS2 至今仍屬於 IBM，而 Microsoft 從此後開始研究 Windows NT。 OS2 的檔案系統 HPFS 包含許多重要功能，當 Microsoft 開始建立他們自己的新作業系統時，NTFS 檔案系統的很多功能正是從 HPFS 中借鑑改善的。可能正是因為他們來自於同一個專案，HPFS 和 NTFS 使用相同的磁碟分割槽標識程式碼（0x07）。這是一種非常特殊的情況，因為可用的標識碼並不匱乏，其它每個檔案系統具有自己的標識碼，例如，FAT 擁有超過九個編號（FAT12、FAT16、FAT32 等等各自都擁有不同的標識碼）。這種特例也導致之後用於區分檔案系統的演算法當遇到程式碼 0x07 時候不得不進行額外的檢測。 NTFS 的開發者包括：Tom Miller、Gary Kimura、Brian Andrew 以及 David Goebel。 版本 微軟正式釋出的 NTFS 版本有五個： NTFS 版本號 首個支援的作業系統 釋出時間 新功能 備註 10 Windows NT 31 1993 最初版本 v10 和 v11 和之後的所有版本不相容。也即使用 NT 35x 寫入的卷無法被 NT 31 讀取。該問題的一個解決方案是使用 NT 35x 光碟更新 NT 31，並新增對 FAT 系統的長檔名支援。 11 Windows NT 351 1995 壓縮檔案、命名流、訪問控制表 12 Windows NT 40 1996 安全描述符 Windows NT 40 作業系統釋出之後，該檔案系統版本號俗稱 NTFS 40 30 Windows 2000 2000 支援磁碟限額、加密、稀疏檔案、重解析點，更新序列數（USN）日誌、Extend 資料夾（及其中的檔案），並改進安全描述符設計方案，允許使用同樣的安全設定的多個檔案共享一個安全描述符。 Windows NT 40 的 SP4 升級包對這個版本的 NTFS 提供了相容。 Windows 2000 作業系統釋出之後，該檔案系統版本號俗稱 NTFS 50。 31 Windows XP 2001 在 MFT 中提供冗餘 MFT 記錄數擴充套件項，可用於恢復受損的 MFT 檔案。 Windows XP 作業系統釋出之後，該檔案系統版本號俗稱 NTFS 51 的檔案版本號（例如在 Windows 2000 裡面是 v50）是基於作業系統版本號的，不該與 NTFS 版本號（例如 Windows XP 裡面是 v31）混淆。 後續的 Windows 的版本更新增加了許多檔案系統相關的功能，但並沒有改變 NTFS 本身。例如 Windows Vista 增加了 NTFS 符號連結、事務 NTFS、磁碟收縮和自我修復，但除了符號連結外其他功能其實都由作業系統實現。 功能 相對於之前的版本，NTFS v30 包含若干新功能：磁碟使用限額、稀疏檔案支援、重解析點、分佈連結跟蹤，以及檔案級加密（即 加密檔案系統（EFS））。 可伸縮性 理論上，NTFS 卷的最大容量為 2641 簇。在 Windows XP 專業版中，由於分割槽表限制，實際實現的最大容量為 2321 簇。例如，在當簇的從大小為 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 一個非常關鍵的功能（FATFAT32 不提供此項功能），可確保其內部的複雜資料結構（如比較重要的如卷分配圖、磁碟碎片整理 API 產生的資料轉移操作、MFT（主檔案表）記錄的更改情況（包括移動 MFT 記錄中儲存的變長屬性和屬性表等））和索引（在目錄和安全描述符中使用）即使在系統崩潰後仍然能保證一致性，而當在卷被重新載入後，可以非常容易地回滾這些關鍵資料的意外修改。 USN 日誌是一項系統管理功能，用於記錄卷中所有檔案、資料流、目錄的內容、屬性以及各項安全設定的更改情況。應用程式可以利用日誌追蹤卷的更改。對於非系統卷，可以選擇開啟或關閉日誌。當新增一個新卷後，預設情況下日誌功能處於開啟狀態。 硬連結 硬連結可用於將不同的檔名直接關聯到同樣的檔案內容。 硬連結類似於目錄連線，但必須引用到檔案。硬連結只能連線到同一個卷內的檔案，因為每個卷擁有自己的主檔案表（MFT）。硬連結有自己的元資料，因此如果更改某個硬連結的檔案大小或尺寸，其他硬連結在被開啟前可能不會自動更新這些資訊。 硬連結原本用於支援 Windows NT 的 POSIX 子系統 MS Windows NT Workstation 40 Resource Guide POSIX Compatibility。 Windows 使用硬連結實現對 83 檔名的支援。作業系統需要該功能，因為有些古老的應用程式只能使用短檔名。NTFS 將會為檔案和目錄建立額外的 NTFS 記錄，但他們將總是自動同步更新（常規硬連結並不會同步更新）。 NTFS 檔案系統限制單個檔案只能關聯到 1024 個硬連結。 可選資料流（ADS） 可選資料流使單個檔案可以關聯到多個數據流。NTFS 資料流的表述方式為 檔名：流名，例如 texttxtextrastream。 NTFS 流從 Windows NT 31 開始被引入，起初設計目的是為了 Services for Macintosh（SFM）能夠正確儲存 Macintosh 的資源分岔。現在的 Windows 伺服器已經不再包含此功能，但很多第三方的 Apple 歸檔服務（AFP）產品（例如 Group Logic 的 ExtremeZIP）仍然會繼續使用可選資料流。Internet Explorer 和其它一些瀏覽器會在從網路上下載的檔案中新增一個非常小的可選資料流，用於標記它們來自於外部網站（表示可能會存在安全風險），使用者在開啟這些檔案前系統將會顯示一個確認提示。 當用戶表示不希望再次看到這個確認對話方塊的時候，這個可選流將會從下載的檔案中被直接刪除。 可選資料流不會顯示在 Windows 資源管理器中，也不會算入檢視檔案屬性時顯示的檔案大小。如果將檔案複製到 FAT 格式的磁碟、附加到電子郵件、上傳到網站，或者移動到任何其它不支援可選流的位置上時，則只有主資料流會被保留下來，其它可選流將被全部丟棄，因此使用可選流來儲存重要資料很可能會發生意外。Microsoft 提供了一個叫作 Streams 的工具，使用者可以使用這個工具檢視卷中的可選流。從 Windows Powershell 30 版本開始，以下 cmdlet 支援對可選資料流進行操作：AddContent、ClearContent、GetItem、OutString、RemoveItem，以及 SetItem。 有些媒體播放器也嘗試使用可選資料流記錄多媒體檔案的自定義元資料，用於管理媒體檔案。MPEG、OGG 等格式通常在檔案內簽入資訊標籤記錄媒體資訊，但不是所有格式都支援這種設計，而使用可選資料流的好處正是他不會影響檔案本身的內容。在 Windows 中註冊外殼擴充套件程式後，系統就可以解析這些資料，然後可以在 Windows 資源管理器的資訊欄中顯示它們。但大部分媒體播放器還是選擇使用獨立資料庫而非可選資料流來儲存這些資訊，因為可選資料流可能帶來一些其它問題，一個典型問題是檔案上的資訊對於所有使用者都可見並且是共享的，因此使用可選資料流將無法根據不同使用者的安全設定和喜好進行分別管理和保護。 一些惡意軟體會使用可選資料流來隱藏程式程式碼，Malware utilising Alternate Data Streams AusCERT Web Log 21 August 2007 不過不少惡意軟體掃描程式和特殊工具現在已經能夠檢查可選資料流中的內容。 檔案壓縮 NTFS 能夠使用 LZNT1 演算法（LZ77 演算法的一種變種）壓縮檔案。檔案壓縮以 16 個簇為一個區塊進行，也即如果簇大小為 4KB，則壓縮時單個區塊的大小為 64KB。NTFS 壓縮演算法支援的最大簇大小為 4KB，如果簇大小超過 4KB，則壓縮功能將不可用。 如果壓縮可以將 64KB 資料壓縮到 60KB 或者更小，則 NTFS 會將多餘的 4KB 頁面視為稀疏檔案簇，認為他們未經寫入。對此類簇的隨機訪問的效能是可以接受的，作業系統只需跟蹤碎片連結即可。但如果處理大型可壓縮檔案，則會產生大量碎片，因為 NTFS 會將每個小於 64KB 的區塊都看成一個碎片區域。微軟 NTFS 開發團隊的研究表明，在簇大小為 4KB（預設設定）時，NTFS 捲上壓縮檔案的合理最大尺寸應當在 5060GB 之間。當簇大小更小時，最大尺寸也會減小。硬碟空間受限的單使用者系統可以使用 NTFS 壓縮在處理小檔案（4KB 到 64KB，或者更大尺寸，具體範圍取決於壓縮比）時受益。小於 900 位元組的檔案將被直接儲存在 MFT 的目錄項中。 快閃記憶體裝置（如固態硬碟）沒有傳統硬碟的磁頭移動延遲，因此對此類裝置，磁碟碎片的影響非常有限。具有快速多處理器系統的使用者可以透過壓縮應用程式檔案和資料以提升速度並降低磁碟空間使用率。請注意，使用 Sandforce 控制器的 SSD 本身也會壓縮資料，但檔案系統壓縮會導致傳輸的資料量變少，因此 IO 負載會降低。 資料壓縮的最佳目標是內容具有重複性、很少寫入、通常順序訪問，並且尚未被壓縮過的檔案。例如，日誌檔案就是一種理想的壓縮目標。 壓縮系統引導時需要使用的檔案，如驅動程式、NTLDR、winloadexe，或者 BOOTMGR，會導致系統無法正確啟動。不過在較新版本的 Windows 系統中，重要的系統檔案會被禁止壓縮。 當在驅動器或目錄的 高階設定 中更改 將檔案進行壓縮 的設定時，每個檔案將被獨立進行壓縮或者解壓縮。 對於壓縮檔案的讀寫絕大部分時候是透明的，但 Microsoft 建議避免對伺服器系統或者透過網路共享的遠端配置檔案進行壓縮，因為這可能增加處理器的負擔。Best practices for NTFS compression in Windows Microsoft Knowledge Base Retrieved on 20050818Microsoft 建議不要壓縮超過 30MB 的檔案，因為這可能會產生效能問題。由於壓縮檔案會產生很多碎片，因此磁碟碎片整理過程通常需要花費更長時間。 計算機系統中最慢的裝置通常不是 CPU 而是硬碟，因此 NTFS 壓縮通常可以更有效地利用慢速的非 RAM 儲存系統，節省空間和時間（前提是假設壓縮檔案的碎片不會連續存放） 。 稀疏檔案 稀疏檔案是包含稀疏資料集的檔案，稀疏檔案只儲存檔案中各個有意義的片段，而片段之間的空白將被忽略，這種設計特別適合實際資料非常少、大部分割槽域空白的檔案。讀取檔案時，對任何被忽略的位置，檔案系統程式都會返回資料 0，因此檔案內容看起來幾乎全是零。很多資料庫和科學程式使用稀疏檔案 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。Microsoft 實現對稀疏檔案的高效儲存支援，允許應用程式指定檔案的空（零）資料區域。讀取稀疏檔案的應用程式不需要做單獨處理，可以繼續使用常規方法讀取資料，作業系統將根據讀取的位置決定返回零或者實際資料。和壓縮檔案類似，磁碟限額對稀疏檔案的尺寸判斷以宣告大小而非實際佔用大小為準。 卷影複製 卷影複製（VSC）服務透過將新改寫的資料複製到卷影（寫入時複製）來儲存 NTFS 捲上的檔案和資料夾的歷史版本。當用戶請求恢復檔案的早期版本時，舊的檔案資料將會覆蓋新資料。該功能也使得資料備份程式可以存檔當前系統正在使用的檔案。對於負載較重的系統，Microsoft 建議將卷影副本設定到單獨的磁碟上，以減小系統主要卷的 IO 負載。 Windows Vista 透過持久卷影副本實現系統還原和先前的版本功能。但舊版本的作業系統載入 NTFS 卷時，由於其無法識別持久卷影副本的資料格式，這些副本將被刪除。 事務 在 Windows Vista 中，應用程式可以使用事務 NTFS（Transactional NTFS，TxF）將一系列對檔案的更改歸組到一個事務中。事務能夠確保所有更改要麼同時生效，要麼同時作廢，並能確保在事務提交完成前，其它應用程式無法無法檢測到其中的更改。 該技術使用和卷影複製類似的技術（也即寫入時複製）以確保在事務不成功時，被改寫的資料可以安全地回滾。通用日誌檔案系統的日誌將記錄下尚未成功提交或者已經提交但尚未完全生效的事務（常見原因是事務的某個參與者在提交過程中系統意外崩潰）。 事務 NTFS 並不要求事務是本機 NTFS 卷的檔案操作，可以包含在其它位置的任意事務資料或操作，例如對其它卷、本地登錄檔、SQL 資料庫中、系統服務或者遠端服務中的事務修改。所有這些事務使用 Windows 系統中的 分佈事務協調器（DTC） 服務在網路級別協調所有參與者，以確保所有參與者都能接收到同樣的提交狀態，並傳輸所有經過確認的更改。分散式 NTFS 事務的一個典型例子是可以以事務方式建立一個網路級別的分散式檔案系統，並且每個客戶端都保留每個檔案的準確的離線快取。 安全 在 NTFS 中，每個檔案或資料夾具有一個安全描述符，用於說明其所有者，幷包含兩個安全控制列表（ACL）。 第一個列表被稱為自主訪問控制列表（DACL），用於描述是否允許或禁止特定的使用者或使用者組進行特定的操作（如讀取、寫入、執行或刪除）。例如，CProgram Files 資料夾可能被設定為允許所有使用者讀取並執行，但只有具有管理員許可權的使用者才能修改其內容。Windows Vista 為 DACL 增加了強制訪問控制功能。DACL 是 Windows Vista 及後續作業系統的使用者賬戶控制功能的主要檢查點。 第二個列表被稱為系統訪問控制列表（SACL），用於描述對檔案或資料夾的特定行為是否應當被稽核，以及在操作成功後是否應當記錄操作。例如，企業可能會對高度敏感的檔案開啟稽核功能，這樣管理員就可以瞭解到是否有人嘗試刪除或複製這些檔案，以及他們的操作是否成功完成。 加密 加密檔案系統（EFS）提供對 NTFS 捲上任意檔案和資料夾的使用者透明的強保護。加密檔案系統需要與 EFS 服務、Microsoft 的加密應用程式介面（CryptoAPI）以及 EFS 檔案執行時庫（FSRTL）聯合工作。 EFS 使用對稱金鑰（也被稱為 檔案加密金鑰（FEK））加密檔案，這比起使用非對稱金鑰加密在加密和解密大量資料時消耗的時間較少。該對稱金鑰使用一個和請求加密檔案的使用者相關的公鑰加密檔案的內容，加密後的資料儲存在被加密檔案的可選資料流中。當需要解密檔案時，檔案系統使用使用者的金鑰解密儲存在檔案頭中的對稱金鑰，然後使用該對稱金鑰解密檔案。這些操作在檔案系統級別完成，因此對使用者來說是透明的。How EFS Works Microsoft Windows 2000 Resource Kit 為了處理使用者丟失金鑰的情況，加密檔案系統中還支援多個附加解密金鑰，因此除使用者外，授權過的恢復代理也能訪問資料。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 外的其它檔案系統。一個常見的例子是，被載入的卷一個遠端共享的目錄，該目錄擁有自己的許可權設定，並且能夠根據實際檔案系統的策略為當前作業系統設定特定的訪問許可權。 目錄連線 類似於卷載入點，但目錄連線的連線目標是檔案系統中的某個其它目錄。例如，目錄 Cexampledir 帶有一個目錄連線屬性，連線到 Dlinkeddir。當用戶級別的應用程式訪問時，NTFS 將自動把所有引用重定向到 Dlinkeddir。目錄連線功能在概念上類似於 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 格式的磁碟捲上時，檔案內部的多個流將被合併轉換為一個流。John Saville What is Native Structured Storage 分佈連結跟蹤（DLT） 分佈連結跟蹤功能允許應用程式跟蹤被重新命名或者移動到同一計算機、域或工作組的其它卷中的檔案、快捷方式和 OLE 連結。跟蹤功能由一個系統服務提供，使用儲存在元檔案中的物件識別符號（OID）索引實現。httptechnetmicrosoftcomenuslibrarycc736811（WS10）aspx 當應用程式請求跟蹤某個檔案或目錄後，跟蹤服務將會建立物件的 OID 項並指向目標。在一個 NTFS v3 上執行檔案重新命名、複製或移動操作時，也會同時複製物件的 OID，這樣跟蹤服務就可以有效地尋找到目標。 單例項儲存（SIS） 當若干個不同目錄中存有內容相同的檔案時，單例項儲存允許將相同檔案歸併到一個單一檔案中，並將所有檔案引用到實際的檔案上。單例項儲存功能包含一個用於管理複製、修改和歸併檔案的檔案系統過濾器和一個用於搜尋需要歸併的相同檔案的使用者空間服務（groveler）。單例項儲存提出時的主要針對目標是遠端安裝伺服器，這些伺服器上往往擁有若干個包含大量相同檔案的安裝映象，單例項儲存可以將它們統一起來，因而節省需要佔用的總尺寸。和硬連結不同的一點是，在 SIS 下，每個檔案在邏輯上仍然是獨立的，更改被合併為單個檔案的任意其中一個檔案都不會影響其它檔案，而是會取消對該檔案的合併併產生一個新的副本。不過新檔案不會立即寫入到硬碟，NTFS 使用類似於寫入時複製的技術，在檔案最終需要儲存時才執行復制。 內部實現 在內部，NTFS 使用 B 樹索引檔案系統資料。這種資料結構的方式實現比較複雜，但能夠在大多數情況下提高檔案的查詢速度。檔案系統日誌用於確保檔案的元資料完整，不存在孤立的檔案內容。相比於 FAT 檔案系統，NTFS 檔案系統的可靠性更高。Microsoft TechNet Resource Kit NTFS 允許對名稱（包括檔名稱、流名稱、索引名稱等）使用除了 0x0000 以外的任意 16 位值序列進行編碼。這意味著支援 NTFS 支援 UTF16 碼位，但檔案系統並不會檢查某個 UTF16 序列是否有效（也即允許 NTFS 內部任意 16 位整數序列，不受 Unicode 標準的限制）。 分割槽引導扇區 NTFS 引導扇區內容 位元組偏移 欄位長度（位元組） 典型值 欄位名 描述 0x00 3 0xEB5290 JMP 指令 用於命令處理器繼續執行引導扇區後的內容 0x03 8 NTFS 單詞 NTFS，以及後續四個空格（0x20） OEM 標識 用於標記當前分割槽使用 NTFS 檔案系統 0x0B 2 0x0200 每扇區位元組數 說明每個扇區的位元組數 0x0D 1 0x08 每簇扇區數 說明每個簇包含的扇區數 0x0E 2 0x0000 保留扇區數 被作業系統保留的扇區數，參考文獻中未說明保留扇區的位置 0x10 3 0x000000 未使用 該欄位的內容始終為零 0x13 2 0x0000 NTFS 未使用 該欄位的內容始終為零 0x15 1 0xF8 介質描述符 參考檔案中未說明詳細資訊 0x16 2 0x0000 未使用 Unused 該欄位的內容始終為零 0x18 2 0x003F 每磁軌扇區數 說明每個磁軌的扇區數 0x1A 2 0x00FF 磁頭數 該驅動器包含的讀寫磁頭數 0x1C 4 0x0000003F 隱藏扇區數 隱藏的扇區數目。參考文獻中未說明隱藏扇區位置 0x20 4 0x00000000 未使用 NTFS 未使用 0x24 4 0x80008000 未使用 NTFS 未使用 0x28 8 0x00000000007FF54A 總扇區數 該分割槽包含的總扇區數目 0x30 8 0x0000000000000004 MFT 簇編號 MFT 所在的簇的編號 0x38 8 0x000000000007FF54 MFTMirr 簇編號 MFT 映象（備份）所在的簇的編號 0x40 1 0xF6 檔案記錄段位元組數 每個檔案記錄段的包含的位元組數目。如果該值為負數，則實際值為 2 的 value 次冪，例如值 0xF6 表示記錄長度為 210（100xf6） 0x41 3 0x000000 未使用 NTFS 未使用該欄位 0x44 1 0x01 索引緩衝簇數 每個索引緩衝佔據的簇數目，演算法和檔案記錄段相同 0x45 3 0x000000 未使用 NTFS 未使用該欄位 0x48 8 0x1C741BC9741BA514 卷序列數 該分割槽的唯一隨機編號，用於確保內容一致性 0x50 4 0x00000000 校驗和 表中上述所有專案的校驗和。文獻中未說明校驗演算法 0x54 426 啟動指令碼 用於載入作業系統其它部分的指令碼，該欄位位置正是引導扇區前三個位元組指向的位置 0x01FE 2 0xAA55 扇區結束標記 該欄位用於標記一個正常扇區的結束 NTFS Partition Boot Sector Information on structure of the boot sector 作業系統首先透過 0x30 位置的 8 個位元組找到 MFT 所在的簇編號，然後將其和每簇扇區數（0x0D 位置的 1 位元組）以及每扇區位元組數（0x0B 位置的 2 位元組）相乘，獲得 MFT 的位元組偏移量。 主檔案表（MFT） 在 NTFS 中，所有檔案資料 檔名、建立日期、訪問許可權（使用訪問控制表（ACL）實現），以及內容 都作為元資料儲存在主檔案表中。這種抽象的實現方式能夠大大簡化為檔案系統新增功能的成本。例如，Active Directory（活動目錄）服務可以很容易在檔案系統中為檔案新增索引欄位。這種設計方式也使得 Everything 或者 Ultrasearch 一類的軟體可以不依賴於 Windows Search 實現對檔案和資料夾名稱的即時搜尋。 MFT 結構支援最小化磁碟碎片的演算法。一個目錄項同時包含 檔名 和 檔案 ID，後者是用於在主檔案表中標識檔案的記錄編號。檔案 ID 也包含 重用次數 資訊，可用於檢測對檔案的過期引用。這點設計非常類似於 Files11 檔案系統的 W_FID，和 NTFS 的其他部分迥然不同。 元檔案 NTFS 包含若干用於定義和組織檔案系統的檔案。總體來說，這些檔案中的絕大多數結構和其它使用者檔案類似（只有 Volume 比較特殊），但不能被檔案系統客戶端直接訪問。這些元檔案為定義檔案、備份檔案系統的關鍵資料、快取檔案系統的更改、管理空閒空間的分配、滿足 BIOS 的要求、跟蹤壞扇區單元，以及儲存安全資訊和磁碟空間使用情況等等多種不同需求提供支援。 區段編號 檔名 作用 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 卷引導記錄，該檔案始終位於卷的第一個簇，其中包含引導程式碼（用於定位並啟動 NTLDRBOOTMGR）、BIOS 引數塊（其中包含卷序列號），以及 MFT 和 MFTMirr 所在的簇編號。 8 BadClus 包含所有標記為 有壞扇區 的簇的一個檔案。該檔案通常被 chkdsk（磁碟掃描）工具使用，用於管理所有簇狀態，記錄壞扇區，以及標記空白簇。該檔案包含兩個資料流（無論卷是否有壞道）：一個包含所有壞扇區編號的無名稱流（如果卷沒有壞扇區則該流長度為零），以及名稱為 Bad 的流，包含所有包含記錄在第一個流中的簇。 9 Secure 訪問控制表（ACL）資料庫，NTFS 將所有 ACL 資訊集中儲存於該資料庫（而非每個檔案獨立儲存各自的 ACL）以節省磁碟佔用並提高執行效率。此部分包含兩個索引，分別是：SII 可能是安全 ID 索引，以及 SDH 安全描述符雜湊。注意大部分 ACL 列表通常都很長，因此這個部分只是索引，記錄的是實際儲存 ACL 資料的 SDS 流的位置。 10 UpCase Unicode 大寫字母表，用於確保在 Win32 和 DOS 名稱空間下大小寫不敏感。 11 Extend 檔案系統目錄，用於包含若干作業系統或其它軟體所需要的擴充套件資料，如 Quota、ObjId、Reparse、UsnJrnl 等。 12 23 保留為 MFT 擴充套件項使用。擴充套件專案是一系列附加 MFT 記錄，用於描述未在主記錄中包含的屬性。例如，當卷需要磁碟清理，包含太多流，具有長檔名或者非常複雜的安全設定，以及其它特殊情況時，可能會用到保留專案 保留為 MFT 擴充套件項使用。擴充套件專案是一系列附加 MFT 記錄，用於描述未在主記錄中包含的屬性。例如，當卷需要磁碟清理，包含太多流，具有長檔名或者非常複雜的安全設定，以及其它特殊情況時，可能會用到保留專案 24 ExtendQuota 磁碟限額設定。包含兩個索引根目錄，名稱分別為 O 和 Q。 25 ExtendObjId 分佈連結跟蹤資料。包含一個索引根目錄，名稱為 O。 26 ExtendReparse 捲上所有重解析點（如符號連結）資料。包含一個索引根目錄，名稱為 R。 27 fileext 常規檔案系統專案的起始位置。 Windows 對這些元檔案的處理方式較為特殊，直接由 NTFSSYS 進行處理，因此難以直接檢視，需要使用特殊工具進行提取。從 Windows 7 開始，NTFS 驅動程式完全阻擋了使用者訪問許可權，任何嘗試訪問元檔案的請求都會直接進入藍色畫面宕機介面。微軟 OEM 支援工具 中的 nfiexe（NTFS 檔案扇區資訊實用工具） 是一個可檢視這些檔案的工具 lliru，要檢視 MFT 的內容，只需使用下列命令列：nfiexe cMFT。另一個繞過作業系統保護限制的方法是使用 7Zip 檔案管理器工具並輸入低階 NTFS 路徑 x，此時將會出現三個新的資料夾：extend、DELETED 以及 SYSTEM。這個操作可以用於任何可移動裝置，但如果需要訪問當前活動分割槽，則需要進入離線模式（也即 WinRE）。 從 MFT 到屬性、屬性表和流 對於每個 MFT 記錄所描述的檔案或目錄，都有一個線性存放的流描述符（也即屬性）儲存區，被打包後存放在一個變長記錄（也即屬性表）中，然後使用額外的填充符填充以滿足 MFT 記錄的 1Kib 對齊要求。這部分資料完整地描述了和檔案相關聯的所有資料流。注意此處的 流 和檔案資料流不是一個概念，而是所有資料資訊的統稱。 每個流（或稱屬性）本身包含如下資料：型別（內部通常儲存為一個固定長度的整數或者一個描述符，但通常開發應用程式開發時呼叫 FileOpen 或者 FileCreate API 時會使用等效的識別符號來代表它）、流名稱（可選，注意和檔名沒有任何關係），以及資料（可選，但大部分流具有資料）。對於 NTFS 而言，檔案的主資料（也即檔案內容）、目錄的索引資訊、檔案的可選資料流、以及檔案的所有屬性，處理方式都是完全相同的，他們都是屬性表中的某個屬性而已。 對於每個 MFT 中描述的檔案（或非常駐的流描述符儲存區，此概念請參考下文），每種流描述符（使用流型別 流名稱聯合區分）必須唯一。此外，NTFS 還對於描述符有一些用於排序的約束要求。 NTFS 預定義了一種稱為 空流 的型別，用於在流儲存區中表明流描述符的結尾。空流必須是每個儲存區中的最後一個流描述符，所有之後的剩餘空間都將被忽略，只包含填充位元組（用於滿足 MFT 的記錄尺寸要求或者非常駐流儲存區的簇尺寸要求）。 對於每個 MFT 記錄，某些型別的流必須存在，例外是整個記錄只有一個空流表示該記錄未使用。 這裡的 某些 具體指的是包含時間戳和其它單位元（Bit）的屬性的 標準屬性，這種屬性的長度和格式是固定的，這是為了相容 DOS 或者 Windows 9598 管理的 FATFAT32 檔案。 某些型別的流不能包含名稱，必須是匿名的。 這裡的 某些 包括標準屬性、NTFS 的 檔名 流，以及 短檔名 流（注意如果該檔案無需考慮對 DOS 應用程式的相容性，則 短檔名 流並不一定出現）。有些時候檔案也可能只包含 短檔名 而沒有 檔名，這時候短檔名會代替檔名顯示在資源管理器的 檔名 一欄中。 即使流儲存區中包含有 檔名 流，也並不表示檔案一定會出現在檔案系統中。要顯示檔案，該專案還必須要進入捲上的某個目錄的索引表。注意目錄的索引表中除了記錄該檔案的 MFT 記錄編號外，也對檔案單獨提供一份 MFT 記錄、安全描述符、屬性表等，因此理論上單個檔案可以被多個目錄 硬連結 多次，並且在每個目錄中顯示為不同的名稱。 表示檔案資料的預設資料流的流型別為 DATA，該資料流沒有名稱。可選資料流使用同樣的流型別，但必須具有流名稱。 目錄的預設資料流和檔案的情況不同，目錄的資料流（存放檔案的索引表）不是匿名的，NTFS 會透過目錄的資料流的名稱（如在 NTFS 3 以上版本中為 I30）來表明目錄索引的格式。 可以使用 nfiexe（NTFS 檔案扇區資訊實用工具）檢視任意檔案或者目錄的資料流，這個實用工具目前包含在 Microsoft OEM Support Tools 中，可以免費釋出。 常駐檔案和非常駐檔案 為了最佳化小資料檔案的資源佔用並降低 IO 負荷，在流描述符和檔案資料大小總和不超過單個 MFT 最大記錄大小時，NTFS 會直接將資料放入流描述符區域中（通常情況下，MFT 中資料流的內容是實際檔案資料鎖在的簇的列表）。此類直接將資料存入 MFT 的檔案被稱計算機取證工作者稱為 常駐資料。常駐檔案允許的資料量受到檔案其它資訊佔用的流描述符大小的影響，通常一個沒有可選資料流、檔名不長且無特殊 ACL 設定的檔案允許存放 700 到 800 個位元組。 某些流描述符（如上文提到的首選檔名、基本檔案屬性，以及下文所述的非常駐流主分配表）必須以常駐形式存在。 啟用 NTFS 加密的流、稀疏資料流，以及壓縮資料流無法常駐。 非常駐流的分配圖格式和檔案是否為稀疏檔案有關。對目前版本的 NTFS 而言，如果某個非常駐資料流被轉換為稀疏流，將無法還原為非稀疏格式，因此該檔案將無法重新常駐，除非將流完全截斷並且丟棄整個稀疏分配圖。 如果一個非常駐資料流碎片太多，以至於在 MFT 記錄中無法放下整個分配圖，則分配圖本身可能也會被存放到一個非常駐流當中，而檔案本身只包含一個小型常駐資料流，其內容是標識非常駐分配圖所在的簇的位置。 如果一個檔案的流太多（包括可選資料流、擴充套件屬性、安全描述符等），流描述符無法完整放入 MFT 中，則 NTFS 也會建立一個非常駐資料流，用於存放必須常駐的流之外的其它流描述，該資料流使用和 MFT 一樣的格式，但不再有空間尺寸限制。 由於常駐檔案不直接佔據簇（也即基本的 分配單元），這使得 NTFS 卷有可能包含比簇數目更多的檔案。例如，一個 80GB（745GiB）的分割槽，NTFS 可以將其格式化併產生 19543064 個 4KiB 的簇。除去系統檔案（64MiB 日誌檔案，一個 2442888 位元組的點陣圖，以及大約 25 個簇的固定頭部），還剩餘 19526158 個簇可用於檔案和索引。由於每個簇有 4 個 MFT 記錄，因此卷理論上可以包含將近 419526158 78104632 個常駐檔案。 機會鎖 機會鎖（Oplock）允許網路客戶端改變對檔案或資料流的快取策略，以便於增強效能或降低網路佔用。機會鎖應用到檔案某個開啟的流上，不影響同一個檔案的其它流。 機會鎖可以用於在後臺透明訪問檔案。如果沒有其它程序訪問伺服器檔案，網路客戶端可以避免向檔案寫入資料；而如果沒有其他程序正在寫入資料，客戶端可以快取即將讀取的資料。 Windows 支援四種不同型別的機會鎖： 等級 2（共享）：多個讀取，不可寫入（也即讀快取）。 等級 1（獨佔）：任意緩衝方式的獨佔訪問（也即讀寫快取）。 批次鎖（也是獨佔的）：在伺服器上開啟流，在客戶端關閉流（讀、寫和控制代碼快取）。 過濾鎖（也是獨佔的）：當其它程式嘗試訪問流時，應用程式和系統過濾器可以放棄該鎖（讀寫快取，從 Windows 2000 開始受支援） 在 Windows 7 和 Windows Server 2008 R2 系統中，機會鎖得到增強，支援每個客戶端使用獨立的機會鎖鍵。httptechnetmicrosoftcomenuslibraryff383236（WS10）aspx 時間 Windows NT 和後續產品使用 UTC 作為內部時間戳，並在顯示時進行適當的轉換。也就是說，NTFS 時間戳使用 UTC 模式。 由於歷史原因，不支援 NTFS 的 Windows 使用本地時區作為時間戳，而目前版本的 Windows 對非 NTFS 分割槽也是用此方式進行處理。這意味著當檔案在 NTFS 和非 NTFS 分割槽間進行移動時，作業系統需要即時轉換時間戳。如果某些檔案移動時處於夏令時，而某些檔案處於標準時間，則可能移動後的時間可能會產生歧義，特別是當執行時間正好在時制轉換前後時，使用者可能會看到一小時的時間差。基於不同地區的不同夏令時規則，在任意 12 個月中，可能會產生最多 4 個小時的永久時間戳錯誤。Beating the Daylight Saving Time bug and getting correct file modification times The Code Project 互操作性 NTFS 具體的內部實現細節屬於商業秘密，這給第三方開發者製作 NTFS 檔案系統處理程式帶來很大的困難。 Microsoft Windows 儘管絕大多數 NTFS 版本的絕大部分都完全向前以及向後相容，但在舊版本的 Microsoft Windows 載入新版本的 NTFS 卷仍然會產生不少技術問題。這種問題往往來自於同一臺計算機的多重啟動功能，或者使用行動硬碟裝置傳輸檔案。 例如，在不支援的作業系統上嘗試使用帶有 先前版本（嚴格的說稱為卷影副本）的 NTFS 分割槽，會導致先前版本資料丟失。 Windows 提供了一個命令列工具 convertexe 可用於將部分檔案系統轉換為 NTFS，包括 HPFS（僅在 Windows NT 31、35 和 351 中受支援）、FAT16 和 FAT32（在 Windows 2000 及後續版本中受支援）。 Mac OS X Mac OS X 103 及後續版本包含對 NTFS 格式分割槽的只讀支援。基於 GPL 授權的 NTFS3G 也可以透過使用者空間檔案系統在 Mac OS X 上使用並讀寫 NTFS 分割槽。NTFS3G 的開發團隊還提供一個性能更好的商業版本，名稱為 Tuxera NTFS for Mac。 Paragon Software Group 也出售可執行讀寫操作的驅動程式，名稱為 NTFS for Mac OS X，部分希捷（Seagate）硬碟包含該元件。Mac OS X 106 和後續版本中包含有本機 NTFS 的寫入支援，預設情況下此功能未啟用，可以透過特定方法開啟。但有使用者報告此功能不穩定並會導致核心錯誤，可能這也是該功能未啟動或者被宣告的原因之一。 Linux 完整並安全的對 NTFS 的讀寫功能由 NTFS3G 驅動程式提供。該驅動程式包含在絕大多數 Linux 發行版中。同時也存在過時的，大部分僅只讀的解決方案： Linux 核心 22：從版本 220 開始，可以讀取 NTFS 分割槽。 Linux 核心 26：包含一個由 Anton Altaparmakov（來自劍橋大學）和 Richard Russon 編寫的驅動程式，該驅動程式支援讀取檔案以及在部分情況下的改寫檔案和調整檔案大小。 NTFSMount：使用 ntfsmount 可以透過一個使用者級驅動程式對檔案和目錄進行有限的讀寫操作。ntfsmount wiki page on linuxntfsorg Tuxera NTFS：高效能可讀寫商業核心驅動，主要是針對嵌入式裝置，他還開發了開源的 NTFS3G 驅動。 NTFS for Linux：由 Paragon Software Group 提供的對 NTFS 提供完整讀寫支援的商用驅動程式，桌面版可免費下載，嵌入式 Linux 版本則需要收費。 Captive NTFS（已停止維護）：一個使用 Windows 自身的驅動程式 ntfssys 並進行簡單封裝的驅動程式。 請注意，上面所有三個使用者級別驅動程式（NTFSMount、NTFS3G 以及 Captive NTFS）都基於使用者空間檔案系統（FUSE）實現的，該系統是一個用於在使用者空間和核心程式碼間通訊以獲取或儲存資料的 Linux 核心模組。上面所有的驅動程式（除了 Tuxera NTFS 和 Paragon NTFS for Linux）都是以 GPL 的方式開源的。由於 NTFS 內部結構非常複雜，內建的 2614 核心驅動程式和 FUSE 都不允許修改被認為是不安全的卷，以避免發生資料丟失。 其他 eComStation 和 FreeBSD 都提供對 NTFS 的只讀訪問支援（eComStation 有一個測試版本的驅動程式允許寫入／刪除操作，但通常認為該驅動程式還不安全）。BeOS 有一個基於 NTFS3G 的第三方工具，允許完整的 NTFS 讀寫操作。除了 Linux，NTFS3G 也能工作在 Mac OS X、FreeBSD、NetBSD、Solaris 以及 Haiku 上。同時，也有一個稱為 NTFS4DOS 的商用驅動程式允許在 DOS 下進行讀寫。 Ahead Software 曾經在 2002 至 2004 年間開發了一個名為 NTFSREAD 的驅動程式（版本 1200），可用於 DRDOS，並曾包含在他們的 Nero Burning ROM 軟體中。OpenBSD 在 2011 年 5 月 1 日釋出的 49 版本中提供了針對 i386 和 amd64 體系結構的 NTFS 只讀支援。 Google 開發的 Chrome OS 作業系統也支援 NTFS。 調整大小 有許多第三方工具可以安全地重新調整 NTFS 分割槽的大小。在 Windows Vista 中，Microsoft 新增收縮和擴充套件分割槽的功能，但該功能非常有限，因為該功能無法整理頁面檔案碎片或者標記為不可移動的檔案，因此限制對分割槽的收縮能力。取消頁面檔案重新啟動或使用第三方的工具進行磁碟碎片整理也許能改善收縮效果。 另請參閱 檔案系統的對比 NTFSDOS Files11ODS2 非常類似於 NTFS（如相比較於 INDEXFSYS 和 Mft，BITMAPSYS 和 Bitmap） HPFS，為 OS2 作業系統開發的檔案系統 ntfsresize Samba（軟體） 參考文獻 外部連結 文獻： Lowlevel description of NTFS disk structures from the LinuxNTFS project NTFScom documentation and resources for NTFS Microsoft NTFS Technical Reference 實現技術： NTFS3G an open source readwrite NTFS driver for Linux FreeBSD Mac OS X NetBSD Solaris and Haiku LinuxNTFS 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 POSIXcompatible 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 Category 微軟磁碟檔案系統 CategoryWindows 元件