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) |
透明壓縮 | 對每個檔案,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) |
NTFS是Windows NT以及之後的Windows 2000、Windows XP、Windows Server 2003、Windows Server 2008、Windows Vista和Windows 7的標準檔案系統。[4]
NTFS取代了檔案分配表(FAT)檔案系統,為Microsoft的Windows系列作業系統提供檔案系統。NTFS對FAT和HPFS(高效能檔案系統)作了若干改進,例如,支援元資料,並且使用了進階資料結構,以便於改善效能、可靠性和磁碟空間利用率,並提供了若干附加擴充功能,如訪問控制列表(ACL)和檔案系統紀錄檔。該檔案系統的詳細定義屬於商業秘密[5][6][7] ,Microsoft已經將其註冊為智慧財產權產品。[8][9]
歷史
20 世紀 90 年代早期,Microsoft 和 IBM 組建了一個聯合計劃,目標是建立一個下一代的作業系統。該專案的結果是誕生了 OS/2,但由於 Microsoft 和 IBM 在很多重要問題上不能達成共識而最後分裂, OS/2 至今仍屬於 IBM。Microsoft 開始研究 Windows NT。OS/2 的檔案系統 HPFS 包含了若干重要功能,而當 Microsoft 開始建立他們自己的新作業系統時,他們的 NTFS 從中借用汲取了很多方面。[10] 也許是因為它們有共同的祖先,HPFS 和 NTFS 共享了相同的磁碟分割區標識代碼(0x07)。共享標識是很不尋常的,因為可用的代碼還有很多,其他檔案系統都使用它們自己的編號。例如,FAT 擁有超過 9 個編號(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 開始的 v3.1)相混淆。[13]NTFS v3.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 壓縮檔案使用多種 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 域中的企業部署工具來使用這項功能。
符號連結
符號連結是 Windows Vista 提供的功能。符號連結(也稱軟連結)在客戶端進行解析,因此當共享符號連結時,目標會受到客戶端的訪問限制,而和伺服器無關。
事務 NTFS
在 Windows Vista 中,應用程式可以使用事務 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]
其他
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 下進行讀寫。[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 | 卷引導記錄,該檔案位於卷的第一個簇,其中包含引導代碼(用於定位並啟動 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 中,可以免費發布。[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 開發者包括:
- 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].
- ^ 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
- ^ 43.0 43.1 43.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