午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

NTFS文件系統(tǒng)結(jié)構(gòu)分析

 DavinTang 2010-12-29

NTFS文件系統(tǒng)結(jié)構(gòu)分析

在NTFS文件系統(tǒng)中,文件存取是按簇進(jìn)行分配,一個簇必需是物理扇區(qū)的整數(shù)倍,而且總是2的整數(shù)次方。NTFS文件系統(tǒng)并不去關(guān)心什么是扇區(qū),也不會去關(guān)心扇區(qū)到底有多大(如是不是512字節(jié)),而簇大小在使用格式化程序時(shí)則會由格式化程序根據(jù)卷大小自動的進(jìn)行分配。

文件通過主文件表(MFT)來確定其在磁盤上的存儲位置。主文件表是一個對應(yīng)的數(shù)據(jù)庫,由一系列的文件記錄組成--卷中每一個文件都有一個文件記錄(對于大型文件還可能有多個記錄與之相對應(yīng))。主文件表本身也有它自己的文件記錄。

NTFS卷上的每個文件都有一個64位(bit)稱為文件引用號(File Reference Number,也稱文件索引號)的唯一標(biāo)識。文件引用號由兩部分組成:一是文件號,二是文件順序號。文件號為48位,對應(yīng)于該文件在MFT中的位置。文件 順序號隨著每次文件記錄的重用而增加,這是為NTFS進(jìn)行內(nèi)部一致性檢查而設(shè)計(jì)的。

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


 


 

NTFS的目錄只是一個簡單的文件名和文件引用號的索引,如果目錄的屬性列表小于一個記錄的長度,那么該目錄的所有信息都存儲在主文件表的記錄中,對于大于記錄的目錄則使用B+樹進(jìn)行管理。


 


 


 

主文件表中的基本文件記錄中有一個指針指向一個存儲非常駐索引緩沖--包括該目錄下所有下一級子目錄和文件的外部簇,而B+樹結(jié)構(gòu)便于大型目錄中文件和子目錄的快速查找。

在NTFS中,所有存儲在卷上的數(shù)據(jù)都包含在文件中,包括用來定位和獲取文件的數(shù)據(jù)結(jié)構(gòu),引導(dǎo) 程序和記錄這個卷的記錄(NTFS元數(shù)據(jù))的位圖,這體現(xiàn)了NTFS的原則:磁盤上的任何事物都為文件。在文件中存儲一切使得文件系統(tǒng)很容易定位和維護(hù)數(shù) 據(jù),而在NTFS中,卷中所有存放的數(shù)據(jù)均在一個叫做MFT的文件記錄數(shù)組中,稱為主文件表(Master File Table),MFT是由高級格式化產(chǎn)生的。而MFT則由文件記錄(File Record)數(shù)組構(gòu)成。File Record的大小一般是固定的,不管簇的大小是多少,均為1KB,這個概念相當(dāng)于Linux中的inode(i節(jié)點(diǎn))。File Record在MFT文件記錄數(shù)組中物理上是連續(xù)的,且從0開始編號。MFT僅供系統(tǒng)本身組織、架構(gòu)文件系統(tǒng)使用,這在NTFS中稱為元數(shù)據(jù) (metadata)。其中最基本的前16個記錄是操作系統(tǒng)使用的非常重要的元數(shù)據(jù)文件。這些NTFS主文件表的重要的元數(shù)據(jù)文件都是以$(美元符號)開 始的名字,所以是隱藏文件,在Windows 2000中不能使用dir命令(甚至加上/ah參數(shù))像普通文件一樣列出這些元數(shù)據(jù)文件。實(shí)際上File System Driver(ntfs.sys)維護(hù)了一個系統(tǒng)變量NTFS Protect System Files用于隱藏這些元數(shù)據(jù)。但是微軟公司也提供了一個OEM TOOL,叫做NFI.EXE,用此工具可以轉(zhuǎn)儲NTFS主文件表的重要的元數(shù)據(jù)文件(元數(shù)據(jù):是存儲在卷上支持文件系統(tǒng)格式管理的數(shù)據(jù)。它不能被應(yīng)用程 序來訪問,它只能為系統(tǒng)提供服務(wù)),使用NFI顯示結(jié)果如下:


 

C:\>nfi C: |MORE


 


 


 

而這些元數(shù)據(jù)文件文件是系統(tǒng)驅(qū)動程序裝配卷所必需的,WINDOWS 2000給每個分區(qū)賦予一個盤符并不表示該分區(qū)包含有WINDOWS 2000可以識別的文件系統(tǒng)格式,如果一旦主文件表損壞,那么該分區(qū)在WINDOWS 2000下是無法讀取的。為了使該分區(qū)能夠在WINDOWS 2000下能被識別,也就是必須首先建立WINDOWS 2000可以識別的文件系統(tǒng)格式即主文件表,這可通過高級格式化該分區(qū)來完成。眾所周知,Windows以簇號來定位文件在磁盤存儲的位置,在FAT格式 的文件系統(tǒng)中有關(guān)簇號的指針是包含在FAT表中的,而在NTFS中有關(guān)簇號的指針是包含在$MFT及$MFTMirr文件中的。


 

NTFS元文件


 

伴隨著以上這些新增功能的是更多的用于存放與功能相關(guān)的數(shù)據(jù)的元文件。最后,在下面的表中羅列出NTFS5中所有的元文件:


 


 


每個MFT記錄都對應(yīng)著不同的文件,如果一個文件有很多屬性或是分散成很多碎片,就很可能需要多個文件記錄。這時(shí),存放其文件記錄位置的第一個記錄就叫做“基文件記錄”(base file record)。


 

MFT中的第1個記錄就是MFT自身。由于MFT文件本身的重要性,為了確保文件系統(tǒng)結(jié)構(gòu)的可靠性,系統(tǒng)專門為它準(zhǔn)備了一個鏡像文件($MftMirr),也就是MFT中的第2個記錄。


 

第3個記錄是日志文件($LogFile)。該文件是NTFS為實(shí)現(xiàn)可恢復(fù)性和安全性而設(shè)計(jì)的。當(dāng)系統(tǒng)運(yùn)行時(shí),NTFS就會在日志文件中記錄所有影響NTFS卷結(jié)構(gòu)的操作,包括文件的創(chuàng)建和改變目錄結(jié)構(gòu)的命令,例如復(fù)制,從而在系統(tǒng)失敗時(shí)能夠恢復(fù)NTFS卷。


 

第4個記錄是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一個標(biāo)明該磁盤是否損壞的標(biāo)志位(NTFS系統(tǒng)以此決定是否需要調(diào)用Chkdsk程序來進(jìn)行修復(fù))。


 

第5個記錄是屬性定義表($AttrDef,attribute definition table),其中存放了卷所支持的所有文件屬性,并指出它們是否可以被索引和恢復(fù)等。


 

第6個記錄是根目錄(\),其中保存了存放于該卷根目錄下所有文件和目錄的索引。在訪問了一個文件后,NTFS就保留該文件的MFT引用,第二次就能夠直接進(jìn)行對該文件的訪問。


 

第7個記錄是位圖文件($Bitmap)。NTFS卷的分配狀態(tài)都存放在位圖文件中,其中每一 位(bit)代表卷中的一簇,標(biāo)識該簇是空閑的還是已被分配了的,由于該文件可以很容易的被擴(kuò)大,所以NTFS的卷可以很方便的動態(tài)的擴(kuò)大,而FAT格式 的文件系統(tǒng)由于涉及到FAT表的變化,所以不能隨意的對分區(qū)大小進(jìn)行調(diào)整。


 

第8個記錄是引導(dǎo)文件($Boot),它是另一個重要的系統(tǒng)文件,存放著Windows 2000/XP的引導(dǎo)程序代碼。該文件必須位于特定的磁盤位置才能夠正確地引導(dǎo)系統(tǒng)。該文件是在Format程序運(yùn)行時(shí)創(chuàng)建的,這正體現(xiàn)了NTFS把磁盤 上的所有事物都看成是文件的原則。這也意味著雖然該文件享受NTFS系統(tǒng)的各種安全保護(hù),但還是可以通過普通的文件I/O操作來修改。


 

第9個記錄是壞簇文件($BadClus),它記錄了磁盤上該卷中所有的損壞的簇號,防止系統(tǒng)對其進(jìn)行分配使用。


 

第10個記錄是安全文件($Secure),它存儲了整個卷的安全描述符數(shù)據(jù)庫。NTFS文件和目錄都有各自的安全描述符,為了節(jié)省空間,NTFS將具有相同描述符的文件和目錄存放在一個公共文件中。


 

第11個記錄為大寫文件($UpCase,upper case file),該文件包含一個大小寫字符轉(zhuǎn)換表。


 

第12個記錄是擴(kuò)展元數(shù)據(jù)目錄($Extended metadata directory)。


 

第13個記錄是重解析點(diǎn)文件($Extend\$Reparse)。


 

第14個記錄是變更日志文件($Extend\$UsnJrnl)。


 

第15個記錄是配額管理文件($Extend\$Quota)。


 

第16個記錄是對象ID文件($Extend\$ObjId)。


 

第17~23記錄是是系統(tǒng)保留記錄,用于將來擴(kuò)展。


 

MFT的前16個元數(shù)據(jù)文件是如此重要,為了防止數(shù)據(jù)的丟失,NTFS系統(tǒng)在該卷文件存儲部分的正中央對它們進(jìn)行了備份,參見下圖。


 


 


 

NTFS把磁盤分成了兩大部分,其中大約12%分配給了MFT,以滿足其不斷增長的文件數(shù)量。 為了保持MFT元文件的連續(xù)性,MFT對這12%的空間享有獨(dú)占權(quán)。余下的88%的空間被分配用來存儲文件。而剩余磁盤空間則包含了所有的物理剩余空間 --MFT剩余空間也包含在里面。MFT空間的使用機(jī)制可以這樣來描述:當(dāng)文件耗盡了存儲空間時(shí),Windows操作系統(tǒng)會簡單地減少M(fèi)FT空間,并把它 分配給文件存儲。當(dāng)有剩余空間時(shí),這些空間又會重新被劃分給MFT。雖然系統(tǒng)盡力保持MFT空間的專用性,但是有時(shí)不得不做出犧牲。盡管MFT碎片有時(shí)是 無法忍受的,卻無法阻止它的發(fā)生。


 

那么NTFS到底是怎么通過MFT來訪問卷的呢?首先,當(dāng)NTFS訪問某個卷時(shí),它必須“裝 載”該卷:NTFS會查看引導(dǎo)文件(在圖中的$Boot元數(shù)據(jù)文件定義的文件),找到MFT的物理磁盤地址。然后它就從文件記錄的數(shù)據(jù)屬性中獲得VCN到 LCN的映射信息,并存儲在內(nèi)存中。這個映射信息定位了MFT的運(yùn)行(run或extent)在磁盤上的位置。接著,NTFS再打開幾個元數(shù)據(jù)文件的 MFT記錄,并打開這些文件。如有必要NTFS開始執(zhí)行它的文件系統(tǒng)恢復(fù)操作。在NTFS打開了剩余的元數(shù)據(jù)文件后,用戶就可以開始訪問該卷了。


 

文件和目錄記錄


 

NTFS將文件作為屬性/屬性值的集合來處理,這一點(diǎn)與其他文件系統(tǒng)不一樣。文件數(shù)據(jù)就是未命名屬性的值,其他文件屬性包括文件名、文件擁有者、文件時(shí)間標(biāo)記等。下圖顯示了一個用于小文件的MFT記錄。


 


 


 

每個屬性由單個的流(stream)組成,即簡單的字符隊(duì)列。嚴(yán)格地說,NTFS并不對文件進(jìn) 行操作,而只是對屬性流進(jìn)行讀寫。NTFS提供對屬性流的各種操作:創(chuàng)建、刪除、讀?。ㄗ止?jié)范圍)以及寫入(字節(jié)范圍)。讀寫操作一般是針對文件的未命名 屬性的,對于已命名的屬性則可以通過已命名的數(shù)據(jù)流句法來進(jìn)行操作。


 

一個文件通常占用一個文件記錄。然而,當(dāng)一個文件具有很多項(xiàng)屬性值或很零碎的時(shí)候,就可能需要 占用一個以上的文件記錄。這種情況下,第一個文件記錄是其基本的文件記錄,存儲有該文件需要的其它文件記錄的位置。小文件和文件夾(典型的如1500字節(jié) 或更少)將全部存儲在文件的MFT記錄里。


 


 


文件夾記錄包括索引信息,小文件夾記錄完全存儲在MFT結(jié)構(gòu)內(nèi),然而大的文件夾則被組織成B+樹結(jié)構(gòu),用一個指針指向一個外部簇,該簇用來存儲那些MFT內(nèi)存儲不了的文件夾的屬性。


 


 


 

NTFS卷上文件的常用屬性在下表中列出(并不是所有文件都有所有這些屬性)。


 


 


 

常駐屬性與非常駐屬性


 

當(dāng)一個文件很小時(shí),其所有屬性和屬性值可存放在MFT的文件記錄中。當(dāng)屬性值能直接存放在 MFT中時(shí),該屬性就稱為常駐屬性(resident attribute)。有些屬性總是常駐的,這樣NTFS才可以確定其他非常駐屬性。例如,標(biāo)準(zhǔn)信息屬性和根索引就總是常駐屬性。


 

每個屬性都是以一個標(biāo)準(zhǔn)頭開始的,在頭中包含該屬性的信息和NTFS通常用來管理屬性的信息。該頭總是常駐的,并記錄著屬性值是否常駐、對于常駐屬性,頭中還包含著屬性值的偏侈量和屬性值的長度。


 

如果屬性值能直接存放在MFT中,那么NTFS對它的訪問時(shí)間就將大大縮短。NTFS只需訪問磁盤一次,就可立即獲得數(shù)據(jù);而不必像FAT文件系統(tǒng)那樣,先在FAT表中查找文件,再讀出連續(xù)分配的單元,最后找到文件的數(shù)據(jù)。


 

小文件或小目錄的所有屬性,均可以在MFT中常駐。小文件的未命名屬性可以包括所有文件數(shù)據(jù)。建立一個小文件如下圖所示:


 


 
該文件的內(nèi)容


 



文件屬性


 

如通過NFI查看文件“新建 文本文檔.txt”的文件記錄號為36,顯示內(nèi)容如下:


 

File 36


 

\新建 文本文檔.txt


 

$STANDARD_INFORMATION (resident)


 

$FILE_NAME (resident)


 

$FILE_NAME (resident)


 

$DATA (resident)


 

從顯示內(nèi)容可以看出文件的全部屬性都是常駐屬性,包括DATA屬性,沒有非常駐屬性,所以,用WINHEX打開MFT,查看該文件記錄,有如下圖的內(nèi)容
 
小文件的文件記錄

小目錄的索引根屬性可以包括其中所有文件和子目錄的索引。參見下圖


 
                                                       小目錄的MFT記錄

大文件或大目錄的所有屬性,就不可能都常駐在MFT中。如果一個屬性(如文件數(shù)據(jù)屬性)太大而 不能存放在只有1KB的MFT文件記錄中,那么NTFS將從MFT之外分配區(qū)域。這些區(qū)域通常稱為一個運(yùn)行(run)或一個盤區(qū)(extent),它們可 用來存儲屬性值,如文件數(shù)據(jù)。如果以后屬性值又增加,那么NTFS將會再分配一個運(yùn)行,以便用來存儲額外的數(shù)據(jù)。值存儲在運(yùn)行中而不是在MFT文件記錄中 的屬性稱為非常駐屬性(nonresident attribute)。NTFS決定了一個屬性是常駐還是非常駐的;而屬性值的位置對訪問它的進(jìn)程而言是透明的。

當(dāng)一個屬性為非常駐時(shí),如大文件的數(shù)據(jù),它的頭部包含了NTFS需要在磁盤上定位該屬性值的有關(guān)信息。下圖顯示了一個存儲在兩個運(yùn)行中的非常駐屬性。
 
                                     存儲在兩個運(yùn)行中的非常駐屬性

在標(biāo)準(zhǔn)屬性中,只有可以增長的屬性才是非常駐的。對文件來說,可增長的屬性有數(shù)據(jù)、屬性列表等。標(biāo)準(zhǔn)信息和文件名屬性總是常駐的。

一個大目錄也可能包括非常駐屬性(或?qū)傩圆糠郑?,參見下圖。在該例中,MFT文件記錄沒有足夠 空間來存儲大目錄的文件索引。其中,一部分索引存放在索引根屬性中,而另一部分則存放在叫作“索引緩沖區(qū)”(index buffer)的非常駐運(yùn)行中。這里,索引根、索引分配以及位圖屬性都是簡化表示的,這些屬性將在后面詳細(xì)介紹。對目錄而言,索引根的頭及部分值應(yīng)是常駐 的。


 
                                                           大目錄的MFT記錄

當(dāng)一個文件(或目錄)的屬性不能放在一個MFT文件記錄中,而 需要分開分配時(shí),NTFS通過VCN-LCN之間的映射關(guān)系來記錄運(yùn)行(run)或盤區(qū)情況。LCN用來為整個卷中的簇按順序從0到n進(jìn)行編號,而VCN 則用來對特定文件所用的簇按邏輯順序從0到m進(jìn)行編號。下圖顯示了一個非常駐數(shù)據(jù)屬性的運(yùn)行所使用的VCN與LCN編號。 
                                                          非常駐數(shù)據(jù)屬性的VCN

當(dāng)該文件含有超過2個運(yùn)行時(shí),則第三個運(yùn)行從VCN8開始,數(shù)據(jù)屬性頭部含有前兩個運(yùn)行VCN的映射,這便于NTFS對磁盤文件分配的查詢。為了便于NTFS快速查找,具有多個運(yùn)行文件的常駐數(shù)據(jù)屬性頭中包含了VCN-LCN的映射關(guān)系,參見下圖


                                                    非常駐數(shù)據(jù)屬性的VCN-LCN映射

雖然數(shù)據(jù)屬性常常因太大而存儲在運(yùn)行中,但是其他屬性也可能因MFT文件記錄沒有足夠空間而需 要存儲在運(yùn)行中。另外,如果一個文件有太多的屬性而不能存放在MFT記錄中,那么第二個MFT文件記錄就可用來容納這些額外的屬性(或非常駐屬性的頭)。 在這種情況下,一個叫作“屬性列表”(attribute list)的屬性就加進(jìn)來。屬性列表包括文件屬性的名稱和類型代碼以及屬性所在MFT的文件引用。屬性列表通常用于太大或太零散的文件,這種文件因 VCN-LCN映射關(guān)系太大而需要多個MFT文件記錄。具有超過200個運(yùn)行的文件通常需要屬性列表。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多