回首頁
修改
Mail
FTP

中




2010年5月2日 星期日

[知識]NTFS 詳解

NTFS是一個比FAT复雜的多的文件系統,我們一起努力來把它完整的解讀出來

NTFS的引導扇區也是完成引導和定義分區參數,和FAT分區不同,FAT分區的BOOT記錄正常,就顯示分區沒有錯誤,即使文件不正确,而NTFS分區的BOOT不是分區的充分條件,它要求必須MFT中的系統記錄如$MFT等正常該分區才能正常訪問。其BPB參數如下表所示。
字節偏移 長度 常用值 意義
0x0B 字 0x0002 每扇區字節數
0x0D 字節 0x08 每簇扇區數
0x0E 字 0x0000 保留扇區
0x10 3字節 0x000000 總為0
0x13 字 0x0000 NTFS未使用,為0
0x15 字節 0xF8 介質描述
0x16 字 0x0000 總為0
0x18 字 0x3F00 每磁盤扇區數
0x1A 字 0xFF00 磁頭數
0x1C 雙字 0x3F000000 隱含扇區
0x20 雙字 0x00000000 NTFS未使用,為0
0x28 8字節 0x4AF57F0000000000 扇區總數
0x30 8字節 0x0400000000000000 $MFT的邏輯簇號
0x38 8字節 0x54FF070000000000 $MFTMirr的邏輯簇號
0x40 雙字 0xF6000000 每MFT記錄簇數
0x44 雙字 0x01000000 每索引簇數
0x48 8字節 0x14A51B74C91B741C 卷標
0x50 雙字 0x00000000 檢驗和

  MFT中的文件記錄大小一般是固定的,不管簇的大小是多少,均為1KB。文件記錄在MFT文件記錄數組中物理上是連續的,且從0開始編號,所以,NTFS是預定義文件系統。MFT僅供系統本身組織、架构文件系統使用,這在NTFS中稱為元數据(metadata,是存儲在卷上支持文件系統格式管理的數据。它不能被應用程序訪問,只能為系統提供服務)。其中最基本的前16個記錄是操作系統使用的非常重要的元數据文件。這些元數据文件的名字都以“$”開始,所以是隱藏文件,在Windows 2000/XP中不能使用dir命令(甚至加上/ah參數)像普通文件一樣列出。在WINHEX中帶有NFI.EXE,用此工具可以顯示這些記錄与文件的對應關系,下一次再詳細解釋。

  這些元數据文件是系統驅動程序管理卷所必需的,Windows 2000/XP給每個分區賦予一個盤符并不表示該分區包含有Windows 2000/XP可以識別的文件系統格式。如果主文件表損坏,那么該分區在Windows 2000/XP下是無法讀取的。為了使該分區能夠在Windows 2000/XP下能被識別,就必須首先建立Windows 2000/XP可以識別的文件系統格式即主文件表,這個過程可通過高級格式化該分區來完成。Windows以簇號來定位文件在磁盤上的存儲位置,在FAT格式的文件系統中,有關簇號的指針包含在FAT表中,在NTFS中,有關簇號的指針則包含在$MFT及$MFTMirr文件中。

  NTFS使用邏輯簇號(Logical Cluster Number,LCN)和虛擬簇號(Virtual Cluster Number,VCN)來對簇進行定位。LCN是對整個卷中所有的簇從頭到尾所進行的簡單編號。用卷因子乘以LCN,NTFS就能夠得到卷上的物理字節偏移量,從而得到物理磁盤地址。VCN則是對屬于特定文件的簇從頭到尾進行編號,以便于引用文件中的數据。VCN可以映射成LCN,而不必要求在物理上連續。

  在NTFS卷上,跟隨在BPB后的數据字段形成一個擴展BPB。這些字段中的數据使得 Ntldr能夠在啟動過程中找到主文件表MFT(Master File Tabl )。在NTFS卷上,MFT并不象在FAT 16卷和FAT 32卷上一樣,被放在一個預定義的扇區中。由于這個原因,如果在MTF的正常位置中有坏扇區的話,就可以把MFT移到別的位置。但是,如果該數据被破坏,就找不到MFT的位置,Windows 2000假設該卷沒有被格式化。
因此,如果一個ntfs的卷提示未格式化,可能并未破坏MFT,依据BPB的各字段的意思是可以重建BPB的。
NTFS的缺省簇的大小
卷大小 每簇的扇區 缺省的簇大小
小于等于512MB 1 512字節
513MB~1024MB(1GB) 2 1024字節(1KB)
1025MB~2048MB(2GB) 4 2048字節(2KB)
大于等于2049MB 8 4KB
從上面可以看出,也就是說不管驅動器多大 NTFS 簇的大小不會超過 4KB
NTFS文檔:文檔屬性定義

 每個文檔屬性都由以下部分組成:

 一個由該屬性的實際值組成的被稱為“流”的重要的字節序列,元數据可訪問該流。

  文件中的每個文件屬性都可能會有一個名字:在這种情況下,在命令行方式下可以通過語法“文件名:屬性名”來訪問該流(這也是文件名中不能使用“:”的原因)。Windows NT® 使用以下在元數据文件$AttrDef中預定義的文件屬性列表(一般會有一個未命名流,為缺省流,未命名流只能有一個,而命名流可以有多個,NTFS支持多流文件):

10 $STANDARD_INFORMATION (標准信息)

20 $ATTRIBUTE_LIST (屬性列表)

30 $FILE_NAME (文件名)

40 $VOLUME_VERSION (卷版本)

50 $SECURITY_DEscriptOR (安全描述符)

60 $VOLUME_NAME (卷名)

70 $VOLUME_INFORMATION (卷信息)

80 $DATA (數据)

90 $INDEX_ROOT (索引根)

A0 $INDEX_ALLOCATION (索引分配)

B0 $BITMAP (位圖)

C0 $SYMBOLIC_LINK(符號鏈接)

D0 $EA_INFORMATION (?信息)

E0 $EA

屬性流結构

每個文件屬性都分為兩部分:盡管這兩部分屬性在文件記錄的屬性列表中以倒序方式進行記錄,但是為了更好的理解它,讓我們按下面的順序進行介紹:

內容部分:

它的結构總是以屬性名開始(N字節長),在屬性名之后定義該屬性是否為常駐屬性。當文件屬性的數据流就存儲在其屬性名后時,它就是常駐屬性,這樣,對于那些流較小且不會增長的文件屬性就可以提供更佳的訪問次數。如果一個文件屬性是非常駐的,那么其流就存儲在一個或多個擴展或稱為運行中。運行是一個在邏輯簇號上連續的區域。為訪問這些運行,NTFS緊跟在文件屬性名后存儲有一個稱為運行列表的表。

頭部:

從頭部開始的偏移長度描述:

0 4 Type (類型)

4 4 Length (長度)

8 1 Non-resident flag (非常駐標志)

9 1 N=Name length (文件名長度)

A 2 Offset to the content part (相對內容部分的偏移值)

C 2 Compressed flag (壓縮標志)

E 2 Identificator (標識)

文件名長度:

00 表示文件屬性沒有命名。

壓縮標志:在NTFS中,數据壓縮是在文件屬性級別上實現的,這就意味著,如果出現意外,你也不會釋放出很多的數据。這樣,盡管只是對文件進行壓縮,但壓縮文件同時就意味著其屬性數据也一樣被壓縮。從現在開始, 其頭部的安排依賴文件的常駐屬性:

對一個常駐屬性來說,從頭部開始的偏移描述如下:

10 4 Length of the stream (流長度)

14 2 Offset to the stream (流偏移)

16 2 Indexed flag (索引標志)

索引標志:

文件屬性通過一個索引入口進行索引。

對于一個非常駐的文件屬性,從頭部開始的偏移描述如下:

10 8 Starting VCN (起始VCN)

18 8 Last VCN (結束VCN)

20 2 Offset to the runlist (運行列表偏移)

22 2? Number of compression engine ? (壓縮引擎號)

28 8 Allocated size of the stream (為流分配的單元大小)

30 8 Real size of the stream (實際的流大小)

38 8 Initialized data size of the stream (流已初始化大小)

VCN :Virtual Cluster Number(虛擬簇號)的縮略詞。VCN是一個与非常駐屬性相關聯的概念。VCN從文件屬性流的第一個運行的第一個簇(VCN 0)到最后一個運行的最后一個簇進行編號。 當某個運行列表非常大,文件屬性不能放在一個文件記錄中時,描述文件的文件屬性就會存儲在几個文件記錄中,運行列表也分成几個小片。起始VCN域和結束VCN域都用于定位其文件記錄指示—即運行列表—運行所指定的VCN 。

注:如果屬性可以放在一個文件記錄內,則結束VCN域(這种情況下沒有使用)可能是“00 00 00 00 00 00 00 00”。

壓縮引擎的數量:

為達到最好的壓縮比率,NTFS可以根据不同類型的數据使用不同的壓縮引擎。當前的壓縮引擎使用值04。

為流分配的單元大小:它几倍于卷上用來存儲文件屬性流所描述的分配空間。

如果流沒有壓縮,它就是數倍于簇空間大小的實際大小,相反,則比較小。

流的實際大小:

文件屬性流在壓縮前的大小。

流的初始化大小:

這是文件屬性流的壓縮后的大小(總是低于分配大小)。如果此流未被壓縮,就是它的實際大小 。

注意:

  常駐文件屬性從不被壓縮(也沒有壓縮引擎號域),因為它的流太小。

  信息是足夠的:名字長+內容部分的偏移值 =到流的偏移值(常駐屬性)或者到運行列表的偏移值(非常駐悔改)。

Posted via email from radius's posterous

0 回應: