NTFS(英語:New Technology File System),是Microsoft公司開發的專用文件系統,從Windows NT 3.1開始成為Windows NT家族的默認文件系統。它提供了一整套功能,包括安全描述符、加密、磁盤配額和豐富的元數據。 它可以和群集共享卷 (CSV) 一起使用,以提供可以從故障轉移群集的多個節點同時訪問的連續可用卷。[4][5]
此條目可參照英語維基百科相應條目來擴充。 (2020年9月23日) |
此條目需要更新。 (2020年9月23日) |
開發者 | Microsoft |
---|---|
全稱 | New Technology File System |
發布 | 1993年7月 (Windows NT 3.1) |
分區標識 | 主引導記錄(MBR):0x07 GUID磁碟分割表(GPT):EBD0A0A2-B9E5-4433-87C0-68B6B72699C7(基本數據分區(BDP)) |
結構 | |
目錄內容 | B+樹[1] |
文件分配 | 位圖 |
壞塊 | $BadClus(MFT記錄) |
限制 | |
最大文件尺寸 | 理論:16EiB-1KiB[2] 實際:16TiB-64KiB(Windows 7、Windows Server 2008 R2及以前版本),256TiB-64KiB(Windows 8、Windows Server 2012及以後版本)[2] |
最大文件數量 | 4,294,967,295(232-1)[2] |
最長文件名 | 255個UTF-16編碼單元[3] |
最大卷容量 | 理論:264-1簇[2] 實際:256 TiB-64 KiB[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 3.1以上 OSX 10.3以上(只讀) Linux內核版本2.6以上 Linux內核版本2.2-2.4(只讀) FreeBSD NetBSD Chrome OS Solaris ReactOS(只讀) |
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中借鑑改善的。[6]可能正是因為他們來自於同一個項目,HPFS和NTFS使用相同的磁盤分區標識代碼(0x07)。這是一種非常特殊的情況,因為可用的標識碼並不匱乏,其它每個文件系統具有自己的標識碼,例如,FAT擁有超過九個編號(FAT12、FAT16、FAT32等等各自都擁有不同的標識碼)。這種特例也導致之後用於區分文件系統的算法當遇到代碼0x07時候不得不進行額外的檢測。
NTFS的開發者包括:Tom Miller、Gary Kimura、Brian Andrew以及David Goebel。
版本
微軟正式發布的NTFS版本有五個:
NTFS 版本號 | 首個支持的操作系統 | 發布時間 | 新功能 | 備註 |
---|---|---|---|---|
1.0 | Windows NT 3.1 | 1993[5] | 最初版本 | v1.0和v1.1和之後的所有版本不兼容。也即使用NT 3.5x寫入的卷無法被NT 3.1讀取。該問題的一個解決方案是使用NT 3.5x光盤更新NT 3.1,並添加對FAT系統的長文件名支持。[7] |
1.1 | Windows NT 3.51 | 1995 | 壓縮文件、命名流、訪問控制表[1] | |
1.2 | Windows NT 4.0 | 1996 | 安全描述符 | Windows NT 4.0 操作系統發布之後,該文件系統版本號俗稱 NTFS 4.0 |
3.0 | Windows 2000 | 2000 | 支持磁盤限額、加密、稀疏文件、重解析點[來源請求],更新序列數(USN)日誌、$Extend文件夾(及其中的文件),並改進安全描述符設計方案,允許使用同樣的安全設置的多個文件共享一個安全描述符。[1] | Windows NT 4.0 的 SP4 升級包對這個版本的NTFS提供了兼容。
Windows 2000 操作系統發布之後,該文件系統版本號俗稱 NTFS 5.0。 |
3.1 | Windows XP | 2001 | 在MFT中提供冗餘MFT記錄數擴展項,可用於恢復受損的MFT文件。 | Windows XP 操作系統發布之後,該文件系統版本號俗稱 NTFS 5.1 |
NTFS.sys
的文件版本號(例如在 Windows 2000 裡面是 v5.0)是基於操作系統版本號的,不該與 NTFS 版本號(例如 Windows XP 裡面是 v3.1)混淆。[8]
後續的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日誌是一項系統管理功能,用於記錄卷中所有文件、數據流、目錄的內容、屬性以及各項安全設置的更改情況。應用程序可以利用日誌追蹤卷的更改。[9]對於非系統卷,可以選擇打開或關閉日誌。[10]當添加一個新卷後,默認情況下日誌功能處於打開狀態。
硬鏈接可用於將不同的文件名直接關聯到同樣的文件內容。
硬鏈接類似於目錄連接,但必須引用到文件。硬鏈接只能連接到同一個卷內的文件,因為每個卷擁有自己的主文件表(MFT)。硬鏈接有自己的元數據,因此如果更改某個硬鏈接的文件大小或尺寸,其他硬鏈接在被打開前可能不會自動更新這些信息。
硬鏈接原本用於支持Windows NT的POSIX子系統[11]。
Windows使用硬鏈接實現對8.3文件名的支持。操作系統需要該功能,因為有些古老的應用程序只能使用短文件名。NTFS將會為文件和目錄創建額外的NTFS記錄,但他們將總是自動同步更新(常規硬鏈接並不會同步更新)。
NTFS文件系統限制單個文件只能關聯到1024個硬鏈接。[12]
可選數據流使單個文件可以關聯到多個數據流。NTFS數據流的表述方式為「文件名:流名」,例如「text.txt:extrastream」。
NTFS流從Windows NT 3.1開始被引入,起初設計目的是為了Services for Macintosh(SFM)能夠正確存儲Macintosh的資源分岔。現在的Windows服務器已經不再包含此功能,但很多第三方的Apple歸檔服務(AFP)產品(例如Group Logic的ExtremeZ-IP)仍然會繼續使用可選數據流。Internet Explorer和其它一些瀏覽器會在從網絡上下載的文件中添加一個非常小的可選數據流,用於標記它們來自於外部網站(表示可能會存在安全風險),用戶在打開這些文件前系統將會顯示一個確認提示。[13]當用戶表示不希望再次看到這個確認對話框的時候,這個可選流將會從下載的文件中被直接刪除。
可選數據流不會顯示在Windows資源管理器中,也不會算入查看文件屬性時顯示的文件大小。如果將文件複製到FAT格式的磁盤、附加到電子郵件、上傳到網站,或者移動到任何其它不支持可選流的位置上時,則只有主數據流會被保留下來,其它可選流將被全部丟棄,因此使用可選流來保存重要數據很可能會發生意外。Microsoft提供了一個叫作Streams[14]的工具,用戶可以使用這個工具查看卷中的可選流。從Windows Powershell 3.0版本開始,以下cmdlet支持對可選數據流進行操作:Add-Content、Clear-Content、Get-Item、Out-String、Remove-Item,以及Set-Item。[15]
有些媒體播放器也嘗試使用可選數據流記錄多媒體文件的自定義元數據,用於管理媒體文件。MPEG、OGG等格式通常在文件內簽入信息標籤記錄媒體信息,但不是所有格式都支持這種設計,而使用可選數據流的好處正是他不會影響文件本身的內容。在Windows中註冊外殼擴展程序後,系統就可以解析這些數據,然後可以在Windows資源管理器的信息欄中顯示它們。但大部分媒體播放器還是選擇使用獨立數據庫而非可選數據流來保存這些信息,因為可選數據流可能帶來一些其它問題,一個典型問題是文件上的信息對於所有用戶都可見並且是共享的,因此使用可選數據流將無法根據不同用戶的安全設置和喜好進行分別管理和保護。
一些惡意軟件會使用可選數據流來隱藏程序代碼,[16]不過不少惡意軟件掃描程序和特殊工具現在已經能夠檢查可選數據流中的內容。
NTFS能夠使用LZNT1算法(LZ77算法的一種變種)壓縮文件。[17]文件壓縮以16個簇為一個區塊進行,也即如果簇大小為4KB,則壓縮時單個區塊的大小為64KB。NTFS壓縮算法支持的最大簇大小為 4KB,如果簇大小超過 4KB,則壓縮功能將不可用。[18] 如果壓縮可以將64KB數據壓縮到60KB或者更小,則NTFS會將多餘的4KB頁面視為稀疏文件簇,認為他們未經寫入。對此類簇的隨機訪問的性能是可以接受的,操作系統只需跟蹤碎片鏈接即可。但如果處理大型可壓縮文件,則會產生大量碎片,因為NTFS會將每個小於64KB的區塊都看成一個碎片區域。[19][20]微軟NTFS開發團隊的研究表明,在簇大小為4KB(默認設置)時,NTFS卷上壓縮文件的合理最大尺寸應當在50-60GB之間。當簇大小更小時,最大尺寸也會減小。[21]硬盤空間受限的單用戶系統可以使用NTFS壓縮在處理小文件(4KB到64KB,或者更大尺寸,具體範圍取決於壓縮比)時受益。小於900字節的文件將被直接存儲在MFT的目錄項中。[22]
閃存設備(如固態硬盤)沒有傳統硬盤的磁頭移動延遲,因此對此類設備,磁盤碎片的影響非常有限。具有快速多處理器系統的用戶可以通過壓縮應用程序文件和數據以提升速度並降低磁盤空間使用率。[23]請注意,使用Sandforce控制器的SSD本身也會壓縮數據,但文件系統壓縮會導致傳輸的數據量變少,因此I/O負載會降低。
數據壓縮的最佳目標是內容具有重複性、很少寫入、通常順序訪問,並且尚未被壓縮過的文件。例如,日誌文件就是一種理想的壓縮目標。
壓縮系統引導時需要使用的文件,如驅動程序、NTLDR、winload.exe,或者BOOTMGR,會導致系統無法正確啟動。[24]不過在較新版本的Windows系統中,重要的系統文件會被禁止壓縮。
當在驅動器或目錄的「高級設置」中更改「將文件進行壓縮」的設置時,每個文件將被獨立進行壓縮或者解壓縮。
對於壓縮文件的讀寫絕大部分時候是透明的[25],但Microsoft建議避免對服務器系統或者通過網絡共享的遠程配置文件進行壓縮,因為這可能增加處理器的負擔。[26]Microsoft建議不要壓縮超過30MB的文件,因為這可能會產生性能問題。[來源請求]由於壓縮文件會產生很多碎片,因此磁盤碎片整理過程通常需要花費更長時間。
計算機系統中最慢的設備通常不是CPU而是硬盤,因此NTFS壓縮通常可以更有效地利用慢速的非RAM存儲系統,節省空間和時間(前提是假設壓縮文件的碎片不會連續存放) 。[27]
稀疏文件是包含稀疏數據集的文件,稀疏文件只儲存文件中各個有意義的片段,而片段之間的空白將被忽略,這種設計特別適合實際數據非常少、大部分區域空白的文件。讀取文件時,對任何被忽略的位置,文件系統程序都會返回數據0,因此文件內容看起來幾乎全是零。很多數據庫和科學程序使用稀疏文件[28]。Microsoft實現對稀疏文件的高效存儲支持,允許應用程序指定文件的空(零)數據區域。讀取稀疏文件的應用程序不需要做單獨處理,可以繼續使用常規方法讀取數據,操作系統將根據讀取的位置決定返回零或者實際數據。和壓縮文件類似,磁盤限額對稀疏文件的尺寸判斷以聲明大小而非實際占用大小為準。[29][30]
卷影複製(VSC)服務通過將新改寫的數據複製到卷影(寫入時複製)來保存NTFS卷上的文件和文件夾的歷史版本。當用戶請求恢復文件的早期版本時,舊的文件數據將會覆蓋新數據。該功能也使得數據備份程序可以存檔當前系統正在使用的文件。對於負載較重的系統,Microsoft建議將卷影副本設置到單獨的磁盤上,以減小系統主要卷的I/O負載。
Windows Vista通過持久卷影副本實現系統還原和先前的版本功能。但舊版本的操作系統加載NTFS卷時,由於其無法識別持久卷影副本的數據格式,這些副本將被刪除。
在Windows Vista中,應用程序可以使用事務NTFS(Transactional NTFS,TxF)將一系列對文件的更改歸組到一個事務中。事務能夠確保所有更改要麼同時生效,要麼同時作廢,並能確保在事務提交完成前,其它應用程序無法無法檢測到其中的更改。[31]
該技術使用和卷影複製類似的技術(也即寫入時複製)以確保在事務不成功時,被改寫的數據可以安全地回滾。通用日誌文件系統的日誌將記錄下尚未成功提交或者已經提交但尚未完全生效的事務(常見原因是事務的某個參與者在提交過程中系統意外崩潰)。
事務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)」)加密文件,這比起使用非對稱密鑰加密在加密和解密大量數據時消耗的時間較少。該對稱密鑰使用一個和請求加密文件的用戶相關的公鑰加密文件的內容,加密後的數據儲存在被加密文件的可選數據流中。當需要解密文件時,文件系統使用用戶的密鑰解密儲存在文件頭中的對稱密鑰,然後使用該對稱密鑰解密文件。這些操作在文件系統級別完成,因此對用戶來說是透明的。[32]為了處理用戶丟失密鑰的情況,加密文件系統中還支持多個附加解密密鑰,因此除用戶外,授權過的恢復代理也能訪問數據。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
。[1]目錄連接功能在概念上類似於Unix的目錄符號鏈接,但符號鏈接可以連接到任何目標,而NTFS目錄連接只允許連接到目錄。
目錄連接可以在控制台中通過命令MKLINK /J連接名目標目錄創建,使用RMDIR連接名刪除。目錄連接是永久性的,如果在客戶端訪問服務器的目錄連接,則操作系統會使用被鏈接的目錄所屬的系統(或域)的安全設置。但連接本身可能擁有獨立的安全設置,並且刪除一個目錄連接不會同時刪除目標目錄。
有些目錄連接是Windows Vista系統創建的,用於保持和早期版本的Windows的兼容性,例如系統驅動器中的Documents and Settings文件夾會被連接到同一個卷中的Users物理目錄上。這些目錄默認情況下是隱藏的,並且進行相關的安全設置,因此Windows資源管理器不允許外殼或者大部分應用程序直接打開它們,這樣的設置可能是為了防止用戶發現兩個看上去相同的文件夾,然後錯誤地刪除其中的某一個。默認情況下只有本機的SYSTEM賬戶或者的Administrators用戶組成員可以訪問這些目錄,這是考慮到這些賬戶安裝軟件的權限,而安裝時可能會產生兼容性問題。
目錄連接屬於軟鏈接(即使目標目錄已經被刪除,他們也仍然存在),使用一種類似符號鏈接的方式工作(只不過對於目標位置和類型有額外的限制),但NTFS文件系統對它們進行特殊優化,解析更快,相比於之後提出的NTFS 符號鏈接,目錄連接的開銷更小,且可以在服務器端解析,因此可以在遠程共享目錄中使用它們。
符號鏈接(或稱軟鏈接)從Windows Vista開始引入。[33]符號鏈接在客戶端解析,因此如果服務器上共享一個符號鏈接,則客戶端訪問時將服從本機而非服務器端的訪問限制。
符號鏈接可以鏈接到文件(使用MKLINK符號鏈接目標文件名創建),也可以鏈接到目錄(使用MKLINK /D符號鏈接目標目錄創建)。和Unix符號鏈接不同的一點是,NTFS符號鏈接在創建的時候就要決定目標類型(目錄或文件),但創建符號鏈接的時候並不需要目標已經存在或可以訪問,在訪問時才會實際檢查可訪問性。NTFS在訪問符號鏈接時也會檢查目標的類型,由於NTFS不允許在任何位置有目錄和文件同名,因此如果目標名稱存在但是類型不正確,系統也會返回一個找不到目標的錯誤。
符號鏈接也可以引用遠程主機上的共享文件夾或者其中的文件、子文件夾。但目標並不會被立即加載,而是在應用程序使用OpenFile()或者CreateFile() API請求打開目標的時候才加載到系統中。符號鏈接是永久的(重新啟動後仍然保留在對應的卷上),可以在命令行或者腳本中使用DEL符號鏈接刪除它們。
分層存儲管理是一種轉移一定時間不用的文件到價值更低的儲存介質中的方法。當文件再次被訪問時,文件上的重解析點將判定文件需要被使用,並將文件從儲存介質中恢復出來。分層存儲不但可以節省存儲開銷,也可以提高操作系統的數據讀寫和運行效率。
本機結構存儲是一種已經被Microsoft終止使用的ActiveX文檔存儲技術。這項技術允許ActiveX文檔使用和ActiveX內部的多流格式相同的方式進行儲存。操作系統會加載一個NSS文件過濾驅動程序,可以在應用程序使用文件時透明地處理多流格式。當NSS文件被傳輸到非NTFS格式的磁盤卷上時,文件內部的多個流將被合併轉換為一個流。[34]
分布鏈接跟蹤功能允許應用程序跟蹤被重命名或者移動到同一計算機、域或工作組的其它卷中的文件、快捷方式和OLE鏈接。[35]跟蹤功能由一個系統服務提供,使用存儲在元文件中的對象標識符(OID)索引實現。[36]當應用程序請求跟蹤某個文件或目錄後,跟蹤服務將會創建對象的OID項並指向目標。在一個NTFS v3上執行文件重命名、複製或移動操作時,也會同時複製對象的OID,這樣跟蹤服務就可以有效地尋找到目標。
當若干個不同目錄中存有內容相同的文件時,單實例存儲允許將相同文件歸併到一個單一文件中,並將所有文件引用到實際的文件上。單實例存儲功能包含一個用於管理複製、修改和歸併文件的文件系統過濾器和一個用於搜索需要歸併的相同文件的用戶空間服務(「groveler」)。單實例存儲提出時的主要針對目標是遠程安裝服務器,這些服務器上往往擁有若干個包含大量相同文件的安裝鏡像,單實例存儲可以將它們統一起來,因而節省需要占用的總尺寸。和硬鏈接不同的一點是,在SIS下,每個文件在邏輯上仍然是獨立的,更改被合併為單個文件的任意其中一個文件都不會影響其它文件,而是會取消對該文件的合併並產生一個新的副本。不過新文件不會立即寫入到硬盤,NTFS使用類似於寫入時複製的技術,在文件最終需要保存時才執行複製。[37]
內部實現
在內部,NTFS使用B+樹索引文件系統數據。這種數據結構的方式實現比較複雜,但能夠在大多數情況下提高文件的查找速度。文件系統日誌用於確保文件的元數據完整,不存在孤立的文件內容。相比於FAT文件系統,NTFS文件系統的可靠性更高。[38]
NTFS允許對名稱(包括文件名稱、流名稱、索引名稱等)使用除了0x0000以外的任意16位值序列進行編碼。這意味着支持NTFS支持UTF-16碼位,但文件系統並不會檢查某個UTF-16序列是否有效(也即允許NTFS內部任意16位整數序列,不受Unicode標準的限制)。
字節偏移 | 字段長度(字節) | 典型值 | 字段名 | 描述 |
---|---|---|---|---|
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 表示記錄長度為 2^10(10==-0xf6) |
0x41 | 3 | 0x000000 | 未使用 | NTFS未使用該字段 |
0x44 | 1 | 0x01 | 索引緩衝簇數 | 每個索引緩衝占據的簇數目,算法和文件記錄段相同 |
0x45 | 3 | 0x000000 | 未使用 | NTFS未使用該字段 |
0x48 | 8 | 0x1C741BC9741BA514 | 卷序列數 | 該分區的唯一隨機編號,用於確保內容一致性 |
0x50 | 4 | 0x00000000 | 校驗和 | 表中上述所有項目的校驗和。文獻中未說明校驗算法 |
0x54 | 426 | 啟動指令碼 | 用於加載操作系統其它部分的指令碼,該字段位置正是引導扇區前三個字節指向的位置 | |
0x01FE | 2 | 0xAA55 | 扇區結束標記 | 該字段用於標記一個正常扇區的結束 |
操作系統首先通過0x30位置的8個字節找到 $MFT 所在的簇編號,然後將其和每簇扇區數(0x0D位置的1字節)以及每扇區字節數(0x0B位置的2字節)相乘,獲得$MFT的字節偏移量。
在NTFS中,所有文件數據——文件名、創建日期、訪問權限(使用訪問控制表(ACL)實現),以及內容——都作為元數據儲存在主文件表中。這種抽象的實現方式能夠大大簡化為文件系統添加功能的成本。例如,Active Directory(活動目錄)服務可以很容易在文件系統中為文件添加索引字段。這種設計方式也使得Everything或者Ultrasearch[40]一類的軟件可以不依賴於Windows Search實現對文件和文件夾名稱的實時搜索。
MFT結構支持最小化磁盤碎片的算法。[41]一個目錄項同時包含「文件名」和「文件ID」,後者是用於在主文件表中標識文件的記錄編號。文件ID也包含「重用次數」信息,可用於檢測對文件的過期引用。這點設計非常類似於Files-11文件系統的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 | 卷引導記錄,該文件始終位於卷的第一個簇,其中包含引導代碼(用於定位並啟動NTLDR/BOOTMGR)、BIOS參數塊(其中包含卷序列號),以及$MFT和$MFTMirr所在的簇編號。 |
8 | $BadClus | 包含所有標記為「有壞扇區」的簇的一個文件。該文件通常被chkdsk(磁盤掃描)工具使用,用於管理所有簇狀態,記錄壞扇區,以及標記空白簇。該文件包含兩個數據流(無論卷是否有壞道):一個包含所有壞扇區編號的無名稱流(如果卷沒有壞扇區則該流長度為零),以及名稱為$Bad的流,包含所有包含記錄在第一個流中的簇。 |
9 | $Secure | 訪問控制表(ACL)數據庫,NTFS將所有ACL信息集中存儲於該數據庫(而非每個文件獨立存儲各自的ACL)以節省磁盤占用並提高執行效率。此部分包含兩個索引,分別是:「$SII」——可能是[來源請求]安全ID索引,以及「$SDH」——安全描述符哈希。注意大部分ACL列表通常都很長,因此這個部分只是索引,記錄的是實際存儲ACL數據的$SDS流的位置。[1] |
10 | $UpCase | Unicode大寫字母表,用於確保在Win32和DOS命名空間下大小寫不敏感。 |
11 | $Extend | 文件系統目錄,用於包含若干操作系統或其它軟件所需要的擴展數據,如$Quota、$ObjId、$Reparse、$UsnJrnl等。 |
12 ... 23 | 保留為 $MFT 擴展項使用。擴展項目是一系列附加MFT記錄,用於描述未在主記錄中包含的屬性。例如,當卷需要磁盤清理,包含太多流,具有長文件名或者非常複雜的安全設定,以及其它特殊情況時,可能會用到保留項目 | |
24 | $Extend\$Quota | 磁盤限額設置。包含兩個索引根目錄,名稱分別為$O和$Q。 |
25 | $Extend\$ObjId | 分布鏈接跟蹤數據。包含一個索引根目錄,名稱為$O。 |
26 | $Extend\$Reparse | 卷上所有重解析點(如符號鏈接)數據。包含一個索引根目錄,名稱為$R。 |
27 ... | file.ext | 常規文件系統項目的起始位置。 |
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記錄的1Kib對齊要求。這部分數據完整地描述了和文件相關聯的所有數據流。注意此處的「流」和文件數據流不是一個概念,而是所有數據信息的統稱。
每個流(或稱屬性)本身包含如下數據:類型(內部通常存儲為一個固定長度的整數或者一個描述符,但通常開發應用程序開發時調用FileOpen()或者FileCreate() API時會使用等效的標識符來代表它)、流名稱(可選,注意和文件名沒有任何關係),以及數據(可選,但大部分流具有數據)。對於NTFS而言,文件的主數據(也即文件內容)、目錄的索引信息、文件的可選數據流、以及文件的所有屬性,處理方式都是完全相同的,他們都是屬性表中的某個屬性而已。
- 對於每個MFT中描述的文件(或非常駐的流描述符存儲區,此概念請參考下文),每種流描述符(使用流類型+流名稱聯合區分)必須唯一。此外,NTFS還對於描述符有一些用於排序的約束要求。
- NTFS預定義了一種稱為「空流」的類型,用於在流存儲區中表明流描述符的結尾。空流必須是每個存儲區中的最後一個流描述符,所有之後的剩餘空間都將被忽略,只包含填充字節(用於滿足MFT的記錄尺寸要求或者非常駐流存儲區的簇尺寸要求)。
- 對於每個MFT記錄,某些類型的流必須存在,例外是整個記錄只有一個空流表示該記錄未使用。
- 某些類型的流不能包含名稱,必須是匿名的。
- 這裡的「某些」包括標準屬性、NTFS的「文件名」流,以及「短文件名」流(注意如果該文件無需考慮對DOS應用程序的兼容性,則「短文件名」流並不一定出現)。有些時候文件也可能只包含「短文件名」而沒有「文件名」,這時候短文件名會代替文件名顯示在資源管理器的「文件名」一欄中。
- 即使流存儲區中包含有「文件名」流,也並不表示文件一定會出現在文件系統中。要顯示文件,該項目還必須要進入卷上的某個目錄的索引表。注意目錄的索引表中除了記錄該文件的MFT記錄編號外,也對文件單獨提供一份MFT記錄、安全描述符、屬性表等,因此理論上單個文件可以被多個目錄「硬鏈接」多次,並且在每個目錄中顯示為不同的名稱。
- 表示文件數據的默認數據流的流類型為$DATA,該數據流沒有名稱。可選數據流使用同樣的流類型,但必須具有流名稱。
- 目錄的默認數據流和文件的情況不同,目錄的數據流(存放文件的索引表)不是匿名的,NTFS會通過目錄的數據流的名稱(如在NTFS 3以上版本中為「$I30」)來表明目錄索引的格式。
可以使用nfi.exe(NTFS文件扇區信息實用工具)查看任意文件或者目錄的數據流,這個實用工具目前包含在Microsoft OEM Support Tools中,可以免費發布。[42]
為了優化小數據文件的資源占用並降低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)允許網絡客戶端改變對文件或數據流的緩存策略,以便於增強性能或降低網絡占用。[43]機會鎖應用到文件某個打開的流上,不影響同一個文件的其它流。
機會鎖可以用於在後台透明訪問文件。如果沒有其它進程訪問服務器文件,網絡客戶端可以避免向文件寫入數據;而如果沒有其他進程正在寫入數據,客戶端可以緩存即將讀取的數據。
Windows支持四種不同類型的機會鎖:
- 等級2(共享):多個讀取,不可寫入(也即讀緩存)。
- 等級1(獨占):任意緩衝方式的獨占訪問(也即讀寫緩存)。
- 批量鎖(也是獨占的):在服務器上打開流,在客戶端關閉流(讀、寫和句柄緩存)。
- 過濾鎖(也是獨占的):當其它程序嘗試訪問流時,應用程序和系統過濾器可以放棄該鎖(讀寫緩存,從Windows 2000開始受支持)
在Windows 7和Windows Server 2008 R2系統中,機會鎖得到增強,支持每個客戶端使用獨立的機會鎖鍵。[44]
Windows NT和後續產品使用UTC作為內部時間戳,並在顯示時進行適當的轉換。也就是說,NTFS時間戳使用UTC模式。
由於歷史原因,不支持NTFS的Windows使用本地時區作為時間戳,而目前版本的Windows對非NTFS分區也是用此方式進行處理。這意味着當文件在NTFS和非NTFS分區間進行移動時,操作系統需要實時轉換時間戳。如果某些文件移動時處於夏令時,而某些文件處於標準時間,則可能移動後的時間可能會產生歧義,特別是當執行時間正好在時制轉換前後時,用戶可能會看到一小時的時間差。基於不同地區的不同夏令時規則,在任意12個月中,可能會產生最多4個小時的永久時間戳錯誤。[45]
互操作性
NTFS具體的內部實現細節屬於商業秘密,這給第三方開發者製作NTFS文件系統處理程序帶來很大的困難。
儘管絕大多數NTFS版本的絕大部分都完全向前以及向後兼容,但在舊版本的Microsoft Windows加載新版本的NTFS卷仍然會產生不少技術問題。這種問題往往來自於同一台計算機的多重啟動功能,或者使用移動硬盤設備傳輸文件。
例如,在不支持的操作系統上嘗試使用帶有「先前版本」(嚴格的說稱為卷影副本)的NTFS分區,會導致先前版本數據丟失。[46]
Windows提供了一個命令行工具「convert.exe」可用於將部分文件系統轉換為NTFS,包括HPFS(僅在Windows NT 3.1、3.5和3.51中受支持)、FAT16和FAT32(在Windows 2000及後續版本中受支持)。
Mac OS X 10.3及後續版本包含對NTFS格式分區的只讀支持。基於GPL授權的NTFS-3G也可以通過用戶空間文件系統在Mac OS X上使用並讀寫NTFS分區。NTFS-3G的開發團隊還提供一個性能更好的商業版本,名稱為「Tuxera NTFS for Mac」。[47] Paragon Software Group也出售可執行讀寫操作的驅動程序,名稱為「NTFS for Mac OS X」,[48]部分希捷(Seagate)硬盤包含該組件。[49]Mac OS X 10.6和後續版本中包含有本機NTFS的寫入支持,默認情況下此功能未激活,可以通過特定方法打開。但有用戶報告此功能不穩定並會導致內核錯誤,可能這也是該功能未啟動或者被宣告的原因之一。[50][51]
完整並安全的對NTFS的讀寫功能由NTFS-3G 驅動程序提供。該驅動程序包含在絕大多數Linux發行版中。同時也存在過時的,大部分僅只讀的解決方案:
- Linux內核2.2:從版本2.2.0開始,可以讀取NTFS分區。
- Linux內核2.6:包含一個由Anton Altaparmakov(來自劍橋大學)和Richard Russon編寫的驅動程序,該驅動程序支持讀取文件以及在部分情況下的改寫文件和調整文件大小。
- NTFSMount:使用ntfsmount可以通過一個用戶級驅動程序對文件和目錄進行有限的讀寫操作。[52]
- 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下進行讀寫。[53] Ahead Software曾經在2002至2004年間開發了一個名為「NTFSREAD」的驅動程序(版本1.200),可用於DR-DOS,並曾包含在他們的Nero Burning ROM軟件中。OpenBSD在2011年5月1日發布的4.9版本中提供了針對i386和amd64體系結構的NTFS只讀支持。[54] Google開發的Chrome OS作業系統也支援NTFS[55]。
有許多第三方工具可以安全地重新調整NTFS分區的大小。在Windows Vista中,Microsoft添加收縮和擴展分區的功能,但該功能非常有限,因為該功能無法整理頁面文件碎片或者標記為不可移動的文件,因此限制對分區的收縮能力。取消頁面文件重新啟動或使用第三方的工具進行磁盤碎片整理也許能改善收縮效果。
另請參閱
參考文獻
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.