NTFS文件系統簡介

原文地址:http://www.cnblogs.com/watertao/archive/2011/11/28/2266595.htmlhtml

一、簡介算法

    NTFS(New Technology File System)是Windows NT以及以後的Windows 2000、Windows XP、Windows Server 200三、Windows Server 200八、Windows Vista和Windows 7的標準文件系統.數據庫

    NTFS取代了文件分配表(FAT)文件系統,爲Microsoft的Windows系列操做系統提供文件系統。NTFS對FAT和HPFS(高性能文件系統)做了若干改進,例如,支持元數據,而且使用了高級數據結構,以便於改善性能、可靠性和磁盤空間利用率,並提供了若干附加擴展功能,如訪問控制列表(ACL)和文件系統日誌。該文件系統的詳細定義屬於商業祕密,Microsoft已經將其註冊爲知識產權產品。瀏覽器

 

二、版本緩存

    NTFS 有五個正式發佈的版本:安全

    1) v1.0,隨 NT 3.1 一塊兒發佈[來源請求],發佈於 1993 年中旬服務器

    2) v1.1,隨 NT 3.5 一塊兒發佈[來源請求],發佈於 1994 年秋季網絡

    3) v1.2,由 NT 3.51(1995 年中旬)和 NT 4(1996 年中旬)提供(有時候也被稱爲「NTFS 4.0」,由於操做系統版本是 4.0)數據結構

    4) v3.0 來自 Windows 2000(有時稱做「NTFS 5.0」)分佈式

    5)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 系統的長文件名支持。V1.2 支持壓縮文件、命名流、基於 ACL(訪問控制列表)的安全性等功能。

    V3.0 支持磁盤限額、加密、稀疏文件、重解析點,更新串行數(USN)日誌、$Extend 文件夾以及其中的文件,並改進了安全描述符,以便於使用相同安全設置的多個文件共享一個安全描述符。

    V3.1 使用冗餘 MFT 記錄數(用於恢復受損的 MFT 文件)擴展了主文件表(MFT)項Windows Vista 提供了事務 NTFS、NTFS 符號連接、收縮卷以及自我恢復功能,但這些附加功能由操做系統提供,而非文件系統自身的功能。

    請不要將 NTFS.sys 文件版本(如 Windows 2000 中引入的 NTFS v5.0)和 NTFS 磁盤格式版本(如 Windows XP 開始的 v3.1)相混淆。NTFS v3.1 磁盤格式自從 Windows XP 開始就保持不變,也被隨後用於 Windows Server 200三、Windows Server 200八、Windows Vista 以及 Windows 7。形成這種混亂的緣由是 NTFS.sys 驅動程序的新功能是由 Windows 操做系統提供的,而非 NTFS 磁盤格式提供的。

 

三、功能簡介

3.1 NTFS 日誌

    NTFS 是一個日誌文件系統,使用 NTFS 日誌($Logfile)記錄卷更改元數據。

    這是 NTFS 一個很是關鍵的功能(FAT/FAT32 不提供此項功能),用於確保其內部的複雜數據結構(比較重要的如卷分配圖、磁盤碎片整理 API 進行的數據轉移操做、MFT(主文件表)記錄的更改狀況(如移動 MFT 記錄中存儲的變長屬性和屬性表))和索引(用於目錄和安全描述符)即便在系統發生崩潰後仍然能保持一致,而且在卷被從新加載後可以方便地對這些關鍵數據結構的失敗提交進行回滾。

3.2 USN 日誌

    USN 日誌(更新串行很多天志)是一項系統管理功能,用於記錄卷中全部文件、數據流、目錄的內容、各項屬性以及安全設置的更改狀況。應用程序能夠利用日誌追蹤卷的更改。對於非系統卷,能夠選擇打開或關閉日誌,當添加一個新卷後,默認狀況下日誌功能處於打開狀態。

3.3 硬連接和短文件名

    硬連接本來用於支持 Windows NT 的 POSIX 子系統,該功能相似於目錄連接,不過做用目標是文件而非目錄。硬連接只能做用到同一個卷的文件中,由於它須要在文件的 MTF 記錄中增長一個額外的文件名記錄。短(8.3)文件名也一樣使用額外文件名實現,以便於實現同步更新。當更改文件的尺寸或屬性時,不會當即更新對應的目錄或者連接,直到打開它們的時候才能體現相對應的變化。

3.4 可選數據流(ADS)

    可選數據流使得一個文件能夠同時和多個數據流相關聯,數據流的表述方式爲「文件名:流名」,例如「text.txt:extrastream」。可選流不會顯示在 Windows 資源管理器中,查看文件大小時它們的大小也不包含在內。若是將文件複製到 FAT 格式的磁盤、附加到電子郵件、上傳到網站,或者移動到任何其它不支持可選流的位置上時,只有主數據流會被保留下來,其它可選流將被所有丟棄。所以,使用可選流來保存重要數據極可能發生意外。NTFS 流從 Windows NT 3.1 開始被引入,起初設計目的是爲了 Services for Macintosh(SFM)可以正確存儲 Macintosh的資源分岔。儘管如今 Windows 服務器已經再也不包含 SFM 功能,不少第三方的Apple 歸檔服務(AFP)產品(例如 Group Logic 的 ExtremeZ-IP)仍然使用文件系統的這項功能。

    有些惡意軟件會使用可選數據流來隱藏程序代碼。一些惡意軟件掃描程序和其它特殊工具如今已經能夠檢查可選流中的內容。 Microsoft 提供了一個叫做 Streams 的工具,使得用戶能夠查看卷中的可選流。

    Internet Explorer 和其它一些瀏覽器會在從網絡上下載的文件中添加一個很是小的可選數據流,用於指示他們是從外來網站得到的,運行的時候可能不安全,所以在打開它們以前系統將會顯示一個提示確認信息。當用戶表示不但願再次看到這個確認對話框的時候,這個可選流將會從下載的文件中被直接刪除。

    有些媒體播放器也嘗試使用可選數據流記錄多媒體文件的自定義元數據以便於用戶管理媒體文件,而這種方式無需修改媒體文件自身的內容(例如 MPEG、OGG 等格式提供的嵌入在文件內的標籤信息)。Windows 資源管理器可能會做爲額外的信息欄顯示這些元數據。使用註冊的 Windows 外殼擴展程序能夠有效地解析這些數據,可是大部分媒體播放器仍是使用本身的獨立數據庫而非可選數據流來保存這些信息。可選數據流的一個問題是受影響的文件上的信息對於全部用戶都是可見的而且是共享的,所以沒法有效地根據每一個用戶的安全設置和我的偏好而進行分別進行管理、設定和保護。

3.5 限額

    磁盤限額是 NTFS v3 提出的功能。該功能容許計算機管理員在支持該功能的 Windows 版本上爲用戶容許佔用的磁盤空間設置閾值,同時也容許管理員跟蹤察看每一個用戶使用的磁盤空間量。管理員能夠爲用戶設置須要收到警告的磁盤空間使用級別,並當他們超過使用上限時拒絕對磁盤的訪問。當 NTFS 的文件壓縮啓用時,磁盤限額不會影響該功能。當應用程序查詢用戶可用的剩餘磁盤空間時,若是設置了磁盤限額,也會收到限額的數值。

    磁盤限額功能在 Basic、Home 和 MediaCenter 版本的 Windows 上不受支持,必須安裝 Professional、Ultimate 或者服務器版本的 Windows,或者上使用 Windows 域中的企業部署工具來使用這項功能。

3.6 稀疏文件

    稀疏文件是包含稀疏數據集的文件,這些文件將儲存文件在不一樣位置的多個片斷的內容,而片斷之間的內容將不會儲存,特別適合大部份內容爲空、只有少許實際數據的文件。當讀取文件的時候,文件系統驅動程序將會對任何不存在的位置上的信息返回 0,所以文件內容看起來幾乎全是零。不少數據庫和科學程序有時會用到稀疏文件。所以,Microsoft 實現了對稀疏文件的高效存儲支持,容許應用程序指定文件的空(零)數據區域。讀取稀疏文件的應用程序可使用常規方法讀取數據,操做系統將根據當前位置的偏移量決定須要返回什麼數據。和壓縮文件相同,文件的實際大小不會影響對磁盤限額的判斷。

3.7 重解析點

    該功能在 NTFS v3 中可用。該功能將在用戶空間中爲文件或目錄添加一個關聯的重解析標記屬性。當對象管理器(請參見Windows NT 線執行)解析文件系統名稱並遇到重解析點屬性時,它將「重解析」名稱,將用戶控制的重解析數據傳遞給全部 Windows 系統加載的文件過濾驅動程序。每一個過濾驅動程序都將檢查重解析數據,判斷是否和該重解析點相關聯。若是過濾驅動程序斷定匹配,則將攔截文件系統調用,並執行本身的特定功能。重解析點用於實現卷加載點、目錄鏈接、分層存儲管理、本機結構存儲,以及單實例存儲。

3.8 目錄鏈接

    相似於卷加載點,但 目錄鏈接將對象鏈接到文件系統中的其餘目錄而非卷。例如,目錄 C:\exampledir 帶有一個目錄鏈接屬性,連接到 D:\linkeddir,則當用戶級別的應用程序訪問時,將自動引用到目錄 D:\linkeddir。該功能在概念上相似於 Unix 的目錄符號連接,只是在 NTFS 中目標必須是另外一個目錄(典型的 Unix 文件系統容許將符號連接鏈接到任何其它類型的文件),而語義上等效於硬連接。

    目錄鏈接(能夠在控制檯中經過命令 MKLINK /J 鏈接名 目標目錄 建立,使用 RMDIR 鏈接名junctionName 刪除)是永久性的,在服務端進行解析時,使用和所屬的卷相同的本地系統或域的安全領域,而且訪問它和它的內容時,使用和目標目錄以及其內容使用一樣的安全設置。但鏈接自己可能擁有獨立的安全設置,而且刪除一個目錄鏈接不會同時刪除目標目錄。

    有些目錄鏈接時 Windows Vista 系統建立的,用於保持和早期版本的 Windows 的兼容性,例如系統驅動器中的 Documents and Settings 文件夾會被鏈接到同一個卷中的 Users 物理目錄上。但這些目錄默認狀況下是隱藏的,而且進行了相關的安全設置,所以 Windows 資源管理器將拒絕外殼或者大部分應用程序直接打開它們,除非使用本機內置的 SYSTEM 帳戶或者本機的 Administrators 用戶組成員訪問(這些帳戶是系統軟件安裝程序所使用的)。這些附加的安全限制多是爲了防止用戶發現兩個看上去相同的文件夾,而後錯誤地刪除它們。

    目錄鏈接屬於軟連接(即便目標目錄已經被刪除,他們也仍然存在),使用一種相似於有限制的符號連接的形式工做(對於目標位置有額外的限制),但它們是通過特殊處理優化的,能夠加快重解析點的處理速度,相對於更新的 NTFS 符號鏈接而言開銷更小,而且能夠在服務器端解析,所以能夠在遠程共享目錄中訪問它們。

3.9 符號連接

    符號連接(或稱軟連接)從 Windows Vista 開始被引入。符號連接在客戶端解析,所以若是共享一個符號連接,則目標將服從客戶端的訪問限制,而非服務端的限制。

    符號連接能夠連接到文件(使用 MKLINK 符號連接 目標文件名 建立),也能夠連接到目錄(使用 MKLINK /D 符號連接 目標目錄 建立),不過和 Unix 符號連接不一樣,必須在建立連接的時候設定連接語義。但建立符號連接的時候目標並不須要存在或者能夠訪問,只有當訪問符號連接的時候纔會檢查目標的可訪問性。NTFS 也會同時檢查符號連接的類型(文件或目錄)是否正確,若是目標存在可是類型不正確,則系統會返回一個找不到目標的錯誤。

    符號連接也能夠引用遠程主機上的共享文件夾,或者其中的文件或者子文件夾。但目標並不會被當即加載,而是在使用 OpenFile() 或者 CreateFile() API 請求打開的時候臨時加載到系統中。符號連接將在被建立的 NTFS 上永久保留,全部類型的符號鏈接均可以經過文件的方式進行刪除,能夠命令行或者腳本中使用 DEL 符號連接 刪除它們。

3.10 分層存儲管理(HSM)

    分層存儲管理是一種轉移必定時間不用的文件到價值更低的儲存介質中的方法。當文件再次被訪問時,文件上的重解析點將斷定文件須要被使用,並將文件從儲存介質中恢復出來。

3.11 卷影複製

    卷影複製(VSC)服務經過將新改寫的數據複製到卷影(寫入時複製)來保存 NTFS 捲上的文件和文件夾的歷史版本。當用戶請求恢復舊早期版本時,舊的文件數據將會覆蓋新的文件數據。該功能也使得數據備份程序能夠存檔當前系統正在使用的文件。對於負載較重的系統,Microsoft 建議將卷影副本設置到單獨的磁盤上,以減少系統主要卷的 I/O 負載。

3.12 文件壓縮

    NTFS 壓縮文件使用多種 LZ77 算法。在 4KB 的簇大小下,文件將以 64KB 爲區塊大小進行壓縮。若是壓縮後區塊尺寸從 64KB 減少到了 60KB 或者更小,則 NTFS 就認爲多餘的 4KB 是空白的稀疏文件簇,也即認爲它們沒有內容。所以,這種模式將會有效的提高隨機訪問的速度。可是在隨即寫入的時候,大文件可能會被分區成很是多的小片斷,片斷之間會有許多很小的空隙。

    壓縮文件最合適用於不多寫入、日常順序訪問、自己沒有被壓縮的文件。壓縮小於 4KB 或者自己已經被壓縮過(如 .zip、.jpg 或者 .avi 格式)的文件可能會致使文件比原來更大而且顯著下降速度。應該儘可能避免壓縮可執行文件,如 .EXE 和 .DLL 文件,由於他們可能內部也會使用 4KB 的大小對內容進行分頁。決不要壓縮引導系統是須要的系統文件,例如驅動程序,或者 NTDLR、winload.exe 或者 BOOTMGR。

壓縮高壓縮比的文件,例如 HTML 或者文本文件,可能會增長對他們的訪問速度,由於解壓縮所需的時間要小於讀取完整數據所花費的時間。

    一般狀況下對於文件的讀寫是透明的,但並不是全部狀況下都始終如此。  Microsoft 建議避免在保存遠程配置文件的服務器系統或者網絡共享位置上使用壓縮,由於這會顯著地增長讓處理器的負擔。

    硬盤空間受限的單用戶操做系統能夠有效地利用 NTFS 壓縮。因爲在計算機中速度最慢的訪問不是 CPU 而是硬盤,所以 NTFS 壓縮能夠同時提升受限制的、慢速儲存空間的空間和速度利用率。

    當某個程序(以下載管理器)沒法建立沒有內容的稀疏文件的時候,NTFS 壓縮也能夠做爲稀疏文件的替代實現方式。

3.13 單實例存儲(SIS)

    當若干個不一樣目錄中存有內容相同的文件時,單實例存儲容許將相同文件歸併到一個單一文件中,並建立對歸併後的文件的引用。單實例存儲包含一個用於管理複製、修改和歸併文件的文件系統過濾器和一個用於搜索須要歸併的相同文件的用戶空間服務(「groveler」)。單實例存儲的主要設計目標是遠程安裝服務器,這些服務器上每每擁有多個包含許多相同文件的安裝鏡像,單實例存儲能夠將它們統一塊兒來。但和硬連接不一樣,每一個文件仍然是獨立的,更改任何一個副本都不會影響其它文件。和寫入時複製相似,該技術不會當即完成內存複製,直到某個副本被更改。

3.14 加密文件系統(EFS)

    加密文件系統(EFS)提供對 NTFS 捲上任意文件和文件夾的用戶透明的強保護。 加密文件系統與 EFS 服務、Microsoft 的加密應用程序接口(CryptoAPI)以及 EFS 文件運行時庫(FSRTL)聯合工做。 EFS 使用塊對稱密鑰(也被稱爲「文件加密密鑰(FEK)」)加密文件,這比起使用非對稱密鑰加密在加密和解密大量數據時消耗的時間較少。該對稱密鑰使用一個和加密文件的用戶相關的公鑰加密文件,加密後的數據儲存在被加密文件的可選數據流中。當須要解密文件時,文件系統使用用戶的密鑰解密儲存在文件頭中的對稱密鑰,而後使用該對稱密鑰解密文件。這些操做在文件系統級別完成,所以對用戶來講是透明的。同時,爲了處理用戶丟失密鑰的狀況,加密文件系統中提供了對附加解密密鑰的支持,所以恢復代理在須要時仍然能夠訪問數據。NTFS 提供的加密和壓縮功能是互相排斥的——NTFS 只能使用其中一種功能,另外一種功能可使用其它第三方工具完成。

    EFS 在 Basic、Home 和 MediaCenter 版本的 Windows 上不受支持,必須安裝 Professional、Ultimate 或者服務器版本的 Windows,或者上使用 Windows 域中的企業部署工具來使用這項功能。

3.15 事務 NTFS

    在 Windows Vista 中,應用程序可使用事務 NTFS(Transactional NTFS)將一系列對文件的更改歸組到一個事務中。事務可以確保全部更改要麼同時生效,要麼同時做廢,並能確保在事務提交完成前,外部應用程序沒法獲知任何更改。

    該技術使用和卷影複製相似的技術,以確保被改寫的數據能夠安全地回滾,通用日誌文件系統的日誌將記錄下還沒有成功提交或者已經提交但還沒有徹底生效的事務,一般狀況下這是由於事務的某個參與者在提交過程當中系統意外崩潰引發的。

    事務 NTFS 並不要求事務必須在本地 NTFS 卷中,也能夠包含在其它位置的事務數據或操做,例如在其它卷中、本地註冊表中、 SQL 數據庫中、系統服務或者遠程服務中存儲的數據。這些事務使用一個特定的服務「分佈事務協調器(DTC)」在網絡級別協調全部參與者,以確保全部參與者都能接收到一樣的提交狀態,以及傳輸將任何參與者確認的更改(這樣其它參與者就能夠清理過時的緩存數據或者回滾還沒有提交的更改)。一個常見的用途是,利用事務 NTFS 能夠很容易地建立一個網絡級別的一致性分佈式文件系統,而且每一個參與者參與者均可以保留文件的脫機緩存。

 

四、內部實現

    在 NTFS 中,全部文件數據——文件名、建立日期、訪問權限,以及內容——都做爲元數據儲存在主文件表中。這種抽象的實現方式使得隨着 Windows NT 的發展而添加文件系統功能變得很是容易。一個很典型的例子是爲使用 Active Directory(活動目錄)的應用程序添加用於索引的字段。

    NTFS 容許爲名稱編碼(包括文件名稱、流名稱、索引名稱等)使用任意串行的 16 位值。這意味着支持 UTF-16 碼位,但文件系統不會檢查某個 UTF-16 串行是否有效(也即容許任意短整數串行,不受 Unicode 標準的限制)。

    在內部,NTFS 使用 B+樹索引文件系統數據。儘管該方式實現較爲複雜,但可以在大多數狀況下提升文件的查找速度。文件系統日誌用於確保文件的元數據完整,而不是孤立的文件內容。相比於使用 FAT 的文件系統,使用 NTFS 的文件系統可以提升可靠性。

    主文件表(MFT)包含每一個文件及目錄的元數據,以及 NTFS 卷的元文件。這其中包括文件名、位置、大小,以及權限。它的結構和算法被設計爲能夠最小化磁盤碎片。目錄項包含一個文件名和一個「文件 ID」,該 ID 表示文件在主文件表中的記錄編號。文件 ID 同時包含重複使用計數值,用於檢測過時的引用。

4.1 元文件

    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 的流的位置。
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)。

相關文章
相關標籤/搜索