NTFS設(shè)計目標(biāo)和特性
1. NTFS設(shè)計目標(biāo)
NTFS設(shè)計目標(biāo)就包含作為一個企業(yè)級文件系統(tǒng)所需要的各種特性:
1.?在意外發(fā)生時厌漂,數(shù)據(jù)損失最小
2.?保護敏感數(shù)據(jù)不被非法訪問
3.?使用廉價的“硬件冗余”來保護數(shù)據(jù)苇倡。
針對這些要求旨椒,NTFS有以下特性:
可恢復(fù)性
原子性事務(wù)(atomic transaction)
1.?要么全做
2.?要么全不做
物理實現(xiàn):分解每個操作综慎,而且對于關(guān)鍵的文件信息寥粹,NTFS使用了額外的存儲區(qū)涝涤,所以如果磁盤上一個扇區(qū)壞了阔拳,NTFS仍然可以訪問這個卷的關(guān)鍵文件系統(tǒng)數(shù)據(jù)。
安全性
直接源于windows的對象模型辨宠。文件和目錄都是被保護的對象嗤形,可以避免遭受到?jīng)]有授權(quán)用戶的訪問赋兵。
物理實現(xiàn):NTFS的MFT表有一個元文件專門存儲安全描述符
數(shù)據(jù)冗余與容錯能力
通過Windows分層驅(qū)動模型(在第九章中介紹)來實現(xiàn)霹期。卷管理器可以跨越幾個卷進行數(shù)據(jù)鏡像历造。
物理實現(xiàn):RADI 1 -----RADI5
2. NTFS的高級特性
多數(shù)據(jù)流Multiple data streams :
文件每個相關(guān)聯(lián)的信息都是屬性吭产,每個屬性就是一個流垮刹。每個文件有一個默認(rèn)數(shù)據(jù)流荒典。
物理實現(xiàn):代碼定義了屬性類型及結(jié)構(gòu)體寺董。
在NTFS中遮咖,與一個文件相關(guān)聯(lián)的每一個信息御吞,包括其名稱、所有者挟裂、時間戳诀蓉、內(nèi)容等待渠啤,都被實現(xiàn)為一個文件屬性(NTFS對象屬性沥曹,NTFS object atrribute)架专。
每個屬性是由一個流(stream)構(gòu)成的部脚,也就說委刘,由一個簡單的字節(jié)序列構(gòu)成锡移。這種一般化的實現(xiàn)方式使得很容易為一個文件加入更多的屬性(也就說說加入更多的流淆珊。)
因為一個文件的數(shù)據(jù)“只不過是該文件的一個屬性”而已施符,而且戳吝,新的屬性還能夠被加入進來听哭,所以陆盘,NTFS文件(和文件目錄)可以包含多個數(shù)據(jù)流隘马。
NFTS文件有一個默認(rèn)的數(shù)據(jù)流祟霍,此默認(rèn)的數(shù)據(jù)流沒有名稱沸呐。應(yīng)用程序可以創(chuàng)建附加的崭添、有名稱的數(shù)據(jù)流英融,并且可以通過其名稱來訪問這些數(shù)據(jù)流屁置。為了避免改變原來的Microsoft Windows I/O API函數(shù)(它們只帶一個字符串作為文件名參數(shù)蓝角。)使鹅,數(shù)據(jù)流的名稱是通過在文件名的后面再加上一個冒號“:”來指定的患朱。因為冒號是一個保留字符裁厅,所以姐直,它可以用作文件名稱和數(shù)據(jù)流名稱直接的一個分隔符声畏,如下面的例子所示:
myfile.dat:stream2
每一個流有一個單獨的分配大胁辶洹(這個值定義了有多少磁盤空間為它而保留)均牢、實際大信枪颉(定義了調(diào)用者已經(jīng)使用了多少字節(jié)),以及有效數(shù)據(jù)的長度(這個數(shù)據(jù)流已經(jīng)多少被初始化了)坞琴。而且每個流也被賦予了一個單獨的文件鎖剧辐,利用這個鎖可以鎖住字節(jié)范圍荧关,已經(jīng)運行并發(fā)訪問忍啤。
在Windows中檀轨,一個使用多數(shù)據(jù)流的組件是Windows server隨帶的Apple Macintosh文件服務(wù)器支持卫枝,還有Windows Explorer也是使用多數(shù)據(jù)流的應(yīng)用程序。當(dāng)你在一個NTFS文件上右鍵點擊并且選擇屬性的時候,結(jié)果對話框中的summary(摘要)標(biāo)簽頁將會允許你講一些信息(比如標(biāo)題沾乘、主題翅阵、作者和關(guān)鍵字)和該文件關(guān)聯(lián)起來掷匠。Windows Explorer將這些信息保存在該文件的另外一個流中讹语,名為summary information顽决。
其他的應(yīng)用程序也可以使用多數(shù)據(jù)流特性才菠。比如一個備份工具可以使用額外的數(shù)據(jù)流來保持有關(guān)備份文件鸠儿、與備份相關(guān)的時間戳信息进每√锿恚或者芹壕,一個存檔工具可以實現(xiàn)多即存儲結(jié)構(gòu)踢涌,其中睁壁,在某個特定日期以前的文件潘明,或者一段時間以來尚未被訪問過的文件都被轉(zhuǎn)移到磁帶上钳降。該工具可以把這樣的文件拷貝到磁帶上遂填,并且將文件的默認(rèn)數(shù)據(jù)流設(shè)置為0,再加入一個數(shù)據(jù)流來指定該文件存儲在磁帶上的名稱和位置凌唬。
實驗:查看數(shù)據(jù)流客税,使用echo和more命令更耻,這兩者支持命名數(shù)據(jù)流秧均。
如果執(zhí)行一次列目錄的命令目胡,test的文件大小并不反映出額外數(shù)據(jù)流中存儲的數(shù)據(jù)眉尸,因為NTFS對于文件查詢操作噪猾,只返回未命名數(shù)據(jù)流的大小袱蜡,列目錄命令也不例外戒劫。
還可以利用streams工具來確定巫橄,在你的系統(tǒng)上哪些文件和目錄具有額外的數(shù)據(jù)流湘换。
基于Unicode的名稱Unicode-based names :
NTFS使用unicode字符來儲存文件筹我、目錄蔬蕊、卷名岸夯。文件名最長255個字符勉吻。Unicode是一種16位的字符編碼方案齿桃,它允許世界上每一種主要語言的每一個字符都可以被唯一表示短纵。
路徑中的每個目錄和文件名可以長達255個字符,可以包含Unicode字符养渴、內(nèi)嵌的空格和多個句點號理卑。
物理實現(xiàn):實際文件名最長253個字符藐唠。?
通用的索引設(shè)施General indexing facility:
可以對文件屬性進行索引妈嘹,使用統(tǒng)一的安全描述符润脸。
NTFS的總體結(jié)構(gòu)是高度結(jié)構(gòu)化的毙驯,從而允許對一個磁盤卷上的文件屬性進行索引。這個特性使得文件系統(tǒng)可以高效的定位到符合某種標(biāo)準(zhǔn)的文件允坚,例如特定目錄中的所有文件稠项。FAT文件系統(tǒng)對文件名編了索引活逆,但是并不對它們進行排序蔗候,因而使得在大的目錄中查找文件非常慢埂软。
NTFS的幾個特性用到了通用的所以機制锈遥,包括統(tǒng)一的安全描述符。在一個卷上勘畔,文件和目錄的安全描述符被保存在單個內(nèi)部流中所灸,因而可以去除重復(fù)的安全描述符,并且它使用NTFS定義的內(nèi)部安全標(biāo)識符進行索引炫七。在后面的“NTFS在磁盤上的結(jié)構(gòu)”一節(jié)中描述了這些特性使用索引機制的做法。
動態(tài)壞簇映射Dynamic bad-cluster remapping:
顯式地讓程序知道壞簇并不使用
物理實現(xiàn):MFT表有一個元文件專門記錄壞簇
一般而言万哪,如果一個程序試圖從一個壞磁盤扇區(qū)中讀取數(shù)據(jù)侠驯,則讀操作會失敗,這個已經(jīng)被分配的簇中的數(shù)據(jù)會變得不可訪問奕巍。但是吟策,如果這個磁盤被格式化為一個容錯的NFTS卷,則Windows的容錯驅(qū)動程序會動態(tài)的獲得一份原本存儲在此壞扇區(qū)中的數(shù)據(jù)的好的拷貝的止,然后發(fā)送一個警告踊挠,告訴NTFS這個扇區(qū)已經(jīng)壞了。于是NTFS分配一個新的簇冲杀,替換掉扇區(qū)所在的簇,然后把數(shù)據(jù)拷貝到新的簇中睹酌。它對于壞的簇做上標(biāo)記权谁,以后不再使用這個簇。
這種數(shù)據(jù)恢復(fù)和動態(tài)的壞簇重新映射的機制憋沿,對于文件服務(wù)器和容錯系統(tǒng)旺芽,或者對于不能承受數(shù)據(jù)丟失的任何應(yīng)用程序來說,都是一種特別有用的特性。當(dāng)一個扇區(qū)變壞的時候采章,這個管理卷還沒有被加載运嗜,那么NTFS依然替換掉壞簇,不再使用這個壞簇悯舟,但是不能恢復(fù)壞簇上原來的數(shù)據(jù)担租。
硬鏈接(Hard links)
硬鏈接可以讓多個路徑指向同一個文件(不支持硬鏈接目錄)。如果創(chuàng)建了一個硬鏈接指向一個已有的文件抵怎,這兩個路徑會指向同一個地址奋救。任何一個路徑都可以來改變這個文件。
進程可以利用Windows的CreateHardLink函數(shù)或者POSIX ln函數(shù)來創(chuàng)建硬鏈接反惕。
軟鏈接和交接Symbolic (soft) links and junctions :
多個路徑指向同一個文件尝艘。
與硬鏈接不同,符號鏈接是動態(tài)解釋的字符串姿染,可以是相對的或絕對路徑背亥,指的是任何存儲設(shè)備上的位置,包括不同本地卷上的位置悬赏,甚至是不同系統(tǒng)上的共享狡汉。這意味著符號鏈接實際上不會增加原始文件的引用計數(shù),因此刪除原始文件將導(dǎo)致數(shù)據(jù)丟失舷嗡,并且指向不存在的文件的符號鏈接將被丟棄轴猎。最后,不同于硬鏈接进萄,符號鏈接可以指向目錄捻脖,而不僅僅是文件,這給它們帶來了額外的優(yōu)勢中鼠。
軟鏈接的好處就是可以讓一個目錄或文件有多個入口但保持單一物理位置可婶,方便應(yīng)用和管理。
交接:
重定向援雇,把一個文件和路徑名重定向到另一個目錄上矛渴。
物理實現(xiàn):在MFT表有一個元文件專門記錄重解析點。這個特性使得NTFS可以用一個目錄名表示另一個物理卷惫搏。
Windows沒有包含任何可以用來創(chuàng)建交接的工具具温,但是可以利用www.sysinternals.com的junction工具(網(wǎng)站上包含了其源代碼),或者Windows資源箱里的工具Linked來創(chuàng)建一個交接筐赔。
例如铣猩,如果路徑C:\Drivers程序是一個目錄符號鏈接,它重定向到%StaseRoo%%\Stuls32 \Drivers茴丰,一個應(yīng)用程序讀取C:\Trave\NTFS.S實際上讀取%StaseRooS%\Stsystem \Drivers\NTFS.Sys.
交接junctions是的一種有效方法达皿,將目錄樹深處的目錄提升到更方便的深度天吓,而同時不破壞原來目錄樹的結(jié)構(gòu)或內(nèi)容。剛才引用的示例將Drivers目錄升至卷的根目錄峦椰,當(dāng)通過交接junctions訪問Ntfs.sys時龄寞,將NTFS.S的目錄深度從三級降低到1級。你不能使用交接機制來連接到遠程的目錄汤功,你只能連接到本地卷的目錄中物邑。
你可以把交接junctions的工作方式看作快捷方式一樣,除了它們實際上是在文件系統(tǒng)上實現(xiàn)的冤竹,而不是由Windows資源管理器管理的.LNK文件拂封。就像硬鏈接一樣,交接junctions可以用MKLink實用工具(沒有/h選項)或通過CytSysMyBrimLink API創(chuàng)建鹦蠕。
mklink是windows系統(tǒng)下創(chuàng)建符號鏈接和硬鏈接的命令工具冒签,它是一個很好的解決文件系統(tǒng)問題的工具。使用它需要管理員權(quán)限钟病。
首先萧恕,先來介紹下mklink這個命令,可以看下下面的截圖:
mklink
創(chuàng)建符號鏈接肠阱。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D ? ? ?創(chuàng)建目錄符號鏈接票唆。默認(rèn)為文件
符號鏈接。
/H ? ? ?創(chuàng)建硬鏈接而非符號鏈接屹徘。
/J ? ? ?創(chuàng)建目錄聯(lián)接走趋。
Link ? ?指定新的符號鏈接名稱。
Target ?指定新鏈接引用的路徑
(相對或絕對)噪伊。
說明也已經(jīng)很詳細(xì)了簿煌,我們直接看下面例子吧。
下面的圖片向我們展示了在windows系統(tǒng)中創(chuàng)建符號鏈接鉴吹,硬鏈接和快捷方式有什么不同姨伟。
符號鏈接(Symbolic link)
執(zhí)行命令 mklink link_name target_name
創(chuàng)建鏈接后的圖標(biāo)和快捷方式很像, 都有一個箭頭的標(biāo)志
在系統(tǒng)中不占用空間
在文件系統(tǒng)中不是一個單獨的文件
在操作系統(tǒng)層解析(!豆励?)
如果源文件被刪除了夺荒,鏈接就沒用了
移除源文件不會影響符號鏈接
移除鏈接文件也不會影響源文件
win10_x64_build10565上測試不可以右鍵修改圖標(biāo)和設(shè)置管理員運行
文件大小為0字節(jié)和不占用空間
文件屬性的創(chuàng)建時間和修改時間都是軟鏈接創(chuàng)建和修改時的時間
文件類型是.SYMLINK
可以在cmd下運行軟鏈接(假如鏈接的是程序, 且運行命令是XXX即可)(win10_x64_build10565上測試通過)
硬鏈接(Hard link)
執(zhí)行命令 mklink /H link_name target_name
在系統(tǒng)中占用的空間與源文件相同,但在系統(tǒng)中引用的是相同的對象(不是拷貝)
在操作系統(tǒng)層解析(A颊簟技扼?)
圖標(biāo)和創(chuàng)建快捷方式的圖標(biāo)不同(沒有快捷方式的小箭頭)
移除源文件不會影響硬鏈接
移除硬鏈接不會影響源文件
如果源文件被刪除,它的內(nèi)容依然通過硬鏈接存在
硬鏈接文件的任何更改都會影響到源文件
文件大小, 占用空間, 創(chuàng)建和修改時間跟原原文件一樣
可以在cmd下運行硬連接(假如鏈接的是程序)
快捷方式(Shortcut)
在選擇的源文件上鼠標(biāo)右鍵嫩痰,通過下拉菜單創(chuàng)建
快捷方式在系統(tǒng)中跟源文件是完全分離的
只有那些懂得快捷方式的程序知道它們
如果源文件刪除淮摔,鏈接就沒用了
移除源文件不會移除快捷方式
移除快捷方式不會影響到源文件
可以右鍵更改圖標(biāo)或者設(shè)置管理員運行
文件屬性的創(chuàng)建時間和修改時間都是快捷方式創(chuàng)建和修改時的時間
文件大小僅有幾百字節(jié), 跟原文件大小無關(guān)
文件類型是.lnk
可以在cmd下運行快捷方式(假如鏈接的是程序, 且運行命令是XXX.LNK)(win10_x64_build10565上測試通過)
壓縮文件和稀疏文件Compression and sparse files:
NTFS支持文件數(shù)據(jù)的壓縮功能。因為NTFS透明的執(zhí)行壓縮和解壓縮過程始赎,所以和橙,應(yīng)用程序不需要任何修改,就能夠利用這個特性造垛。目錄也可以被壓縮魔招,這意味著,該目錄中隨后創(chuàng)建的任何文件都是經(jīng)過壓縮的五辽。
應(yīng)用程序壓縮和解壓縮的做法是办斑,將 FSCTL_SET_COMPRESSION文件系統(tǒng)控制代碼傳遞給DeviceIoControl。他們可以通過FSCTL_GET_COMPRESSION文件系統(tǒng)控制代碼來查詢一個文件或者目錄的壓縮狀態(tài)杆逗。如果一個文件或者目錄是壓縮的乡翅,則它的屬性中設(shè)置了FILE_ATTRIBUTE_COMPRESSED標(biāo)志,所以可以通過GetFileAttributes來確定一個文件或者目錄的壓縮狀態(tài)罪郊。
第二類壓縮文件被稱為稀疏文件蠕蚜。如果一個文件被標(biāo)記為稀疏的,則NTFS并不為“該文件中被應(yīng)用程序指定為空的部分”分配磁盤卷空間悔橄。當(dāng)一個應(yīng)用程序從一個稀疏文件的空區(qū)域讀取數(shù)據(jù)的時候靶累,NTFS返回以0填充的緩沖區(qū)。對于實現(xiàn)“循環(huán)緩沖區(qū)方式的日志(circular-buffer logging)”的客戶/服務(wù)器應(yīng)用程序來說癣疟,這種壓縮類型會非常有用挣柬。在這種應(yīng)用程序中,服務(wù)器將信息記錄到一個文件中睛挚,而客戶異步地從文件中讀取信息邪蛔。因為服務(wù)器寫入的信息在客戶度過以后,就不再需要扎狱,所以不需要將這些信息繼續(xù)保存在文件中侧到。通過將這樣的文件做成一個稀疏文件,客戶可以指定它讀過的文件部分變成空委乌,從而釋放相應(yīng)的卷空間床牧。服務(wù)器可以繼續(xù)在文件后面追加新的信息,不需要擔(dān)心這個文件會一直增長從而消耗掉該卷上所有的可用空間遭贸。
和壓縮文件一樣戈咳,NTFS透明的管理稀疏文件。應(yīng)用程序只需要將FSCTL_SET_SPARSE文件系統(tǒng)控制代碼傳遞給DeviceIoControl壕吹,就可以指定一個文件的稀疏狀態(tài)著蛙。要想設(shè)置文件中的一段范圍為空的,應(yīng)用程序可以使用FSCTL_SET_ZERO_DATA代碼耳贬;應(yīng)用程序還可以利用FSCTL_QUERY_ ALLOCATED_RANGES控制代碼來詢問NTFS踏堡,以獲得一份關(guān)于“文件中哪些部分是稀疏的”的描述。稀疏文件的一個應(yīng)用就是接下來要介紹的NTFS變化日志咒劲。
變化日志Change logging:
許多類型的應(yīng)用程序需要監(jiān)視一個卷中文件和目錄的變化顷蟆。例如诫隅,自動備份程序可以先執(zhí)行一個初始的完全備份,然后基于文件更改進行增量備份帐偎。很顯然逐纬,一個應(yīng)用程序監(jiān)視卷的變化的典型方法是掃描卷,記錄文件和目錄的狀態(tài)削樊,以及在隨后的掃描檢測后比對差異豁生。然而,這個過程會對系統(tǒng)性能產(chǎn)生不利影響漫贞,特別是在成千上萬或上萬個文件的計算機上甸箱,系統(tǒng)性能會下降很多。
另一種方法是應(yīng)用程序通過使用FiFixStReNeNoTeCudio或RerecDirectyReSeWWindows函數(shù)注冊目錄通知迅脐。作為輸入?yún)?shù)芍殖,應(yīng)用程序指定要監(jiān)視的目錄的名稱,并且每當(dāng)目錄的內(nèi)容發(fā)生更改時仪际,函數(shù)就會返回围小。雖然這種方法比掃描卷更有效,但它要求應(yīng)用程序始終在運行树碱。使用這些函數(shù)還需要一個應(yīng)用程序來掃描目錄肯适,因為FiffFistToSeNooToice并沒有表明目錄中的什么東西發(fā)生了變化,-只是通知某些東西發(fā)生了變化成榜。應(yīng)用程序可以將緩沖區(qū)傳遞給ReadDirectoryChangeW框舔,其中FSD填充了更改記錄。但是赎婚,如果緩沖區(qū)溢出刘绣,則應(yīng)用程序必須準(zhǔn)備好掃描目錄。
NTFS提供了第三種方法挣输,可以克服前兩個缺點的:應(yīng)用程序可以通過使用 FSCTL_ CREATE_ USN_JOURNAL日志文件系統(tǒng)控制代碼(UN是更新序列號)來配置NTFS變化日志設(shè)施纬凤,讓NTFS把有關(guān)文件和目錄變化的信息記錄到一個稱為變化日志(change journal)的內(nèi)部文件中。變化日志(change journal)通常大撩嚼,足以保證應(yīng)用程序有機會處理更改而不丟失任何更改停士。應(yīng)用程序使用 FSCTL_QUERY_USN_JOURNAL 文件系統(tǒng)控制代碼從變化日志中讀取記錄,還可以指定“直到有了新紀(jì)錄以后DeviceIoControl函數(shù)才完成”完丽。
針對每個用戶的卷配額Per-user volume quotas :
為每個用戶提供相應(yīng)的配額管理
物理實現(xiàn):MFT表元文件專門記錄相關(guān)信息
系統(tǒng)管理員經(jīng)常需要跟蹤或限制共享存儲卷上的用戶磁盤空間使用恋技,因此NTFS包括配額管理支持。NTFS的配額管理支持允許為每個用戶指定相應(yīng)的配額限制逻族,這對于“跟蹤使用量”和“用戶什么時候達到警告和限制閾值時的使用”是有用的蜻底。NTFS可以被配置為如果用戶超過其警告限制,則將事件的發(fā)生日志記錄到系統(tǒng)事件日志聘鳞。
類似地薄辅,如果用戶嘗試使用更多的卷存儲要拂,超出了其配額限制允許,NTFS可以將事件記錄到系統(tǒng)事件日志指示其違反配額站楚,并且會導(dǎo)致應(yīng)用程序文件I/O失敗宇弛,錯誤代碼即“磁盤滿”。
NTFS依靠文件和目錄的創(chuàng)建者用戶的用戶安全ID(SID)來標(biāo)記文件和目錄源请,從而跟蹤用戶的卷使用。一個用戶擁有的文件和目錄的邏輯大小被計算在用戶管理員定義的配額限制內(nèi)彻况。
因此谁尸,用戶不能通過創(chuàng)建大于配額允許的空稀疏文件來繞過他或她的配額限制,然后用非零數(shù)據(jù)填充文件纽甘。
類似地良蛮,雖然50-KB文件可能壓縮到10 KB,但使用50 KB的配額計費悍赢。
默認(rèn)情況下决瞳,卷沒有啟用配額跟蹤。您需要使用圖12- 20所示的“卷屬性”對話框的配額選項卡來啟用配額左权,指定默認(rèn)警告和限制閾值皮胡,并配置當(dāng)用戶達到警告或限制閾值時發(fā)生的NTFS行為。您可以從這個對話框啟動Quto Entries工具赏迟,使管理員能夠為每個用戶指定不同的限制和行為屡贺。如果應(yīng)用程序希望與NTFS配額管理組件打交道,可使用COM配額接口锌杀,包括 IDiskQuotaControl, IDiskQuotaUser, and IDiskQuotaEvents甩栈。
鏈接跟蹤Link tracking :
外殼shell快捷方式允許用戶將文件放在它們的外殼shell命名空間(例如在桌面上),這些文件實際上又鏈接到位于文件系統(tǒng)命名空間中的其他文件上糕再。Windows開始菜單廣泛使用外殼shell快捷方式量没。類似地,對象鏈接和嵌入(OLE object linking and embedding)鏈接允許一個應(yīng)用程序的文檔透明地嵌入到其他應(yīng)用程序的文檔中突想。微軟Office套件的產(chǎn)品殴蹄,包括PowerPoint、Excel和Word蒿柳,使用OLE鏈接饶套。
雖然shell和OLE鏈接提供了一種簡單的方法來連接文件和shell命名空間,但是如果用戶移動shell或OLE鏈接的源(鏈接源是鏈接點的文件或目錄)垒探,那么它們很難管理妓蛮。Windows中的NTFS包括對被稱為分布式鏈接跟蹤的服務(wù)應(yīng)用程序的支持,該服務(wù)在鏈接目標(biāo)移動時保持外殼和OLE鏈接的完整性圾叼。使用NTFS鏈路跟蹤支持蛤克,如果位于NTFS卷上的鏈接目標(biāo)移動到始發(fā)卷域中的任何其他NTFS卷捺癞,則鏈接跟蹤服務(wù)可以透明地跟隨移動并更新鏈接以反映該變化。
NTFS link-tracking support is based on an optional file attribute known as an object ID. An application can assign an object ID to a file by using the FSCTL_CREATE_OR_GET_OBJECT_ID (which assigns an ID if one isn’t already assigned) and FSCTL_SET_OBJECT_ID file system control codes. Object IDs are queried with the FSCTL_CREATE_OR_GET_OBJECT_ID and FSCTL_GET_OBJECT_ID file system control codes. The FSCTL_DELETE_OBJECT_ID file system control code lets applications delete object IDs from files.
NTFS鏈接跟蹤支持是基于一個被稱為對象的可選文件屬性(對象ID)上的构挤。應(yīng)用程序可以通過使用FSCTL_CREATE_OR_GET_OBJECT_ID(如果還沒有分配一個ID髓介,則分配一個ID)和?FSCTL_SET_OBJECT_ID?文件系統(tǒng)控制代碼,將一個對象ID分配給一個文件筋现。對象ID用FSCTL_CREATE_OR_GET_OBJECT_ID和FSCTL_GET_OBJECT_ID文件系統(tǒng)控制代碼進行查詢唐础。FSCTL_DELETE_OBJECT_ID文件系統(tǒng)控制代碼允許應(yīng)用程序從文件中刪除對象ID。
加密Encryption:
企業(yè)用戶通常在他們的計算機上存儲敏感信息矾飞。雖然存儲在公司服務(wù)器上的數(shù)據(jù)通常通過適當(dāng)?shù)木W(wǎng)絡(luò)安全設(shè)置和物理訪問控制來安全地保護一膨,但是當(dāng)筆記本電腦丟失或被盜時,存儲在筆記本電腦上的數(shù)據(jù)可以被泄露出去洒沦。這種情況下NTFS文件許可機制無法提供保護豹绪,因為NTFS卷可以通過使用NTFS文件閱讀軟件來完全訪問,而不需要Windows運行的軟件申眼。此外瞒津,當(dāng)使用另一個Windows系統(tǒng)上從管理員帳戶來訪問這些文件的時候,NTFS文件許可機制也無能為力括尸。以前的章節(jié)曾經(jīng)說過管理員帳戶具有獲取所有權(quán)和備份特權(quán)巷蚪,這兩種權(quán)限都允許它通過重寫對象的安全設(shè)置來訪問任何受到保護的對象。
NTFS包括一個稱為加密文件系統(tǒng)(EFS? ? ?Encrypting File System)的設(shè)施姻氨,用戶可以使用它來加密敏感數(shù)據(jù)钓辆。EFS的操作(如文件壓縮的操作一樣)對應(yīng)用程序是完全透明的,這意味著當(dāng)運行 一個應(yīng)用程序讀取文件數(shù)據(jù)的肴焊,如果它是在一個有權(quán)查看該文件數(shù)據(jù)的用戶賬戶下運行的前联,則這些文件數(shù)據(jù)會被自動解密;當(dāng)授權(quán)應(yīng)用程序改變文件數(shù)據(jù)時候娶眷,文件數(shù)據(jù)被自動加密似嗤。
備注:NFTS不允許系統(tǒng)捐的根目錄或者\windows目錄中的文件被加密,因為這些目錄中的許多文件對于引導(dǎo)過程是必需的届宠,而在引導(dǎo)過程中EFS還沒有被激活烁落。
EFS依賴于Windows提供的,用戶模式下的密碼學(xué)服務(wù)豌注,它是由一個內(nèi)核模式組件和一些用戶模式DLL組成的伤塌,其中內(nèi)核模式組件和NTFS緊密的集成在一起,而用戶模式DLL負(fù)責(zé)跟本地安全權(quán)威子系統(tǒng)(LSASS Local Security Authority Subsystem )和密碼學(xué)DLL進行通信轧铁。
POSIX支持:
1.?大小寫敏感
2.?穿越目錄的許可
3.?“文件改變時間”時間戳
4.?硬鏈接
碎片整理Defragmentation:
Even though NTFS makes efforts to keep files contiguous when allocating blocks to extend a file, a volume’s files can still become fragmented over time, especially if the file is extended multiple times or when there is limited free space. A file is fragmented if its data occupies discontiguous clusters. For example, Figure 12-21 shows a fragmented file consisting of five fragments. However, like most file systems (including versions of FAT on Windows), NTFS makes no special efforts to keep files contiguous (this is handled by the built-in defragmenter), other than to reserve a region of disk space known as the master file table (MFT) zone for the MFT. (NTFS lets other files allocate from the MFT zone when volume free space runs low.) Keeping an area free for the MFT can help it stay contiguous, but it, too, can become fragmented. (See the section “Master File Table” later in this chapter for more information on MFTs.)
即使NTFS在分配塊以擴展文件時努力保持文件連續(xù)每聪,但是卷的文件仍然會隨著時間的推移而變得碎片化,特別是當(dāng)文件被多次擴展或者當(dāng)有有限的空閑空間時。如果一個文件的數(shù)據(jù)數(shù)據(jù)占據(jù)不連續(xù)的簇药薯,則認(rèn)為文件被碎片化绑洛。例如,圖12—21顯示了一個由五個片段組成的碎片文件童本。然而真屯,與大多數(shù)文件系統(tǒng)(包括Windows上的FAT版本)一樣,NTFS沒有特別的努力來保持文件連續(xù)(這是由內(nèi)置碎片整理器處理的)穷娱,除了為MFT保留一個被稱為主文件表(MFT)區(qū)域的磁盤空間區(qū)域绑蔫。(當(dāng)卷釋放空間變得很慢時候,NTFS允許其他文件在MFT區(qū)域分配)泵额。保持MFT的空閑區(qū)域可以幫助它保持連續(xù)晾匠,但是它也會變得碎片化。(請參閱本章后面的“主文件表”一節(jié)梯刚,了解更多關(guān)于MFTS的信息)。
To facilitate the development of third-party disk defragmentation tools, Windows includes a defragmentation API that such tools can use to move file data so that files occupy contiguous clusters. The API consists of file system controls that let applications obtain a map of a volume’s free and in-use clusters (FSCTL_GET_VOLUME_BITMAP), obtain a map of a file’s cluster usage (FSCTL_GET_ RETRIEVAL_POINTERS), and move a file (FSCTL_MOVE_FILE). Windows includes a built-in defragmentation tool that is accessible by using the Disk Defragmenter utility (%SystemRoot%\System32\Dfrgui.exe), shown in Figure 12-22, as well as a commandline interface, %SystemRoot%\System32\Defrag.exe, that you can run interactively or schedule but that does not produce detailed reports or offer control—such as excluding files or directories—over the defragmentation process.
為了支持第三方開發(fā)磁盤碎片整理工具薪寓,Windows包含了一個碎片整理API亡资。這類工具可以利用這個API來移動文件數(shù)據(jù),從而是文件占據(jù)連續(xù)的簇向叉。這個API是由一些文件系統(tǒng)控制代碼構(gòu)成的锥腻,這些文件系統(tǒng)控制代碼運行應(yīng)用程序得到一個卷的空閑和被使用的簇的地圖(FSCTL_GET_VOLUME_BITMAP),得到一個文件簇使用的地圖(FSCTL_GET_ RETRIEVAL_POINTERS)母谎,和移動一個文件?(FSCTL_MOVE_FILE)半醉。
Windows包含一個內(nèi)置的碎片整理工具符糊,通過使用Disk Defragmenter工具可以訪問到(%SystemRoot%\System32\Dfrgui.exe)。
C:\Windows\System32 和開始菜單都可以打開這個工具。
The only limitation imposed by the defragmentation implementation in NTFS is that paging files and NTFS log files cannot be defragmented.
只讀支持 和動態(tài)分區(qū)Read-only support and dynamic partitioning:
The NTFS driver allows users to dynamically resize any partition, including the system partition, either shrinking or expanding it (if enough space is available). Expanding a partition is easy if enough space exists on the disk and is performed through the FSCTL_EXPAND_VOLUME file system control code. Shrinking a partition is a more complicated process, because it requires moving any file system data that is currently in the area to be thrown away to the region that will still remain after the shrinking?process (a mechanism similar to defragmentation). Shrinking is implemented by two components: the shrinking engine and the file system driver.
NTFS驅(qū)動程序允許用戶動態(tài)調(diào)整任何分區(qū)姆泻,包括系統(tǒng)分區(qū),或者縮小或擴展系統(tǒng)分區(qū)(如果有足夠的空間可用)此熬。如果磁盤上存在足夠的空間鸡挠,并且通過?FSCTL_EXPAND_VOLUME?卷文件系統(tǒng)控制代碼執(zhí)行分區(qū),擴展分區(qū)是很容易的懈贺。收縮分區(qū)是一個更復(fù)雜的過程经窖,因為它需要將當(dāng)前要扔掉的區(qū)域中的任何文件系統(tǒng)數(shù)據(jù)移動到收縮過程之后仍將保留的區(qū)域(類似于碎片整理的機制)。收縮是由兩個組件實現(xiàn)的:收縮引擎和文件系統(tǒng)驅(qū)動程序梭灿。
The shrinking engine is implemented in user mode. It communicates with NTFS to determine the maximum number of reclaimable bytes—that is, how much data can be moved from the region that will be resized into the region that will remain. The shrinking engine uses the standard defragmentation mechanism shown earlier, which doesn’t support relocating page file fragments that are in use or any other files that have been marked as unmovable with the FSCTL_MARK_HANDLE file system control code (like the hibernation file). The master file table backup ($MftMirr), the NTFS metadata transaction log ($LogFile), and the volume label file ($Volume) cannot be moved, which limits the minimum size of the shrunk volume and causes wasted space.
收縮引擎是在用戶模式下實現(xiàn)的画侣。它與NTFS通信以確定可恢復(fù)字節(jié)的最大數(shù)量,即堡妒,可以從將被調(diào)整到將保留的區(qū)域中的區(qū)域移動多少數(shù)據(jù)配乱。
收縮引擎使用前面所示的標(biāo)準(zhǔn)碎片整理機制,它不支持重新定位正在使用的頁文件碎片或任何其他被FSCTL_MARK_HANDLE文件系統(tǒng)控制代碼標(biāo)記為不可移動的文件(如休眠文件)。
主文件表備份($MFtmir)宪卿、NTFS元數(shù)據(jù)事務(wù)日志($Logfile)和卷標(biāo)簽文件($卷)不能移動的诵,這限制了縮小卷的最小大小,并導(dǎo)致浪費空間佑钾。
The file system driver shrinking code is responsible for ensuring that the volume remains in a consistent state throughout the shrinking process. To do so, it exposes an interface that uses three requests that describe the current operation, which are sent through the FSCTL_SHRINK_VOLUME control code:?
■ The ShrinkPrepare request, which must be issued before any other operation. This request takes the desired size of the new volume in sectors and is used so that the file system can block further allocations outside the new volume boundary. The ShrinkPrepare request doesn’t verify whether the volume can actually be shrunk by the specified amount, but it does ensure that the amount is numerically valid and that there aren’t any other shrinking operations ongoing. Note that after a prepare operation, the file handle to the volume becomes associated with the shrink request. If the file handle is closed, the operation is assumed to be aborted.?
■ The ShrinkCommit request, which the shrinking engine issues after a ShrinkPrepare request. In this state, the file system attempts the removal of the requested number of clusters in the most recent prepare request. (If multiple prepare requests have been sent with different sizes, the last one is the determining one.) The ShrinkCommit request assumes that the shrinking engine has completed and will fail if any allocated blocks remain in the area to be shrunk.?
■ The ShrinkAbort request, which can be issued by the shrinking engine or caused by events such as the closure of the file handle to the volume. This request undoes the ShrinkCommit operation by returning the partition to its original size and allows new allocations outside the shrunk region to occur again. However, defragmentation changes made by the shrinking engine remain.
文件系統(tǒng)驅(qū)動程序收縮代碼負(fù)責(zé)確保卷在收縮過程中保持一致狀態(tài)西疤。為此,它公開了一個接口休溶,該接口使用三個描述當(dāng)前操作的請求代赁,這些請求是通過?FSCTL_SHRINK_VOLUME卷控制代碼發(fā)送的:
“ShrinkPrepare?請求”,它必須在任何其他操作之前發(fā)出兽掰。這個請求占用扇區(qū)中新卷的期望大小芭碍,得到這個暑假文件系統(tǒng)可以阻止新的卷邊界之外的進一步分配。ShrinkPrepare?請求不驗證卷是否可以按指定的數(shù)量收縮孽尽,但它確實確保了數(shù)值是有效的窖壕,并且沒有任何其他收縮操作正在進行。注意杉女,在準(zhǔn)備操作之后瞻讽,卷的文件句柄與收縮請求關(guān)聯(lián)。如果文件句柄已關(guān)閉熏挎,則假定操作被中止速勇。
ShrinkCommit請求,收縮引擎在ShrinkPrepare請求之后發(fā)出請求坎拐。在這種狀態(tài)下烦磁,文件系統(tǒng)嘗試在最近的準(zhǔn)備請求中移除所請求的簇數(shù)。(如果多個準(zhǔn)備請求被發(fā)送到不同的大小哼勇,最后一個請求是確定的都伪。)ShrinkCommit請求假定收縮引擎已經(jīng)完成并且如果分配的塊留在待縮小的區(qū)域中,則將失敗积担≡耗纾“收縮中止請求”,它可以由收縮引擎發(fā)出磅轻,也可以由諸如文件句柄關(guān)閉到卷的事件引起珍逸。此請求通過將分區(qū)返回到其原始大小來取消收縮提交操作,并允許重新收縮區(qū)域之外的新分配再次發(fā)生聋溜。然而谆膳,收縮引擎所做的碎片整理更改仍然存在。
“ShrinkAbort請求”撮躁,它可以由收縮引擎發(fā)出漱病,也可以由諸如文件句柄關(guān)閉到卷的事件引起。此請求通過將分區(qū)返回到其原始大小來取消收縮提交操作,并允許重新收縮區(qū)域之外的新分配再次發(fā)生杨帽。然而漓穿,收縮引擎所做的碎片整理更改仍然存在。