NTFS文件系統詳細分析node
第一部分 什麼是NTFS文件系統數據庫
想要了解NTFS,咱們首先應該認識一下FAT。FAT(File Allocation Table)是「文件分配表」的意思。對咱們來講,它的意義在於對硬盤分區的管理。FAT16、FAT32、NTFS是目前最多見的三種文件系統。
FAT16:咱們之前用的DOS、Windows 95都使用FAT16文件系統,如今經常使用的Windows 98/2000/XP等系統均支持FAT16文件系統。它最大能夠管理大到2GB的分區,但每一個分區最多隻能有65525個簇(簇是磁盤空間的配置單位)。隨着硬盤或分區容量的增大,每一個簇所佔的空間將愈來愈大,從而致使硬盤空間的浪費。
FAT32:隨着大容量硬盤的出現,從Windows 98開始,FAT32開始流行。它是FAT16的加強版本,能夠支持大到2TB(2048GB)的分區。FAT32使用的簇比FAT16小,從而有效地節約了硬盤空間。
NTFS:微軟Windows NT內核的系列操做系統支持的、一個特別爲網絡和磁盤配額、文件加密等管理安全特性設計的磁盤格式。隨着以NT爲內核的Windows 2000/XP的普及,不少我的用戶開始用到了NTFS。NTFS也是以簇爲單位來存儲數據文件,但NTFS中簇的大小並不依賴於磁盤或分區的大小。簇尺寸的縮小不但下降了磁盤空間的浪費,還減小了產生磁盤碎片的可能。NTFS支持文件加密管理功能,可爲用戶提供更高層次的安全保證。數組
在NTFS文件系統中,文件存取是按簇進行分配,一個簇必需是物理扇區的整數倍,並且老是2的整數次方。NTFS文件系統並不去關心什麼是扇區,也不會去關心扇區到底有多大(如是否是512字節),而簇大小在使用格式化程序時則會由格式化程序根據卷大小自動的進行分配。
文件經過主文件表(MFT)來肯定其在磁盤上的存儲位置。主文件表是一個對應的數據庫,由一系列的文件記錄組成--卷中每個文件都有一個文件記錄(對於大型文件還可能有多個記錄與之相對應)。主文件表自己也有它本身的文件記錄。
NTFS捲上的每一個文件都有一個64位(bit)稱爲文件引用號(File Reference Number,也稱文件索引號)的惟一標識。文件引用號由兩部分組成:一是文件號,二是文件順序號。文件號爲48位,對應於該文件在MFT中的位置。文件順序號隨着每次文件記錄的重用而增長,這是爲NTFS進行內部一致性檢查而設計的。
NTFS使用邏輯簇號(Logical Cluster Number,LCN)和虛擬簇號(Virtual Cluster Number,VCN)來進行簇的定位。LCN是對整個卷中全部的簇從頭至尾所進行的簡單編號。卷因子乘以LCN,NTFS就可以獲得捲上的物理字節偏移量,從而獲得物理磁盤地址。VCN則是對屬於特定文件的簇從頭至尾進行編號,以便於引用文件中的數據。VCN能夠映射成LCN,而沒必要要求在物理上連續。
NTFS的目錄只是一個簡單的文件名和文件引用號的索引,若是目錄的屬性列表小於一個記錄的長度,那麼該目錄的全部信息都存儲在主文件表的記錄中,對於大於記錄的目錄則使用B+樹進行管理。
主文件表中的基本文件記錄中有一個指針指向一個存儲很是駐索引緩衝--包括該目錄下全部下一級子目錄和文件的外部簇,而B+樹結構便於大型目錄中文件和子目錄的快速查找。
主文件表中的基本文件記錄中有一個指針指向一個存儲很是駐索引緩衝--包括該目錄下全部下一級子目錄和文件的外部簇,而B+樹結構便於大型目錄中文件和子目錄的快速查找。
在NTFS中,全部存儲在捲上的數據都包含在文件中,包括用來定位和獲取文件的數據結構,引導程序和記錄這個卷的記錄(NTFS元數據)的位圖,這體現了NTFS的原則:磁盤上的任何事物都爲文件。在文件中存儲一切使得文件系統很容易定位和維護數據,而在NTFS中,卷中全部存放的數據均在一個叫作MFT的文件記錄數組中,稱爲主文件表(Master File Table),MFT是由高級格式化產生的。而MFT則由文件記錄(File Record)數組構成。File Record的大小通常是固定的,無論簇的大小是多少,均爲1KB,這個概念至關於Linux中的inode(i節點)。File Record在MFT文件記錄數組中物理上是連續的,且從0開始編號。MFT僅供系統自己組織、架構文件系統使用,這在NTFS中稱爲元數據(metadata)。其中最基本的前16個記錄是操做系統使用的很是重要的元數據文件。這些NTFS主文件表的重要的元數據文件都是以$(美圓符號)開始的名字,因此是隱藏文件,在Windows 2000中不能使用dir命令(甚至加上/ah參數)像普通文件同樣列出這些元數據文件。實際上File System Driver(ntfs.sys)維護了一個系統變量NTFS Protect System Files用於隱藏這些元數據。可是微軟公司也提供了一個OEM TOOL,叫作NFI.EXE,用此工具能夠轉儲NTFS主文件表的重要的元數據文件(元數據:是存儲在捲上支持文件系統格式管理的數據。它不能被應用程序來訪問,它只能爲系統提供服務),使用NFI顯示結果以下:
C:\>nfi C: |MORE
而這些元數據文件文件是系統驅動程序裝配卷所必需的,WINDOWS 2000給每一個分區賦予一個盤符並不表示該分區包含有WINDOWS 2000能夠識別的文件系統格式,若是一旦主文件表損壞,那麼該分區在WINDOWS 2000下是沒法讀取的。爲了使該分區可以在WINDOWS 2000下能被識別,也就是必須首先創建WINDOWS 2000能夠識別的文件系統格式即主文件表,這可經過高級格式化該分區來完成。衆所周知,Windows以簇號來定位文件在磁盤存儲的位置,在FAT格式的文件系統中有關簇號的指針是包含在FAT表中的,而在NTFS中有關簇號的指針是包含在$MFT及$MFTMirr文件中的。
NTFS元文件
伴隨着以上這些新增功能的是更多的用於存放與功能相關的數據的元文件。最後,在下面的表中羅列出NTFS5中全部的元文件:
每一個MFT記錄都對應着不一樣的文件,若是一個文件有不少屬性或是分散成不少碎片,就極可能須要多個文件記錄。這時,存放其文件記錄位置的第一個記錄就叫作"基文件記錄"(base file record)。
MFT中的第1個記錄就是MFT自身。因爲MFT文件自己的重要性,爲了確保文件系統結構的可靠性,系統專門爲它準備了一個鏡像文件($MftMirr),也就是MFT中的第2個記錄。
第3個記錄是日誌文件($LogFile)。該文件是NTFS爲實現可恢復性和安全性而設計的。當系統運行時,NTFS就會在日誌文件中記錄全部影響NTFS卷結構的操做,包括文件的建立和改變目錄結構的命令,例如複製,從而在系統失敗時可以恢復NTFS卷。
第4個記錄是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一個標明該磁盤是否損壞的標誌位(NTFS系統以此決定是否須要調用Chkdsk程序來進行修復)。
第5個記錄是屬性定義表($AttrDef,attribute definition table),其中存放了卷所支持的全部文件屬性,並指出它們是否能夠被索引和恢復等。
第6個記錄是根目錄(\),其中保存了存放於該卷根目錄下全部文件和目錄的索引。在訪問了一個文件後,NTFS就保留該文件的MFT引用,第二次就可以直接進行對該文件的訪問。
第7個記錄是位圖文件($Bitmap)。NTFS卷的分配狀態都存放在位圖文件中,其中每一位(bit)表明卷中的一簇,標識該簇是空閒的仍是已被分配了的,因爲該文件能夠很容易的被擴大,因此NTFS的卷能夠很方便的動態的擴大,而FAT格式的文件系統因爲涉及到FAT表的變化,因此不能隨意的對分區大小進行調整。
第8個記錄是引導文件($Boot),它是另外一個重要的系統文件,存放着Windows 2000/XP的引導程序代碼。該文件必須位於特定的磁盤位置纔可以正確地引導系統。該文件是在Format程序運行時建立的,這正體現了NTFS把磁盤上的全部事物都當作是文件的原則。這也意味着雖然該文件享受NTFS系統的各類安全保護,但仍是能夠經過普通的文件I/O操做來修改。
第9個記錄是壞簇文件($BadClus),它記錄了磁盤上該卷中全部的損壞的簇號,防止系統對其進行分配使用。
第10個記錄是安全文件($Secure),它存儲了整個卷的安全描述符數據庫。NTFS文件和目錄都有各自的安全描述符,爲了節省空間,NTFS將具備相同描述符的文件和目錄存放在一個公共文件中。
第11個記錄爲大寫文件($UpCase,upper case file),該文件包含一個大小寫字符轉換表。
第12個記錄是擴展元數據目錄($Extended metadata directory)。
第13個記錄是重解析點文件($Extend\$Reparse)。
第14個記錄是變動日誌文件($Extend\$UsnJrnl)。
第15個記錄是配額管理文件($Extend\$Quota)。
第16個記錄是對象ID文件($Extend\$ObjId)。
第17~23記錄是是系統保留記錄,用於未來擴展。
MFT的前16個元數據文件是如此重要,爲了防止數據的丟失,NTFS系統在該卷文件存儲部分的正中央對它們進行了備份,參見下圖。
NTFS把磁盤分紅了兩大部分,其中大約12%分配給了MFT,以知足其不斷增加的文件數量。爲了保持MFT元文件的連續性,MFT對這12%的空間享有獨佔權。餘下的88%的空間被分配用來存儲文件。而剩餘磁盤空間則包含了全部的物理剩餘空間--MFT剩餘空間也包含在裏面。MFT空間的使用機制能夠這樣來描述:當文件耗盡了存儲空間時,Windows操做系統會簡單地減小MFT空間,並把它分配給文件存儲。當有剩餘空間時,這些空間又會從新被劃分給MFT。雖然系統盡力保持MFT空間的專用性,可是有時不得不作出犧牲。儘管MFT碎片有時是沒法忍受的,卻沒法阻止它的發生。
那麼NTFS究竟是怎麼經過MFT來訪問卷的呢?首先,當NTFS訪問某個卷時,它必須"裝載"該卷:NTFS會查看引導文件(在圖中的$Boot元數據文件定義的文件),找到MFT的物理磁盤地址。而後它就從文件記錄的數據屬性中得到VCN到LCN的映射信息,並存儲在內存中。這個映射信息定位了MFT的運行(run或extent)在磁盤上的位置。接着,NTFS再打開幾個元數據文件的MFT記錄,並打開這些文件。若有必要NTFS開始執行它的文件系統恢復操做。在NTFS打開了剩餘的元數據文件後,用戶就能夠開始訪問該捲了。安全
第二部分 文件和目錄記錄網絡
NTFS將文件做爲屬性/屬性值的集合來處理,這一點與其餘文件系統不同。文件數據就是未命名屬性的值,其餘文件屬性包括文件名、文件擁有者、文件時間標記等。下圖顯示了一個用於小文件的MFT記錄。
每一個屬性由單個的流(stream)組成,即簡單的字符隊列。嚴格地說,NTFS並不對文件進行操做,而只是對屬性流進行讀寫。NTFS提供對屬性流的各類操做:建立、刪除、讀取(字節範圍)以及寫入(字節範圍)。讀寫操做通常是針對文件的未命名屬性的,對於已命名的屬性則能夠經過已命名的數據流句法來進行操做。
一個文件一般佔用一個文件記錄。然而,當一個文件具備不少項屬性值或很零碎的時候,就可能須要佔用一個以上的文件記錄。這種狀況下,第一個文件記錄是其基本的文件記錄,存儲有該文件須要的其它文件記錄的位置。小文件和文件夾(典型的如1500字節或更少)將所有存儲在文件的MFT記錄裏。
文件夾記錄包括索引信息,小文件夾記錄徹底存儲在MFT結構內,然而大的文件夾則被組織成B+樹結構,用一個指針指向一個外部簇,該簇用來存儲那些MFT內存儲不了的文件夾的屬性。
NTFS捲上文件的經常使用屬性在下表中列出(並非全部文件都有全部這些屬性)。
常駐屬性與很是駐屬性
當一個文件很小時,其全部屬性和屬性值可存放在MFT的文件記錄中。當屬性值能直接存放在MFT中時,該屬性就稱爲常駐屬性(resident attribute)。有些屬性老是常駐的,這樣NTFS才能夠肯定其餘很是駐屬性。例如,標準信息屬性和根索引就老是常駐屬性。
每一個屬性都是以一個標準頭開始的,在頭中包含該屬性的信息和NTFS一般用來管理屬性的信息。該頭老是常駐的,並記錄着屬性值是否常駐、對於常駐屬性,頭中還包含着屬性值的偏侈量和屬性值的長度。
若是屬性值能直接存放在MFT中,那麼NTFS對它的訪問時間就將大大縮短。NTFS只需訪問磁盤一次,就可當即得到數據;而沒必要像FAT文件系統那樣,先在FAT表中查找文件,再讀出連續分配的單元,最後找到文件的數據。
小文件或小目錄的全部屬性,都可以在MFT中常駐。小文件的未命名屬性能夠包括全部文件數據。創建一個小文件以下圖所示:
該文件的內容
文件屬性
如經過NFI查看文件"新建 文本文檔.txt"的文件記錄號爲36,顯示內容以下:
File 36
\新建 文本文檔.txt數據結構
$STANDARD_INFORMATION (resident)
$FILE_NAME (resident)
$FILE_NAME (resident)
$DATA (resident)
從顯示內容能夠看出文件的所有屬性都是常駐屬性,包括DATA屬性,沒有很是駐屬性,因此,用WINHEX打開MFT,查看該文件記錄,有以下圖的內容
小文件的文件記錄
小目錄的索引根屬性能夠包括其中全部文件和子目錄的索引。參見下圖
小目錄的MFT記錄
大文件或大目錄的全部屬性,就不可能都常駐在MFT中。若是一個屬性(如文件數據屬性)太大而不能存放在只有1KB的MFT文件記錄中,那麼NTFS將從MFT以外分配區域。這些區域一般稱爲一個運行(run)或一個盤區(extent),它們可用來存儲屬性值,如文件數據。若是之後屬性值又增長,那麼NTFS將會再分配一個運行,以便用來存儲額外的數據。值存儲在運行中而不是在MFT文件記錄中的屬性稱爲很是駐屬性(nonresident attribute)。NTFS決定了一個屬性是常駐仍是很是駐的;而屬性值的位置對訪問它的進程而言是透明的。
當一個屬性爲很是駐時,如大文件的數據,它的頭部包含了NTFS須要在磁盤上定位該屬性值的有關信息。下圖顯示了一個存儲在兩個運行中的很是駐屬性。
存儲在兩個運行中的很是駐屬性
在標準屬性中,只有能夠增加的屬性纔是很是駐的。對文件來講,可增加的屬性有數據、屬性列表等。標準信息和文件名屬性老是常駐的。
一個大目錄也可能包括很是駐屬性(或屬性部分),參見下圖。在該例中,MFT文件記錄沒有足夠空間來存儲大目錄的文件索引。其中,一部分索引存放在索引根屬性中,而另外一部分則存放在叫做"索引緩衝區"(index buffer)的很是駐運行中。這裏,索引根、索引分配以及位圖屬性都是簡化表示的,這些屬性將在後面詳細介紹。對目錄而言,索引根的頭及部分值應是常駐的。
大目錄的MFT記錄
當一個文件(或目錄)的屬性不能放在一個MFT文件記錄中,而須要分開分配時,NTFS經過VCN-LCN之間的映射關係來記錄運行(run)或盤區狀況。LCN用來爲整個卷中的簇按順序從0到n進行編號,而VCN則用來對特定文件所用的簇按邏輯順序從0到m進行編號。下圖顯示了一個很是駐數據屬性的運行所使用的VCN與LCN編號。
很是駐數據屬性的VCN
當該文件含有超過2個運行時,則第三個運行從VCN8開始,數據屬性頭部含有前兩個運行VCN的映射,這便於NTFS對磁盤文件分配的查詢。爲了便於NTFS快速查找,具備多個運行文件的常駐數據屬性頭中包含了VCN-LCN的映射關係,參見下圖
很是駐數據屬性的VCN-LCN映射
雖然數據屬性經常因太大而存儲在運行中,可是其餘屬性也可能因MFT文件記錄沒有足夠空間而須要存儲在運行中。另外,若是一個文件有太多的屬性而不能存放在MFT記錄中,那麼第二個MFT文件記錄就可用來容納這些額外的屬性(或很是駐屬性的頭)。在這種狀況下,一個叫做"屬性列表"(attribute list)的屬性就加進來。屬性列表包括文件屬性的名稱和類型代碼以及屬性所在MFT的文件引用。屬性列表一般用於太大或太零散的文件,這種文件因VCN-LCN映射關係太大而須要多個MFT文件記錄。具備超過200個運行的文件一般須要屬性列表。
MFT文件記錄結構分析
主文件表MFT的文件記錄由記錄頭和屬性列表組成,由"FF FF FF FF"結束,通常大小爲1K,或一個簇大小(這樣通常就更大),記錄頭包括如下一些域:
偏移 長度(字節) 屬性
0X00 4 標誌,必定是"FILE"
0X04 2 更新序列US的偏移
0X06 2 更新序列號USN的大小與數組,包括第一個字節
0X08 8 日誌文件序列號LSN
0X10 2 序列號(SN)
0X12 2 硬鏈接數
0X14 2 第一個屬性的偏移地址
0X16 2 標誌,1表示記錄正在使用,2表示該記錄爲目錄
0X18 4 記錄頭和屬性的總長度,即文件記錄的實際長度,
0X1C 4 總共分配給記錄的長度
0X20 8 基本文件記錄中的文件索引號
0X28 2 下一屬性ID
0X2A 2 XP中使用,邊界
0X2C 4 XP中使用,本文件記錄號
每次記錄被修改都將致使日誌文件序列號$LogFile Sequence Number(LSN)發生變化。
序列號Sequence Number(SN)用於記錄主文件表記錄被重複使用的次數。
硬鏈接數Hard Link Count記錄硬鏈接的數目,只出如今基本文件記錄中。
文件記錄的實際長度是文件記錄在磁盤上實際佔用的字節空間。
基本文件記錄中的文件索引號,對於基本文件記錄,其值爲0,若是不爲0,則是一個主文件表的文件索引號,指向所屬的基本文件記錄中的文件記錄號,在基本文件記錄中包含有擴展文件記錄的信息,存儲在"屬性列表ATTRIBUTE_LIST"屬性中。
屬性列表是可變長度區,以"FF FF FF FF"結束,對於1K長度的MFT記錄,屬性列表的起始偏移爲0x30。架構
第三部分 索引記錄結構分析ide
每個索引記錄都是由一個標準的索引頭和一些包含索引鍵和索引數據的塊組成的。索引記錄的大小在引導記錄 $Boot中定義,通常老是4KB。
標準索引頭的結構以下:工具
偏移 大小 說明
0X00 4 老是"INDX"
0X04 2 更新序號偏移
0X06 2 更新序列號USN的大小與排列,包括第一個字節
0X08 8 日誌文件序列號LSN
0X10 8 該索引緩衝在索引分配中的索引VCN
0X18 4 索引入口的偏移(相對於0X18)
0X1C 4 索引入口的大小(相對於0X18)
0X20 4 索引入口的分配大小(相對於0X18)
0X24 1 非頁級節點爲1(有子索引)
0X25 3 老是0
0X28 2 更新序列號
0X2A 2S-2 更新序列排列加密
經常使用索引列表
名稱 索引 說明
$I30 文件名 目錄使用
$SDH 安全描述 $SECURE
$SII 安全IDS $SECURE
$O 對象IDS $OBJID
$O 全部者IDS $QUOTA
$Q 配額 $QUOTA
$R 重解析點 $REPARSE
第四部分 FAT32怎樣轉換成NTFS
Windows 2000/XP提供了分區格式轉換工具「Convert.exe」。Convert.exe是Windows 2000附帶的一個DOS命令行程序,經過這個工具能夠直接在不破壞FAT文件系統的前提下,將FAT轉換爲NTFS。它的用法很簡單,先在Windows 2000環境下切換到DOS命令行窗口,在提示符下鍵入:
D:>convert 須要轉換的盤符 /FS:NTFS
如系統E盤原來爲FAT16/32,如今須要轉換爲NTFS,可以使用以下格式:
D:>convert e: /FS:NTFS
全部的轉換將在系統從新啓動後完成。
此外,你還可使用專門的轉換工具,如著名的硬盤無損分區工具Partition Magic,使用它完成磁盤文件格式的轉換也是很是容易的。首先在界面中的磁盤分區列表中選擇須要轉換的分區。從界面按鈕條中選擇「Convert Partition」按鈕,或者是從界面菜單條「Operations」項下拉菜單中選擇「Convert」命令。激活該項功能界面。在界面中選擇轉換輸出爲「NTFS」,以後單擊「OK」按鈕返回程序主界面。單擊界面右下角的「Apply」添加設置。此後系統會從新引導啓動,並完成分區格式的轉換操做。
NTFS文件系統詳細分析
第一部分 什麼是NTFS文件系統
想要了解NTFS,咱們首先應該認識一下FAT。FAT(File Allocation Table)是「文件分配表」的意思。對咱們來講,它的意義在於對硬盤分區的管理。FAT16、FAT32、NTFS是目前最多見的三種文件系統。
FAT16:咱們之前用的DOS、Windows 95都使用FAT16文件系統,如今經常使用的Windows 98/2000/XP等系統均支持FAT16文件系統。它最大能夠管理大到2GB的分區,但每一個分區最多隻能有65525個簇(簇是磁盤空間的配置單位)。隨着硬盤或分區容量的增大,每一個簇所佔的空間將愈來愈大,從而致使硬盤空間的浪費。
FAT32:隨着大容量硬盤的出現,從Windows 98開始,FAT32開始流行。它是FAT16的加強版本,能夠支持大到2TB(2048GB)的分區。FAT32使用的簇比FAT16小,從而有效地節約了硬盤空間。
NTFS:微軟Windows NT內核的系列操做系統支持的、一個特別爲網絡和磁盤配額、文件加密等管理安全特性設計的磁盤格式。隨着以NT爲內核的Windows 2000/XP的普及,不少我的用戶開始用到了NTFS。NTFS也是以簇爲單位來存儲數據文件,但NTFS中簇的大小並不依賴於磁盤或分區的大小。簇尺寸的縮小不但下降了磁盤空間的浪費,還減小了產生磁盤碎片的可能。NTFS支持文件加密管理功能,可爲用戶提供更高層次的安全保證。
在NTFS文件系統中,文件存取是按簇進行分配,一個簇必需是物理扇區的整數倍,並且老是2的整數次方。NTFS文件系統並不去關心什麼是扇區,也不會去關心扇區到底有多大(如是否是512字節),而簇大小在使用格式化程序時則會由格式化程序根據卷大小自動的進行分配。
文件經過主文件表(MFT)來肯定其在磁盤上的存儲位置。主文件表是一個對應的數據庫,由一系列的文件記錄組成--卷中每個文件都有一個文件記錄(對於大型文件還可能有多個記錄與之相對應)。主文件表自己也有它本身的文件記錄。
NTFS捲上的每一個文件都有一個64位(bit)稱爲文件引用號(File Reference Number,也稱文件索引號)的惟一標識。文件引用號由兩部分組成:一是文件號,二是文件順序號。文件號爲48位,對應於該文件在MFT中的位置。文件順序號隨着每次文件記錄的重用而增長,這是爲NTFS進行內部一致性檢查而設計的。
NTFS使用邏輯簇號(Logical Cluster Number,LCN)和虛擬簇號(Virtual Cluster Number,VCN)來進行簇的定位。LCN是對整個卷中全部的簇從頭至尾所進行的簡單編號。卷因子乘以LCN,NTFS就可以獲得捲上的物理字節偏移量,從而獲得物理磁盤地址。VCN則是對屬於特定文件的簇從頭至尾進行編號,以便於引用文件中的數據。VCN能夠映射成LCN,而沒必要要求在物理上連續。
NTFS的目錄只是一個簡單的文件名和文件引用號的索引,若是目錄的屬性列表小於一個記錄的長度,那麼該目錄的全部信息都存儲在主文件表的記錄中,對於大於記錄的目錄則使用B+樹進行管理。
主文件表中的基本文件記錄中有一個指針指向一個存儲很是駐索引緩衝--包括該目錄下全部下一級子目錄和文件的外部簇,而B+樹結構便於大型目錄中文件和子目錄的快速查找。
主文件表中的基本文件記錄中有一個指針指向一個存儲很是駐索引緩衝--包括該目錄下全部下一級子目錄和文件的外部簇,而B+樹結構便於大型目錄中文件和子目錄的快速查找。
在NTFS中,全部存儲在捲上的數據都包含在文件中,包括用來定位和獲取文件的數據結構,引導程序和記錄這個卷的記錄(NTFS元數據)的位圖,這體現了NTFS的原則:磁盤上的任何事物都爲文件。在文件中存儲一切使得文件系統很容易定位和維護數據,而在NTFS中,卷中全部存放的數據均在一個叫作MFT的文件記錄數組中,稱爲主文件表(Master File Table),MFT是由高級格式化產生的。而MFT則由文件記錄(File Record)數組構成。File Record的大小通常是固定的,無論簇的大小是多少,均爲1KB,這個概念至關於Linux中的inode(i節點)。File Record在MFT文件記錄數組中物理上是連續的,且從0開始編號。MFT僅供系統自己組織、架構文件系統使用,這在NTFS中稱爲元數據(metadata)。其中最基本的前16個記錄是操做系統使用的很是重要的元數據文件。這些NTFS主文件表的重要的元數據文件都是以$(美圓符號)開始的名字,因此是隱藏文件,在Windows 2000中不能使用dir命令(甚至加上/ah參數)像普通文件同樣列出這些元數據文件。實際上File System Driver(ntfs.sys)維護了一個系統變量NTFS Protect System Files用於隱藏這些元數據。可是微軟公司也提供了一個OEM TOOL,叫作NFI.EXE,用此工具能夠轉儲NTFS主文件表的重要的元數據文件(元數據:是存儲在捲上支持文件系統格式管理的數據。它不能被應用程序來訪問,它只能爲系統提供服務),使用NFI顯示結果以下:
C:\>nfi C: |MORE
而這些元數據文件文件是系統驅動程序裝配卷所必需的,WINDOWS 2000給每一個分區賦予一個盤符並不表示該分區包含有WINDOWS 2000能夠識別的文件系統格式,若是一旦主文件表損壞,那麼該分區在WINDOWS 2000下是沒法讀取的。爲了使該分區可以在WINDOWS 2000下能被識別,也就是必須首先創建WINDOWS 2000能夠識別的文件系統格式即主文件表,這可經過高級格式化該分區來完成。衆所周知,Windows以簇號來定位文件在磁盤存儲的位置,在FAT格式的文件系統中有關簇號的指針是包含在FAT表中的,而在NTFS中有關簇號的指針是包含在$MFT及$MFTMirr文件中的。
NTFS元文件
伴隨着以上這些新增功能的是更多的用於存放與功能相關的數據的元文件。最後,在下面的表中羅列出NTFS5中全部的元文件:
每一個MFT記錄都對應着不一樣的文件,若是一個文件有不少屬性或是分散成不少碎片,就極可能須要多個文件記錄。這時,存放其文件記錄位置的第一個記錄就叫作"基文件記錄"(base file record)。
MFT中的第1個記錄就是MFT自身。因爲MFT文件自己的重要性,爲了確保文件系統結構的可靠性,系統專門爲它準備了一個鏡像文件($MftMirr),也就是MFT中的第2個記錄。
第3個記錄是日誌文件($LogFile)。該文件是NTFS爲實現可恢復性和安全性而設計的。當系統運行時,NTFS就會在日誌文件中記錄全部影響NTFS卷結構的操做,包括文件的建立和改變目錄結構的命令,例如複製,從而在系統失敗時可以恢復NTFS卷。
第4個記錄是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一個標明該磁盤是否損壞的標誌位(NTFS系統以此決定是否須要調用Chkdsk程序來進行修復)。
第5個記錄是屬性定義表($AttrDef,attribute definition table),其中存放了卷所支持的全部文件屬性,並指出它們是否能夠被索引和恢復等。
第6個記錄是根目錄(\),其中保存了存放於該卷根目錄下全部文件和目錄的索引。在訪問了一個文件後,NTFS就保留該文件的MFT引用,第二次就可以直接進行對該文件的訪問。
第7個記錄是位圖文件($Bitmap)。NTFS卷的分配狀態都存放在位圖文件中,其中每一位(bit)表明卷中的一簇,標識該簇是空閒的仍是已被分配了的,因爲該文件能夠很容易的被擴大,因此NTFS的卷能夠很方便的動態的擴大,而FAT格式的文件系統因爲涉及到FAT表的變化,因此不能隨意的對分區大小進行調整。
第8個記錄是引導文件($Boot),它是另外一個重要的系統文件,存放着Windows 2000/XP的引導程序代碼。該文件必須位於特定的磁盤位置纔可以正確地引導系統。該文件是在Format程序運行時建立的,這正體現了NTFS把磁盤上的全部事物都當作是文件的原則。這也意味着雖然該文件享受NTFS系統的各類安全保護,但仍是能夠經過普通的文件I/O操做來修改。
第9個記錄是壞簇文件($BadClus),它記錄了磁盤上該卷中全部的損壞的簇號,防止系統對其進行分配使用。
第10個記錄是安全文件($Secure),它存儲了整個卷的安全描述符數據庫。NTFS文件和目錄都有各自的安全描述符,爲了節省空間,NTFS將具備相同描述符的文件和目錄存放在一個公共文件中。
第11個記錄爲大寫文件($UpCase,upper case file),該文件包含一個大小寫字符轉換表。
第12個記錄是擴展元數據目錄($Extended metadata directory)。
第13個記錄是重解析點文件($Extend\$Reparse)。
第14個記錄是變動日誌文件($Extend\$UsnJrnl)。
第15個記錄是配額管理文件($Extend\$Quota)。
第16個記錄是對象ID文件($Extend\$ObjId)。
第17~23記錄是是系統保留記錄,用於未來擴展。
MFT的前16個元數據文件是如此重要,爲了防止數據的丟失,NTFS系統在該卷文件存儲部分的正中央對它們進行了備份,參見下圖。
NTFS把磁盤分紅了兩大部分,其中大約12%分配給了MFT,以知足其不斷增加的文件數量。爲了保持MFT元文件的連續性,MFT對這12%的空間享有獨佔權。餘下的88%的空間被分配用來存儲文件。而剩餘磁盤空間則包含了全部的物理剩餘空間--MFT剩餘空間也包含在裏面。MFT空間的使用機制能夠這樣來描述:當文件耗盡了存儲空間時,Windows操做系統會簡單地減小MFT空間,並把它分配給文件存儲。當有剩餘空間時,這些空間又會從新被劃分給MFT。雖然系統盡力保持MFT空間的專用性,可是有時不得不作出犧牲。儘管MFT碎片有時是沒法忍受的,卻沒法阻止它的發生。
那麼NTFS究竟是怎麼經過MFT來訪問卷的呢?首先,當NTFS訪問某個卷時,它必須"裝載"該卷:NTFS會查看引導文件(在圖中的$Boot元數據文件定義的文件),找到MFT的物理磁盤地址。而後它就從文件記錄的數據屬性中得到VCN到LCN的映射信息,並存儲在內存中。這個映射信息定位了MFT的運行(run或extent)在磁盤上的位置。接着,NTFS再打開幾個元數據文件的MFT記錄,並打開這些文件。若有必要NTFS開始執行它的文件系統恢復操做。在NTFS打開了剩餘的元數據文件後,用戶就能夠開始訪問該捲了。
第二部分 文件和目錄記錄
NTFS將文件做爲屬性/屬性值的集合來處理,這一點與其餘文件系統不同。文件數據就是未命名屬性的值,其餘文件屬性包括文件名、文件擁有者、文件時間標記等。下圖顯示了一個用於小文件的MFT記錄。
每一個屬性由單個的流(stream)組成,即簡單的字符隊列。嚴格地說,NTFS並不對文件進行操做,而只是對屬性流進行讀寫。NTFS提供對屬性流的各類操做:建立、刪除、讀取(字節範圍)以及寫入(字節範圍)。讀寫操做通常是針對文件的未命名屬性的,對於已命名的屬性則能夠經過已命名的數據流句法來進行操做。
一個文件一般佔用一個文件記錄。然而,當一個文件具備不少項屬性值或很零碎的時候,就可能須要佔用一個以上的文件記錄。這種狀況下,第一個文件記錄是其基本的文件記錄,存儲有該文件須要的其它文件記錄的位置。小文件和文件夾(典型的如1500字節或更少)將所有存儲在文件的MFT記錄裏。
文件夾記錄包括索引信息,小文件夾記錄徹底存儲在MFT結構內,然而大的文件夾則被組織成B+樹結構,用一個指針指向一個外部簇,該簇用來存儲那些MFT內存儲不了的文件夾的屬性。
NTFS捲上文件的經常使用屬性在下表中列出(並非全部文件都有全部這些屬性)。
常駐屬性與很是駐屬性
當一個文件很小時,其全部屬性和屬性值可存放在MFT的文件記錄中。當屬性值能直接存放在MFT中時,該屬性就稱爲常駐屬性(resident attribute)。有些屬性老是常駐的,這樣NTFS才能夠肯定其餘很是駐屬性。例如,標準信息屬性和根索引就老是常駐屬性。
每一個屬性都是以一個標準頭開始的,在頭中包含該屬性的信息和NTFS一般用來管理屬性的信息。該頭老是常駐的,並記錄着屬性值是否常駐、對於常駐屬性,頭中還包含着屬性值的偏侈量和屬性值的長度。
若是屬性值能直接存放在MFT中,那麼NTFS對它的訪問時間就將大大縮短。NTFS只需訪問磁盤一次,就可當即得到數據;而沒必要像FAT文件系統那樣,先在FAT表中查找文件,再讀出連續分配的單元,最後找到文件的數據。
小文件或小目錄的全部屬性,都可以在MFT中常駐。小文件的未命名屬性能夠包括全部文件數據。創建一個小文件以下圖所示:
該文件的內容
文件屬性
如經過NFI查看文件"新建 文本文檔.txt"的文件記錄號爲36,顯示內容以下:
File 36
\新建 文本文檔.txt
$STANDARD_INFORMATION (resident)
$FILE_NAME (resident)
$FILE_NAME (resident)
$DATA (resident)
從顯示內容能夠看出文件的所有屬性都是常駐屬性,包括DATA屬性,沒有很是駐屬性,因此,用WINHEX打開MFT,查看該文件記錄,有以下圖的內容
小文件的文件記錄
小目錄的索引根屬性能夠包括其中全部文件和子目錄的索引。參見下圖
小目錄的MFT記錄
大文件或大目錄的全部屬性,就不可能都常駐在MFT中。若是一個屬性(如文件數據屬性)太大而不能存放在只有1KB的MFT文件記錄中,那麼NTFS將從MFT以外分配區域。這些區域一般稱爲一個運行(run)或一個盤區(extent),它們可用來存儲屬性值,如文件數據。若是之後屬性值又增長,那麼NTFS將會再分配一個運行,以便用來存儲額外的數據。值存儲在運行中而不是在MFT文件記錄中的屬性稱爲很是駐屬性(nonresident attribute)。NTFS決定了一個屬性是常駐仍是很是駐的;而屬性值的位置對訪問它的進程而言是透明的。
當一個屬性爲很是駐時,如大文件的數據,它的頭部包含了NTFS須要在磁盤上定位該屬性值的有關信息。下圖顯示了一個存儲在兩個運行中的很是駐屬性。
存儲在兩個運行中的很是駐屬性
在標準屬性中,只有能夠增加的屬性纔是很是駐的。對文件來講,可增加的屬性有數據、屬性列表等。標準信息和文件名屬性老是常駐的。
一個大目錄也可能包括很是駐屬性(或屬性部分),參見下圖。在該例中,MFT文件記錄沒有足夠空間來存儲大目錄的文件索引。其中,一部分索引存放在索引根屬性中,而另外一部分則存放在叫做"索引緩衝區"(index buffer)的很是駐運行中。這裏,索引根、索引分配以及位圖屬性都是簡化表示的,這些屬性將在後面詳細介紹。對目錄而言,索引根的頭及部分值應是常駐的。
大目錄的MFT記錄
當一個文件(或目錄)的屬性不能放在一個MFT文件記錄中,而須要分開分配時,NTFS經過VCN-LCN之間的映射關係來記錄運行(run)或盤區狀況。LCN用來爲整個卷中的簇按順序從0到n進行編號,而VCN則用來對特定文件所用的簇按邏輯順序從0到m進行編號。下圖顯示了一個很是駐數據屬性的運行所使用的VCN與LCN編號。
很是駐數據屬性的VCN
當該文件含有超過2個運行時,則第三個運行從VCN8開始,數據屬性頭部含有前兩個運行VCN的映射,這便於NTFS對磁盤文件分配的查詢。爲了便於NTFS快速查找,具備多個運行文件的常駐數據屬性頭中包含了VCN-LCN的映射關係,參見下圖
很是駐數據屬性的VCN-LCN映射
雖然數據屬性經常因太大而存儲在運行中,可是其餘屬性也可能因MFT文件記錄沒有足夠空間而須要存儲在運行中。另外,若是一個文件有太多的屬性而不能存放在MFT記錄中,那麼第二個MFT文件記錄就可用來容納這些額外的屬性(或很是駐屬性的頭)。在這種狀況下,一個叫做"屬性列表"(attribute list)的屬性就加進來。屬性列表包括文件屬性的名稱和類型代碼以及屬性所在MFT的文件引用。屬性列表一般用於太大或太零散的文件,這種文件因VCN-LCN映射關係太大而須要多個MFT文件記錄。具備超過200個運行的文件一般須要屬性列表。
MFT文件記錄結構分析
主文件表MFT的文件記錄由記錄頭和屬性列表組成,由"FF FF FF FF"結束,通常大小爲1K,或一個簇大小(這樣通常就更大),記錄頭包括如下一些域:
偏移 長度(字節) 屬性
0X00 4 標誌,必定是"FILE"
0X04 2 更新序列US的偏移
0X06 2 更新序列號USN的大小與數組,包括第一個字節
0X08 8 日誌文件序列號LSN
0X10 2 序列號(SN)
0X12 2 硬鏈接數
0X14 2 第一個屬性的偏移地址
0X16 2 標誌,1表示記錄正在使用,2表示該記錄爲目錄
0X18 4 記錄頭和屬性的總長度,即文件記錄的實際長度,
0X1C 4 總共分配給記錄的長度
0X20 8 基本文件記錄中的文件索引號
0X28 2 下一屬性ID
0X2A 2 XP中使用,邊界
0X2C 4 XP中使用,本文件記錄號
每次記錄被修改都將致使日誌文件序列號$LogFile Sequence Number(LSN)發生變化。
序列號Sequence Number(SN)用於記錄主文件表記錄被重複使用的次數。
硬鏈接數Hard Link Count記錄硬鏈接的數目,只出如今基本文件記錄中。
文件記錄的實際長度是文件記錄在磁盤上實際佔用的字節空間。
基本文件記錄中的文件索引號,對於基本文件記錄,其值爲0,若是不爲0,則是一個主文件表的文件索引號,指向所屬的基本文件記錄中的文件記錄號,在基本文件記錄中包含有擴展文件記錄的信息,存儲在"屬性列表ATTRIBUTE_LIST"屬性中。
屬性列表是可變長度區,以"FF FF FF FF"結束,對於1K長度的MFT記錄,屬性列表的起始偏移爲0x30。
第三部分 索引記錄結構分析
每個索引記錄都是由一個標準的索引頭和一些包含索引鍵和索引數據的塊組成的。索引記錄的大小在引導記錄 $Boot中定義,通常老是4KB。
標準索引頭的結構以下:
偏移 大小 說明
0X00 4 老是"INDX"
0X04 2 更新序號偏移
0X06 2 更新序列號USN的大小與排列,包括第一個字節
0X08 8 日誌文件序列號LSN
0X10 8 該索引緩衝在索引分配中的索引VCN
0X18 4 索引入口的偏移(相對於0X18)
0X1C 4 索引入口的大小(相對於0X18)
0X20 4 索引入口的分配大小(相對於0X18)
0X24 1 非頁級節點爲1(有子索引)
0X25 3 老是0
0X28 2 更新序列號
0X2A 2S-2 更新序列排列
經常使用索引列表
名稱 索引 說明
$I30 文件名 目錄使用
$SDH 安全描述 $SECURE
$SII 安全IDS $SECURE
$O 對象IDS $OBJID
$O 全部者IDS $QUOTA
$Q 配額 $QUOTA
$R 重解析點 $REPARSE
第四部分 FAT32怎樣轉換成NTFS
Windows 2000/XP提供了分區格式轉換工具「Convert.exe」。Convert.exe是Windows 2000附帶的一個DOS命令行程序,經過這個工具能夠直接在不破壞FAT文件系統的前提下,將FAT轉換爲NTFS。它的用法很簡單,先在Windows 2000環境下切換到DOS命令行窗口,在提示符下鍵入:
D:>convert 須要轉換的盤符 /FS:NTFS
如系統E盤原來爲FAT16/32,如今須要轉換爲NTFS,可以使用以下格式:
D:>convert e: /FS:NTFS
全部的轉換將在系統從新啓動後完成。
此外,你還可使用專門的轉換工具,如著名的硬盤無損分區工具Partition Magic,使用它完成磁盤文件格式的轉換也是很是容易的。首先在界面中的磁盤分區列表中選擇須要轉換的分區。從界面按鈕條中選擇「Convert Partition」按鈕,或者是從界面菜單條「Operations」項下拉菜單中選擇「Convert」命令。激活該項功能界面。在界面中選擇轉換輸出爲「NTFS」,以後單擊「OK」按鈕返回程序主界面。單擊界面右下角的「Apply」添加設置。此後系統會從新引導啓動,並完成分區格式的轉換操做。