NTFS底層結(jié)構(gòu)培訓(xùn)資料_第1頁
NTFS底層結(jié)構(gòu)培訓(xùn)資料_第2頁
NTFS底層結(jié)構(gòu)培訓(xùn)資料_第3頁
NTFS底層結(jié)構(gòu)培訓(xùn)資料_第4頁
NTFS底層結(jié)構(gòu)培訓(xùn)資料_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、.;一、NTFS系統(tǒng)結(jié)構(gòu)NTFS是Windows NT引入的新型文件系統(tǒng),如果您是一位熟悉FAT磁盤格式的專業(yè)人士,您可能會覺得NTFS系統(tǒng)的思想蹩腳而晦澀,如果您對FAT格式一無所知,那么恭喜您,您會更快的了解這種更有效率的磁盤格式。NTFS的結(jié)構(gòu)復(fù)雜,內(nèi)容繁多,筆者僅對NTFS卷上的底層結(jié)構(gòu)做分析,并提供卷上數(shù)據(jù)刪除的特征狀態(tài)供大家參考。 現(xiàn)在,我們首先來建立了解NTFS需要的基本概念。1.0基本結(jié)構(gòu)及基本概念在NTFS中,文件以簇的形式分配。最小的單位為扇區(qū),N個扇區(qū)為一簇。其中,N的值可以通過BPB(引導(dǎo)扇區(qū))讀出(以下會詳細(xì)介紹)。1.0.1卷與簇表1 卷與簇的關(guān)系卷大?。ǚ謪^(qū)大?。?/p>

2、每簇的扇區(qū)缺省的簇大小小于等于512MB1512字節(jié)513MB1024MB(1GB)21024字節(jié)(1KB)1025MB2048MB(2GB)42048字節(jié)(2KB)大于等于2049MB84KB 4表1 卷與簇的關(guān)系從上面可以看出,也就是說不管驅(qū)動器多大NTFS簇的大小不會超過4KB。1.0.2NTFS的基本數(shù)據(jù)結(jié)構(gòu)NTFS的數(shù)據(jù)大體上可分為4個部分(1)Partition boot sector(引導(dǎo)扇區(qū),又稱BPB),此部分為所有磁盤格式都共有,占用一個扇區(qū),但是具體的內(nèi)容當(dāng)然各不相同(見表3)。(2)Master File Table(主文件列表,MFT),它是對卷上所有文件的記錄,每一

3、個文件對應(yīng)一個記錄項,理論上占用該卷12的空間。(3)System files(系統(tǒng)文件),NTFS系統(tǒng)一共有16個系統(tǒng)文件,和8個保留文件。(4)File area(數(shù)據(jù)區(qū)),留給用戶的空間。Partition boot sector引導(dǎo)扇區(qū)Master File Table主文件列表System files系統(tǒng)文件File area用戶文件區(qū)(數(shù)據(jù)區(qū)) 表2 NTFS的磁盤分配情況1.0.3 NTFS中關(guān)于目錄的說明NTFS中目錄也是以文件的形式存在的。因此,每一個目錄也可以看作一個文件。如果您熟悉FAT,那么此時您可能會覺得很別扭,因為在FAT中,文件是以目錄文件的樹型結(jié)構(gòu)聯(lián)系起來的。但

4、是,您必須相信的是,NTFS將會提供比搜索樹更快的讀寫方式。1.1 引導(dǎo)扇區(qū)字節(jié)偏移長度(字節(jié))常用值意義 0X0030XEB5290JMP指令 0X034NTFS文件系統(tǒng) ID 0X0B20X0002每扇區(qū)字節(jié)數(shù) 0X0D10X08每簇扇區(qū)數(shù) 0X0E20X0000保留扇區(qū) 0X1030X000000總為0 0X1320X0000NTFS未使用,為0 0X1510XF8介質(zhì)描述 0X1610X0000總為0 0X1820X3F00每磁道扇區(qū)數(shù) 0X1A20XFF00磁頭數(shù) 0X1C40X3F000000隱含扇區(qū) 0X2040X00000000NTFS未使用,為0 0X2440X8000800

5、0NTFS未使用,為0 0X2880X4AF57F0000000000扇區(qū)總數(shù) 0X3080X0400000000000000$MFT的邏輯簇號 0X3880X54FF070000000000$MFTMirr的邏輯簇號 0X4040XF6000000每MFT記錄簇數(shù) 0X4440X0100000每索引簇數(shù) 0X4880X14A51B74C91B741C卷標(biāo) 0X5040X00000000校驗和 0X54430略引導(dǎo)代碼 0X1FE20X55AA簽名 表3 NTFS引導(dǎo)扇區(qū)說明1.2 MFT(主文件表)MFT是一個對應(yīng)的數(shù)據(jù)庫,由一系列的文件記錄組成。卷中每一個文件都有一個文件記錄(對于大型文件

6、還可能有多個記錄與之相對應(yīng))。主文件表本身也有它自己的文件記錄。如果您還不勝了解,那么我們來打個比喻。假設(shè)一個班有30個人,老師那里有一本花名冊,記錄了每個人的名字,年齡,每天出勤的情況和科目成績等等。把每個人看做每一個文件,那么那本花名冊就是這里的MFT。當(dāng)然,事實往往是復(fù)雜而多變的,MFT中包含文件的哪些信息?這些信息又是如何關(guān)聯(lián)的?這些問題,我們會一個個解決。現(xiàn)在首先對MFT做幾點必要的說明:(1)實際上,MFT自身也是一個文件,因此,主文件列表的第一個記錄就是它自身。所以,剛才的例子其實不太貼切,因為事實上,花名冊也是人,那么好吧,我們假設(shè)這本花名冊在老師的腦子里。這樣,您可以知道,既

7、然老師也是人,那么其實老師也是一個文件。(2)MFT的每個記錄都有一個編號,這里我們稱它為ID號。這個ID從0開始。我們知道MFT自身是NTFS系統(tǒng)的第一個文件,所以文件$MFT的ID號為0。(3)$MFT和其他23個文件一起(共24個),組成所謂的“Metafiles”(元文件,也是之前提到的System files,系統(tǒng)文件)。這24個文件中,前16(ID為0-15)個文件是固定的,剩下的8個文件為保留文件。我們可以假設(shè),這16個系統(tǒng)文件為此班的任課老師,因為雖然他們也是人,但是屬性跟普通的同學(xué)不一樣,他們管理著整個卷的活動方式,正如老師們管理著整個班級一樣。(4)用戶的文件(也包括目錄)

8、的MFT中的ID號從24開始排。(5)用戶每添加一個文件ID號加1,當(dāng)某文件被刪除時,與之對應(yīng)的MFT記錄將被空出來,如果此時再次添加文件,系統(tǒng)會優(yōu)先填充ID小的空位。正如,大家上課的時候都會搶前排的位子坐,但是坐定之后就不能換位子了。(6)無論簇的大小,文件記錄大小都是1K,老師腦中的花名冊對每個人都是公平的。(7)理論上$MFT在卷中的分配空間(占12)。(8)邏輯上,$MFT在卷中會占用一塊連續(xù)的空間,但實際情況$MFT可能會被分散在磁盤的幾個不同的區(qū)域。甚至,可能在元文件的部分就被拆分開。據(jù)筆者分析,這些情況的發(fā)生可能由于卷上的文件不斷增加,最先開辟的$MFT文件已經(jīng)用完,系統(tǒng)會再次開

9、辟空間存放文件記錄。另一種情況是,卷是由FAT或者其他格式轉(zhuǎn)化而來,當(dāng)卷空間不足的時候,也可能將MFT分散存儲。1.2.1 MFT中的元文件(固定)以下是元文件的列表。其中ID為0-15的文件為系統(tǒng)文件,用戶文件從第24個MFT記錄開始排。序號(ID)元文件功能 0$MFT主文件列表本身 1$MFTMirr主文件表的部分鏡像 2$LogFile日志文件 3$Volume卷文件 4$AttrDef屬性定義列表5$Root根目錄 6$Bitmap位圖文件 7$Boot引導(dǎo)文件 8$BadClus壞簇文件 9$Secure安全文件 10$UpCase大寫文件 11-15$Extend 擴(kuò)展文件(一共

10、5個文件) 16-23保留 表4 NTFS元文件1.2.2 NTFS中MFT的備份在NTFS中,因其前16個文件的重要性,對它們的MFT記錄在文件區(qū)有一個備份。如圖:圖1 MFT的備份1.2.3 NTFS中的$BITMAP(位圖)文件在元文件中,除了$MFT文件還有一個位圖文件十分重要。文件$Bitmap標(biāo)識的是該卷中簇的占用情況。它用一位代表一簇。為0代表此簇空閑,為1代表此簇已使用。這樣可以更合理的分配磁盤空間。當(dāng)文件被刪除,它所占用的簇對應(yīng)的為會被清空(置0)。NTFS通過這個文件管理卷的使用情況。 二、文件記錄(MFT記錄)詳解相信對NTFS您已經(jīng)有一個大致的了解,但是對老師腦中的花名

11、冊是不是充滿了好奇和期待呢?簡單的說,花名冊清楚描述了班里每一個人的狀況。描述的每一個項目在這里被叫做屬性。NTFS將文件作為屬性、屬性值的集合來處理。每個屬性由單個的流(stream)組成,即簡單的字符排列。嚴(yán)格的說,NTFS并不對文件進(jìn)行操作,而只對屬性流進(jìn)行讀寫。 可以想想的是,花名冊的大小有限(因為花名冊是用來查詢的),而文件的屬性可能很大(對于那些調(diào)皮的學(xué)生,老師總要花費更多的心血),因此,當(dāng)文件屬性太大的時候,NTFS系統(tǒng)會將該屬性值存放到卷中某個位置,而花名冊中的屬性只會記錄該屬性索引到外部的地址,以及索引區(qū)的大小。這種“裝不下”的屬性又被稱為文件的屬性又分為“非常駐屬性”。與之

12、相反,能夠保存在“花名冊”中的屬性又叫做“常駐屬性”。2.1文件的存儲我想我已經(jīng)清楚的向您展示了MFT的全貌,再來回顧一下,文件$MFT本身是一個文件(老師也是人),但是它亦是卷上每個文件的記錄集合(花名冊),每個文件擁有1K的空間(老師是公平的),用來記錄文件屬性,包括常駐屬性和非常駐屬性。那么您現(xiàn)在是不是有老大一個問號,我一直在強調(diào)文件的記錄,那么文件的真實數(shù)據(jù)是如何存放的呢?想要知道這一點,就要請您耐心的看完下面對MFT屬性的介紹。它將向您展示,這本花名冊的精妙之處。2.2 文件的MFT屬性介紹MFT的內(nèi)容由不同的屬性組合而成。以下是一個真實的MFT記錄。現(xiàn)在,我們來剖析一下它的屬性內(nèi)容

13、。表5是這MFT記錄的屬性列表。對于每一個MFT記錄來說,都會包含幾種屬性,但不可能包含所有的屬性。老師當(dāng)然根據(jù)學(xué)生不同的特點設(shè)計花名冊的屬性。屬性號屬性名屬性描述 0X10$STANDRD_INFORMATION(標(biāo)準(zhǔn)屬性)包括基本文件屬性,如只讀、存檔;時間標(biāo)記,如文件的創(chuàng)建時間和最近一次修改的時間;有多少目錄指向本文件 0X20$ATTRIBUTE_LIST(屬性列表)當(dāng)一個文件需要使用多個MFT文件記錄時,用來表示該文件的屬性列表 0X30$FILE_NAME(文件名屬性)這是以Unicode字符表示的,由于MS-DOS不能正確識別Win32子系統(tǒng)創(chuàng)建的文件名,當(dāng)Win32子系統(tǒng)創(chuàng)建一

14、個文件名時,MTFS會自動生成一個備用的MS-DOS文件名,所以一個文件可以有多種文件名屬性。 0X40$VOLUME_VERSION(卷版本)卷版本號 0X50$SECURITY_DEscriptOR(安全描述符)這是為了向后兼容而被保留的,主要用于保護(hù)文件以防止未授權(quán)訪問。 0X60$VOLUME_NAME(卷名)卷名稱或卷標(biāo)識 0X70$VOLUME_INFORMATION(卷信息)卷信息 0X80$DATA(數(shù)據(jù)屬性)這是文件的內(nèi)容 0X90$INDEX_ROOT(索引根屬性)索引根 0XA0$INDEX_ALLOCATION(索引分配屬性)索引分配 0XB0$BITMAP(位圖屬性)

15、位圖 0XC0$SYMBOLIC_LINK(符號鏈接)符號鏈接 0XD0$EA_INFORMATION(EA信息)擴(kuò)充屬性信息:主要為與OS/2兼容 0XE0$EA擴(kuò)充屬性:主要為與OS/2兼容 0X100$OBJECT_ID對象ID:一個具有64個字節(jié)的標(biāo)識符,其中最低的16個字節(jié)對卷來說是唯一的 表5 NTFS卷上常用屬性說明以下是一個實際的MFT記錄,我們通過對它的分析向您展示MFT記錄的屬性。46 49 4c 45 30 00 03 00 17 cd 13 1a 00 00 00 00 頭屬性01 00 01 00 38 00 01 00 b0 01 00 00 00 04 00 00

16、00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00bb 02 00 00 00 00 00 00 10 00 00 00 60 00 00 00 標(biāo)準(zhǔn)頭00 00 18 00 00 00 00 00 48 00 00 00 18 00 00 00 屬性e0 e3 e1 a0 66 e9 c3 01 e0 e3 e1 a0 66 e9 c3 01e0 e3 e1 a0 66 e9 c3 01 e0 e3 e1 a0 66 e9 c3 0106 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00

17、 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 30 00 00 00 68 00 00 00 文件名00 00 18 00 00 00 03 00 4a 00 00 00 18 00 01 00 屬性05 00 00 00 00 00 05 00 e0 e3 e1 a0 66 e9 c3 01e0 e3 e1 a0 66 e9 c3 01 e0 e3 e1 a0 66 e9 c3 01e0 e3 e1 a0 66 e9 c3 01 00 40 00 00 00 00 00 0000 40 00 00 00 00 00 0

18、0 06 00 00 00 00 00 00 0004 03 24 00 4d 00 46 00 54 00 00 00 00 00 00 0080 00 00 00 68 00 00 00 01 00 40 00 00 00 01 00 數(shù)據(jù)流00 00 00 00 00 00 00 00 f1 1f 00 00 00 00 00 00 屬性40 00 00 00 00 00 00 00 00 20 ff 01 00 00 00 0000 1c ff 01 00 00 00 00 00 1c ff 01 00 00 00 0021 48 06 24 31 01 f3 aa 02 31 01

19、fd 7a 05 31 01f3 38 02 31 01 c3 4b 05 00 a2 6b 81 d0 50 3d e1b0 00 00 00 48 00 00 00 01 00 10 00 00 00 05 00 位圖00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 屬性40 00 00 00 00 00 00 00 00 10 00 00 00 00 00 0000 10 00 00 00 00 00 00 00 10 00 00 00 00 00 0031 01 40 4b 0f 00 00 00 ff ff ff ff 00 00 00

20、00 結(jié)束標(biāo)志 MFT記錄中的每一個屬性都用不同的顏色標(biāo)識出來。第一個屬性被稱為屬性頭,此屬性是每一個MFT的都有的(見表6)。接下來分別是標(biāo)準(zhǔn)頭屬性、文件名屬性(見表7)、數(shù)據(jù)流屬性(見表9)和位圖屬性。這些屬性(不包括屬性頭)的的共性在于,它們的前8個字節(jié)(我稱它為小頭屬性)的前4個字節(jié)為此屬性的號(屬性號與屬性名稱的對應(yīng)見下表4),后4個字節(jié),代表的是此屬性的長度(字節(jié)數(shù))。最后,MFT的結(jié)束標(biāo)志為ff ff ff ff。以下是幾個重要的MFT屬性介紹(1)MFT文件記錄屬性頭結(jié)構(gòu)偏移長度描述 0X004固定值“FILE” 0X042更新序列號偏移,與操作系統(tǒng)有關(guān) 0X062固定列表大小

21、 0X088日志文件序列號 0X102序列號(用于記錄文件被反復(fù)使用的次數(shù)) 0X122硬連接數(shù),跟目錄中的項目關(guān)聯(lián),非常重要的參數(shù) 0X142第一個屬性的偏移 0X162標(biāo)志字節(jié) 0X184文件記錄實時大?。ㄗ止?jié)) 0X1C4文件記錄分配大?。ㄗ止?jié)) 0C208基礎(chǔ)記錄 (0: itself) 0X282下一個自由ID號 0X2A2邊界 0X2C4WINDOWS XP中使用,本MFT記錄號 0X304MFT的使用標(biāo)記 表6 文件屬性頭說明(2)文件名屬性偏移大小值描述 0X0040X30屬性類型 0X0440X68總長度 0X0810X00非常駐標(biāo)志(0X00:常駐屬性;0X01:非常駐屬性

22、) 0X0910X00屬性名的名稱長度 0X0A20X18屬性名的名稱偏移 0X0C20X00標(biāo)志 0X0E20X03標(biāo)識 0X1040X4A屬性長度(L) 0X1420X18屬性內(nèi)容起始偏移 0X1610X01索引標(biāo)志 0X1710X00填充 0X1880500000000000500父目錄記錄號(前6個字節(jié))+序列號(與目錄相關(guān)) 0X208e0e3e1a066e9c301文件創(chuàng)建時間 0X288同上文件修改時間 0X308同上最后一次MFT更新的時間 0X388同上最后一次訪問時間 0X4080040000000000000文件分配大小 0X4880040000000000000文件實際

23、大小 0X50406000000標(biāo)志,如目錄、壓縮、隱藏等 0X54400000000用于EAS和重解析點 0X58104以字符計的文件名長度,每字節(jié)占用字節(jié)數(shù)由下一字節(jié)命名空間確定,一個字節(jié)長度,所以文件名最大為255字節(jié)長(L) 0X59103文件名命名空間,見表8 0X602L24004d004600以Unicode方式標(biāo)識的文件名 表7 文件名屬性說明 標(biāo)志意義描述 0POSIX這是最大的命名空間。它大小寫敏感,并允許使用除NULL(0)和左斜框(/)以外的所有Unicode字符作為文件名,文件名最大長度為255個字符。有一些字符,如冒號(:),在NTFS下有效,但WINDOWS不讓使

24、用。 1WIN32WIN32和POSIX命名空間的一個子集,不區(qū)分大小寫,可以使用除“*/:?|”以外的所有Unicode字符。另外,文件不能以句點和空格結(jié)束。 2DOSDOS是WIN32命名空間的一個子集,要求比空格的ASC|碼要大,且不能使用* + / , : ; ? | 等字符,另外其格式是1-8個字符的文件名,然后是句點分隔,然后是1-3個字符的擴(kuò)展名。 3Win32 & DOS該命名空間要求文件名對Win32和DOS命名空間都有效,這樣,文件名就可以在文件記錄中只保存一個文件名 表8 常見命名空間(3)數(shù)據(jù)流屬性偏移大小值意義 0X0040X80屬性類型(0X80,數(shù)據(jù)流屬性) 0X

25、0440X48屬性長度(包括本頭部的總大小) 0X0810X01非常駐標(biāo)志(0X00:常駐屬性;0X01:非常駐屬性) 0X0910X00名稱長度,$AttrDef中定義,所以名稱長度為0 0X0A20X0040名稱偏移 0X0C20X00標(biāo)志,0X0001為壓縮標(biāo)志,0X4000為加密標(biāo)志,0X8000為系數(shù)文件標(biāo)志 0X0E20X0001標(biāo)識 0X1080X00其實VCN 0X1880X1FF1結(jié)束VCN 0X2020X40數(shù)據(jù)運行的偏移 0X2220X00壓縮引擎 0X2440X00填充 0X2880X1FF2000為屬性值分配大?。ò捶峙涞拇氐淖止?jié)數(shù)計算) 0X3080X1FF1C00

26、屬性值實際大小 0X3880X1FF1C00屬性壓縮大小 0X402148062431數(shù)據(jù)運行 表9 數(shù)據(jù)流屬性說明(4) 位圖屬性位圖屬性在NTFS的屬性中是一個很靈活的屬性。當(dāng)它位于不同的文件下有不同的含義。比如:例子中的MFT是文件$MFT自身的記錄。這里的位圖屬性有特殊的含義。它在此處為非常駐屬性,標(biāo)志MFT文件的使用情況(類似$BITMAP的作用)。例子中31 01 40 4b 0f為數(shù)據(jù)運行,起始簇為0 x0f4b40,占用一個簇。該簇中以每一位代表一個MFT記錄的使用情況(占用為1,未使用為0)。實際操作中,可以根據(jù)文件的ID號查找與該文件的MFT對應(yīng)的位。具體方法為,首先在$M

27、FT的記錄中讀取0 xB0屬性運行,根據(jù)運行找到$MFT:bitmap位置。對于文件file,根據(jù)MFT記錄的順序記錄文件file位于第幾個,假設(shè)記錄號為ID,ID/8=A, ID%8=B。表明該文件的MFT記錄的位圖位從$MFT:bitmap的首字節(jié)偏移A個字節(jié),之后的第B個位。2.3關(guān)于文件屬性的說明現(xiàn)在說明幾點在數(shù)據(jù)恢復(fù)中很重要的幾個屬性標(biāo)志(已用顏色標(biāo)出) 第一處標(biāo)志代表的是文件的狀態(tài):1表示普通文件;0表示文件被刪除;3表示普通目錄;2表示目錄被刪除。當(dāng)然,對于系統(tǒng)的文件可能有除此以外的標(biāo)志符。 第二處為文件記錄的實際大小。雖然每一個MFT記錄都分配1K的空間,但實際使用的字節(jié)數(shù)并相

28、同。因此,這里記錄的是實際使用的字節(jié)數(shù)。 第三處為MFT的使用標(biāo)記,它在MFT記錄的兩個扇區(qū)中與每扇區(qū)的最末4個字節(jié)相對應(yīng),如若不然,系統(tǒng)將示此記錄為非法記錄。 第四處為數(shù)據(jù)運行,是在數(shù)據(jù)流屬性為非常駐的狀況下索引到數(shù)據(jù)流的關(guān)鍵。其具體計算方式如下:這是例子中的80H屬性,其中藍(lán)色部分為該80H屬性(數(shù)據(jù)屬性)的運行:80 00 00 00 68 00 00 00 01 04 40 00 00 00 08 0000 00 00 00 00 00 00 00 4b 00 00 00 00 00 00 0048 00 00 00 00 00 00 00 00 c0 04 00 00 00 00 0

29、088 bc 04 00 00 00 00 00 88 bc 04 00 00 00 00 0024 00 53 00 44 00 53 00 21 48 06 24 31 01 f3 aa02 31 01 0d 7a fd 31 01 f3 38 02 31 01 c3 4b 0500 a2 6b 81 d0 50 3d e1該運行分為子運行1:21 48 06 24子運行2:31 01 f3 aa 02子運行3:31 01 0d 7a fd子運行4:31 01 f3 38 02子運行5:31 01 c3 4b 05以子運行1:“21 48 06 24”為例,“2”表示后面4個字節(jié)中后面2個

30、字節(jié)是子運行的起始簇號,即子運行的起始簇號為“24 06”,“1”表示前面的1個字節(jié)表示子運行的大小,即該子運行的大小為“48”。所以該文件數(shù)據(jù)實際是從起始扇區(qū)號為0 x2406的地方,占用0 x48個簇。接下來是子運行2,運行2的簇號的起始位置為0 x2406 + 0 x02aaf3 = 0 x2cef9。占用0 x01個簇。接下來是子運行3,按照前面的理論,子運行3的起始簇號應(yīng)該是0 x2cef9+0 xfd0a0d。但是0 xfd0a0d的第一個字節(jié)為1(fd的首字節(jié)),證明此數(shù)為負(fù)數(shù),所以不能簡單的做加法,而應(yīng)該取該數(shù)的補數(shù)來計算。既,0 xfd7a0d取反加1,得到0 x2F5F2,

31、所以運行3的起始扇區(qū)號為0 x2cef9 - 0 x285f3 = 0 x4096。占用0 x01個簇。依此類推直到子運行之后為“00”時結(jié)束。在程序中,一個Run代表整個運行,每一個子運行以鏈表的方式鏈接在一起。 此處由一個字節(jié)標(biāo)識文件名的長度,故NTFS磁盤格式下的文件名長度不能超過256個字節(jié),但是文件名的存儲格式是以Unicode的形式存儲的,所以,文件名在磁盤中占用的真實字節(jié)數(shù)是該值的兩倍。除此以外,關(guān)于數(shù)據(jù)屬性的還有幾個方面需要說明(1)關(guān)于文件名屬性。在MFT中,可能有多個文件名屬性。這可能是因為文件的命名空間不同。例如:一個DOS命名空間下是83的短文件名格式。而WINDOWS

32、下是Unicode的命名空間。(2)當(dāng)數(shù)據(jù)運行中的簇號的首字節(jié)為“1”時,表明應(yīng)用前次的簇數(shù)減去該簇號數(shù),得到結(jié)果(此點在運行的例子中有詳盡的說明)。(3)NTFS使用邏輯簇號(LCN,Logical Cluster Number)和虛擬簇號(VCN,Virtual Cluster Number)來對簇進(jìn)行定位。LCN是對整個卷中的所有的簇從頭到尾進(jìn)行簡單編號。VCN是對屬于特定文件的簇從頭到尾進(jìn)行編號,是邏輯編號。(4)文件$Bitmap標(biāo)識的是硬盤空間里簇的占用情況。它用一位代表一簇。但是對于MFT記錄的空間,因為硬盤是預(yù)先保留下來的,所以,它在文件$Bitmap已經(jīng)將分配給MFT記錄的所

33、有簇都標(biāo)識為已占用(這個大小一般是硬盤整個空間的12),所以,它就不能充分表示有多少個記錄項被使用。$MFT:bitmap作為文件屬性恰好可以彌補這一缺點。事實上,NTFS的bitmap屬性就是為了更方便更精確的計算磁盤的使用空間。 三 關(guān)于目錄的文件看到這個題目,您會不會和詫異?前面我苦口婆心的告訴您,在NTFS系統(tǒng)說,目錄也是文件,目錄以文件的形式存在,那么為什么這里又要專門用一節(jié)來討論目錄呢?3.1 目錄文件的屬性我還是舉前面那個例子,對于一個班來說,雖然大家都是平等的,但是班級里面有小組長,小組長和組員一樣,都是人,但是,所行使的職能不同。因此,目錄雖然是文件,但是目錄包含的屬性不同。

34、一般來說,目錄包括頭屬性、標(biāo)準(zhǔn)屬性(0X10)、文件名屬性(0X30)、索引根屬性(0X90),大多數(shù)時候還會包含索引分配屬性(0XA0)。對于真實的文檔來說,它的內(nèi)容是它其中的文字。那么對于目錄來說,它的內(nèi)容應(yīng)該是什么呢?相信您可以猜到,當(dāng)然是目錄中包含的保存在該目錄下的所有文件的信息啦 (如果您了解FAT的格式,您對這一點將會深信不疑) 。事實當(dāng)然應(yīng)該如此,不然目錄與文件如何聯(lián)系呢?目錄的數(shù)據(jù)區(qū)(與文件的數(shù)據(jù)區(qū)相似)中,保存在該目錄下的每一個文件都有一個項目。這個項目我們把它稱作索引項,因為目錄通過它索引到文件。因此,與文件的數(shù)據(jù)屬性一樣,目錄的“數(shù)據(jù)屬性”有一個新的名字叫做“索引根屬性”

35、(0X90屬性)。索引根屬性包括兩個方面的內(nèi)容。一個是該屬性的頭,這里我把他叫做索引頭。還有一個部分是索引部分。索引部分又包括“索引項”和“索引項尾”。以下是一個目錄典型的MFT。屬性頭 10屬性頭 10屬性 30屬性頭 30屬性 90屬性頭(索引頭) 90屬性 (索引項) 索引項1索引項200 00 00 00 00 00 00 00 10 00 00 00 02 00 00 00 (索引尾) FF FF FF FF 82 79 47 11 表10 小目錄典型MFT記錄好了現(xiàn)在你可以閱讀下表,詳細(xì)了解0X90屬性中的索引頭和索引部分。偏移大小意義 0X004屬性號 0X044屬性長度 0X0

36、81常駐標(biāo)志 0X091名稱長度 0X0A2名稱偏移 0X0C2標(biāo)志(常駐屬性不能壓縮) 0X0E2屬性ID 0X104屬性長度(不含頭) 0X142屬性偏移 0X161索引標(biāo)志 0X171填充 0X188屬性名 0X204索引屬性類型 0X244排序規(guī)則 0X284索引項分配大小 0X2C1每索引記錄的簇數(shù) 0X2D3填充 0X304每索引的偏移 0X344索引項的總大小 0X384索引項的分配 0X3C1標(biāo)志,(0X01大索引) 0X3C3填充 表11 索引根屬性中索引頭部分結(jié)構(gòu)偏移大小意義 0X008文件的MFT記錄號 0X082索引項大小 0X0A2名稱偏移 0X0C4索引標(biāo)志填充 0

37、X108父目錄的MFT文件參考號 0X188文件創(chuàng)建時間 0X208文件修改時間 0X288文件最后修改時間 0X308文件最后訪問時間 0X388文件分配大小 0X408文件實際大小 0X488文件標(biāo)志 0X501文件名長度(F) 0X511文件名命名空間 0X522F文件名(填充到8字節(jié)) 0X52+2FP 0X52 +P+2F8子節(jié)點索引緩存的VCL 表12 索引項結(jié)構(gòu)索引根屬性就是由索引頭和這一個個的索引項組成。每個索引項對應(yīng)一個文件。當(dāng)文件被刪除,索引項也會隨之消失。那么您還記不記得,索引根屬性是在MFT記錄里的。當(dāng)索引項越來越多,1K的空間當(dāng)然無法存儲該屬性的。那么這個時候,NTF

38、S系統(tǒng)是如何處理的呢?也許,您會想到,它可能和數(shù)據(jù)流的方法一樣。通過數(shù)據(jù)運行索引到外部的數(shù)據(jù)區(qū)。如果您想到這一層,那么恭喜您,您已經(jīng)開始熟悉NTFS系統(tǒng)。NTFS的確是這么做的。但是,與數(shù)據(jù)屬性(0X80)有一點小小的區(qū)別。它并非簡單的在0X90屬性中添加一個運行。這是因為目錄可能很大,而通過目錄查找文件需要一個有效的算法。NTFS中,系統(tǒng)利用B+樹的方法查找文件(這是一個較為復(fù)雜的問題,后面有詳細(xì)介紹)。于是,當(dāng)索引項太大,不能全部存儲在MFT記錄中時,就會有兩個附加的屬性出現(xiàn):索引分配屬性(0XA0),用于描述B+樹目錄的子節(jié)點;索引位圖屬性(0XB0),用于描述索引分配屬性使用的虛擬簇號

39、。我需要保存在MFT外部的索引稱作“外部索引”。0XA0屬性的結(jié)構(gòu)與0X80屬性完全一致。因此您可以參見表9。我們把這種有0XA0屬性的目錄稱作大目錄。大目錄的MFT記錄可能如下(在此只提出重要的屬性,真實的MFT記錄可能還包含別的屬性)屬性頭 0X10屬性頭 0X10屬性 0X30屬性頭 0X30屬性 0X90屬性頭(索引頭) 0X90屬性 (可能為空,也可能含有子項目。為1級節(jié)點)注意:90H屬性的最后8位是它的子節(jié)點VCN,可以根據(jù)該簇號和運行定位它的子節(jié)點。 0XA0屬性頭0XA0屬性 0XB0屬性頭 0XB0屬性 FF FF FF FF 82 79 47 11 表12 大目錄典型MF

40、T記錄 0XA0屬性的運行記錄了外部索引分配的空間。目錄的外部索引是以一個索引塊為單位分配的(與簇的概念類似)。一般來說,一個索引塊占4K的空間。索引塊以“INDEX”開頭,其頭部的固定結(jié)構(gòu)如下:偏移大小意義 0X004INDEX 0X042更新序列號的偏移 0X062更新序列號與更新數(shù)組(以字節(jié)為單位) 0X088日志文件序列號 0X108本索引緩存在索引分配中的VCN 0X184索引項的偏移(以字節(jié)為單位,相對0 x18偏移到索引項) 0X1C4總的索引項的大小(相對0X18偏移到結(jié)尾) 0X204索引項分配大小 0X241如果不是葉節(jié)點,置1,表示還有子節(jié)點 0X253用0填充 0X28

41、2更新序列(重要:與每扇區(qū)最后2個字節(jié)的值一致) 0X2A2S-1更新序列數(shù)組 表13 索引區(qū)頭部結(jié)構(gòu)索引塊頭部之后,連接的是索引目錄項,其結(jié)構(gòu)與前面介紹的索引項目是一致的。這里不重復(fù)介紹。3.2 文件的查找方式文件的索引延展到外部是分層次的。其層級結(jié)構(gòu)圖如下。理論上說,3級目錄可以容納幾千個文件。已經(jīng)足夠滿足現(xiàn)在的需求。簡單的介紹一下目錄的生成方式。目錄一定是從小目錄到大目錄(因為文件需要一個個的拷貝)。小目錄的結(jié)構(gòu)很簡單,前面也已經(jīng)做了詳細(xì)的分析。此時再不斷增加文件,目錄會有以下幾個步驟的變化。1、一級大目錄(僅有一個索引塊)索引塊既是葉節(jié)點。它的VCL為0。一個索引塊只能存放20-30個文件。索引塊中的索引項,以文件名按照字母大小排列。2、二級大目錄(有多個索引塊)當(dāng)文件繼續(xù)增加,一個索引塊不能滿足要求,此時再增加一個索引塊,VCL為1,并在0X90屬性中增加一個索引項目,為了描述,我把這個項目叫做基點。仍然對所有的項目按

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論