NTFS重解析點(diǎn)(英語(yǔ):NTFS reparse point),微軟官方也譯重分析點(diǎn)、重新解析點(diǎn)、重新分析點(diǎn),是NTFS文件系統(tǒng)中的一種對(duì)象類型。它在Windows 2000及之后版本中的NTFS v3.0及以上版本中可用。重解析點(diǎn)提供一種擴(kuò)展NTFS文件系統(tǒng)的方法。一個(gè)重解析點(diǎn)包含一個(gè)重解析標(biāo)簽和數(shù)據(jù),文件系統(tǒng)過(guò)濾器(file system filter)可以按標(biāo)簽解讀它。微軟提供了幾個(gè)默認(rèn)標(biāo)簽,包括NTFS符號(hào)鏈接、NTFS目錄交接點(diǎn)和NTFS卷掛載點(diǎn)。另外,重解析點(diǎn)在Windows 2000的分層存儲(chǔ)系統(tǒng)中作為已移動(dòng)文件的占位符。它還可以作為硬鏈接,并且不限于同分卷的文件:可以指向任何本地分卷中的目錄。
設(shè)計(jì)一般情況:
硬鏈接:鏈接到一個(gè)文件(MFT記錄)。數(shù)據(jù)會(huì)保持可用,只要有至少一個(gè)指向它的鏈接存在。
軟鏈接:鏈接到文件名(文件路徑)。1
軟鏈接Windows Vista支持新的符號(hào)鏈接能力,它取代Windows 2000和Windows XP中的目錄交接點(diǎn)。它的設(shè)計(jì)目的是幫助遷移和UNIX操作系統(tǒng)的應(yīng)用程序的兼容性。不同于目錄交接點(diǎn),符號(hào)鏈接也可以指向一個(gè)文件或或遠(yuǎn)程SMB網(wǎng)絡(luò)路徑。此外,NTFS符號(hào)鏈接的實(shí)現(xiàn)提供了跨文件系統(tǒng)的鏈接支持。但是,啟用跨主機(jī)的符號(hào)鏈接功能需要遠(yuǎn)程系統(tǒng)也支持它,這使支持性限制在Windows Vista及更高版本的Windows操作系統(tǒng)。
NTFS符號(hào)鏈接(SYMLINK):本地或遠(yuǎn)程,相對(duì)或絕對(duì)SMB文件或路徑。啟用跨主機(jī)符號(hào)鏈接需要遠(yuǎn)程系統(tǒng)也支持它,這使支持性限制在Windows Vista及更高版本的Windows操作系統(tǒng)。Windows Server 2008使用軟連接把\Users\All Users\ -> \ProgramData\重定向。符號(hào)鏈接可以指向不存在的目標(biāo),因?yàn)椴僮飨到y(tǒng)不會(huì)檢查目標(biāo)是否存在。使用mklink或mklink /D時(shí),相對(duì)符號(hào)鏈接僅限于單個(gè)卷。
目錄交接點(diǎn),也稱軟鏈接:可用于同一臺(tái)計(jì)算機(jī)的同一個(gè)卷或不同卷的目錄的鏈接。不能用于對(duì)文件的連接。底層是用重解析點(diǎn)實(shí)現(xiàn)。使用mklink /J創(chuàng)建 junction 點(diǎn)后,使用Windows資源管理器刪除它時(shí),如果使用了Shift+Delete,將立即刪除目標(biāo)文件 (Windows 2000/XP/2003)。del my_junction命令不應(yīng)該使用,因?yàn)樗鼤?huì)刪除目標(biāo)目錄中的所有文件。在Windows Vista及更高版本中,使用junction刪除目錄交接點(diǎn)是安全的。
卷裝載點(diǎn)(Volume Mount Points):卷裝載點(diǎn)和前2者類似,只是更進(jìn)一層:它能創(chuàng)建對(duì)整個(gè)卷的鏈接。
遠(yuǎn)程存儲(chǔ)服務(wù)器(Microsoft Remote Storage Server):Windows 2000的這個(gè)特性能利用一些規(guī)則來(lái)移除NTFS卷上不常用的文件,放到存檔介質(zhì)里(比如CD-RW或磁帶)。當(dāng)它把文件移出到“線下”或“半線下”的存儲(chǔ)介質(zhì)上時(shí),RSS自動(dòng)創(chuàng)建指向這個(gè)存檔文件的重解析點(diǎn),以備日后使用。1
硬鏈接NTFS硬鏈接:從Windows NT 4開始:同一驅(qū)動(dòng)器上的文件,有多個(gè)路徑指向它。從Windows 2000開始,Windows API包括一個(gè)CreateHardLink()函數(shù)來(lái)創(chuàng)建硬鏈接,并且 DeleteFile() 可以移除它們。所有Windows NT版本都可以使用GetFileInformationByHandle()來(lái)確定一個(gè)文件已關(guān)聯(lián)的硬鏈接數(shù)量。硬鏈接需要NTFS分區(qū)。運(yùn)行在Windows上的類Unix仿真或軟件兼容層(如Cygwin和基于UNIX應(yīng)用程序的子系統(tǒng))允許在Windows上使用POSIX接口。大多數(shù)現(xiàn)代操作系統(tǒng)不允許硬鏈接目錄以避免無(wú)限遞歸目錄;而且,硬鏈接目錄可能導(dǎo)致父目錄的條目不一致;通常使用符號(hào)鏈接和NTFS目錄交接點(diǎn)達(dá)到此目的。硬鏈接只能對(duì)同一文件系統(tǒng)上的文件創(chuàng)建。如果需要?jiǎng)?chuàng)建到另一文件系統(tǒng)的鏈接,應(yīng)該使用符號(hào)鏈接。硬鏈接可以使用mklink /H命令創(chuàng)建。
硬鏈接使用與原文件相同的MFT記錄。添加一個(gè)硬鏈接會(huì)創(chuàng)建一個(gè)新的文件名屬性并增加硬鏈接計(jì)數(shù)器(每個(gè)新創(chuàng)建的文件+1)。刪除一個(gè)硬鏈接會(huì)移除相應(yīng)的文件名并將硬鏈接計(jì)數(shù)器-1。當(dāng)計(jì)數(shù)器歸零時(shí),文件系統(tǒng)將刪除該文件、釋放其占用的磁盤空間及其MFT記錄。所有名稱屬性是獨(dú)立的,因此刪除、移動(dòng)或重命名文件不會(huì)影響其他硬鏈接。1
特性卷掛載點(diǎn)NTFS卷掛載點(diǎn)類似Unix掛載點(diǎn),將另一個(gè)文件系統(tǒng)的根附加到一個(gè)目錄。在NTFS中,這允許額外的文件系統(tǒng)不逐一占用驅(qū)動(dòng)器號(hào)(如C:、D:)并掛載。
如果一個(gè)卷被掛在到另一個(gè)卷的現(xiàn)有目錄上,該目錄以前列出的內(nèi)容將被隱藏,已掛載卷的根目錄將取代它。已掛載卷仍然有自己?jiǎn)为?dú)分配的驅(qū)動(dòng)器號(hào)。文件系統(tǒng)不允許卷被手動(dòng)互相掛載。卷掛載點(diǎn)可以持久或非持久存在,兩者區(qū)別是系統(tǒng)重啟后是否會(huì)自動(dòng)重新掛載。
已掛載卷可能使用非NTFS的文件系統(tǒng),并可能有自己的安全設(shè)置和根據(jù)遠(yuǎn)程文件系統(tǒng)策略重新映射的訪問(wèn)權(quán)限。2
目錄交接點(diǎn)目錄交接點(diǎn)類似卷掛載點(diǎn),但引用目標(biāo)為文件系統(tǒng)中的其他目錄而非其他卷。舉例來(lái)說(shuō),目錄C:\exampledir有一個(gè)目錄junction屬性,其包含到D:\linkeddir的鏈接,因此當(dāng)它被用戶模式的應(yīng)用程序訪問(wèn)時(shí),將會(huì)自動(dòng)引用D:\linkeddir目錄。此功能在概念上類似Unix中對(duì)目錄的符號(hào)鏈接,除了NTFS中的目標(biāo)必須始終是另一個(gè)目錄(典型的Unix文件系統(tǒng)允許符號(hào)鏈接的目標(biāo)是任何類型的文件)。
目錄交接點(diǎn)(可以在命令行提示符中使用MKLINK /J junctionName targetDirectory創(chuàng)建,以及用RMDIR junctionName移除)是持久的,并在服務(wù)器側(cè)解析,它們與本地文件系統(tǒng)或掛載內(nèi)容所在的父卷共享相同的安全領(lǐng)域;不過(guò)目錄交接點(diǎn)本身可能有不同的安全設(shè)置。取消一個(gè)目錄交接點(diǎn)鏈接不會(huì)刪除目標(biāo)目錄中的文件。
某些目錄交接點(diǎn)在Windows Vista上已默認(rèn)安裝,目的是保證對(duì)以前Windows版本的兼容性,例如系統(tǒng)分區(qū)根目錄中的Documents and Settings就是鏈接到同個(gè)卷根目錄中的的Users物理目錄。不過(guò)它在默認(rèn)情況下是隱藏的,并且設(shè)定了安全設(shè)置以要求Windows文件資源管理器拒絕在外殼和大多數(shù)應(yīng)用程序中打開它,除了本地內(nèi)置的SYSTEM用戶或本地管理員組(這兩個(gè)用戶帳戶用于在系統(tǒng)中安裝軟件)。這個(gè)額外的安全性限制是為了避免用戶誤入此目錄和看到、誤以為并刪除明顯重復(fù)的文件。目錄交接點(diǎn)的語(yǔ)義不同于硬鏈接,對(duì)目標(biāo)內(nèi)容和引用容器本身都不存在引用計(jì)數(shù)。
目錄交接點(diǎn)是一種軟鏈接(它們可以持久存在,哪怕目標(biāo)目錄被刪除),可以作為一種有限的符號(hào)鏈接使用(對(duì)目標(biāo)位置有所約束),但它是一個(gè)優(yōu)化的版本,重解析點(diǎn)的設(shè)計(jì)允許更快地處理它,比NTFS符號(hào)鏈接具有更小的系統(tǒng)開銷,并且可以在服務(wù)器側(cè)解析(當(dāng)發(fā)現(xiàn)于遠(yuǎn)程共享目錄時(shí))。2
符號(hào)鏈接符號(hào)鏈接(或軟鏈接)在Windows Vista中被引入。符號(hào)鏈接在客戶端側(cè)解析。因此當(dāng)符號(hào)鏈接被共享時(shí),目標(biāo)受到客戶端而非服務(wù)器的訪問(wèn)限制。
符號(hào)鏈接的創(chuàng)建可以指向文件(用MKLINK 符號(hào)鏈接 目標(biāo)文件創(chuàng)建)或目錄(用MKLINK /D 符號(hào)鏈接 目標(biāo)目錄創(chuàng)建),但不同于Unix符號(hào)鏈接,創(chuàng)建鏈接時(shí)必須提供鏈接的類型。符號(hào)鏈接創(chuàng)建時(shí)不需要目標(biāo)存在或可用:在符號(hào)鏈接可用時(shí)才會(huì)檢查可用性,NTFS也會(huì)在那時(shí)檢查類型(文件/目錄)是否正確;如果現(xiàn)有目標(biāo)的類型錯(cuò)誤,將會(huì)返回“找不到”錯(cuò)誤。
它們還可引用遠(yuǎn)程主機(jī)上的共享目錄或文件,以及共享項(xiàng)目錄中的子目錄:它們的目標(biāo)不會(huì)立即掛載,只在使用 OpenFile()或CreateFile() API時(shí)臨時(shí)請(qǐng)求。2
分布式鏈接跟蹤(DLT)分布式鏈接跟蹤允許應(yīng)用程序跟蹤文件、快捷方式和OLE鏈接,即使它已被重命名或移動(dòng)到同個(gè)機(jī)器、域或工作組中的另一個(gè)分卷。跟蹤實(shí)現(xiàn)為一個(gè)系統(tǒng)服務(wù),使用對(duì)象標(biāo)識(shí)符(OID)的索引存儲(chǔ)在一個(gè)元文件中。當(dāng)應(yīng)用程序請(qǐng)求跟蹤一個(gè)文件或目錄時(shí),跟蹤服務(wù)創(chuàng)建指向該文件的OID記錄。在文件被重命名、復(fù)制或移動(dòng)到一個(gè)NTFS v3分卷時(shí),對(duì)象ID也將被復(fù)制。因此跟蹤服務(wù)最終能找到目標(biāo)文件。2
單實(shí)例存儲(chǔ)(SIS)當(dāng)多個(gè)目錄有不同但類似的文件時(shí),這些文件可能有著相同的內(nèi)容。單實(shí)例存儲(chǔ)允許相同的文件被合并為一個(gè)文件,并創(chuàng)建一個(gè)到合并后文件的引用。SIS包括:一個(gè)文件系統(tǒng)篩選器,它管理復(fù)制、修改和合并文件;一個(gè)用戶空間服務(wù)(或稱groveler),它搜索相同并需要合并的文件。SIS的主要設(shè)計(jì)目的是遠(yuǎn)程安裝的服務(wù)器,其存在的多個(gè)安裝鏡像可能包含許多相同的文件,SISK可以合并這些。不同于硬鏈接,每個(gè)文件仍然是不同的;對(duì)一個(gè)副本的更改不會(huì)改變其他的副本。這類似于寫時(shí)復(fù)制,但那個(gè)技術(shù)是內(nèi)存復(fù)制并未真正完成,直至副本被修改。2
分層存儲(chǔ)管理(HSM)分層存儲(chǔ)管理是一種轉(zhuǎn)移文件的手段,它根據(jù)文件熱度將數(shù)據(jù)在普通與昂貴的存儲(chǔ)介質(zhì)間轉(zhuǎn)移。在下次訪問(wèn)該文件時(shí),該文件的重解析點(diǎn)會(huì)確定所需的存儲(chǔ)介質(zhì)并從那里檢索。2
原生結(jié)構(gòu)化存儲(chǔ)(NSS)NSS原是ActiveX文檔存儲(chǔ)技術(shù),它已被微軟停止使用。它允許ActiveX文檔存儲(chǔ)在ActiveX內(nèi)部使用的多流格式中。NSS文件系統(tǒng)篩選器可以被加載并處理透明傳輸?shù)綉?yīng)用該程序的多個(gè)流,并在文件被傳輸?shù)椒荖TFS格式的磁盤卷時(shí)將多個(gè)流變?yōu)閱蝹€(gè)流。2
編程解析重解析點(diǎn)tag是個(gè)DWORD,為獲取它,使用FindFirstFile函數(shù),如果輸出參數(shù)的dwFileAttributes結(jié)構(gòu)域包含了FILE_ATTRIBUTE_REPARSE_POINT 屬性,那么dwReserved0結(jié)構(gòu)域就是重解析點(diǎn)的tag值。
為判斷文件系統(tǒng)是否支持重解析點(diǎn),調(diào)用GetVolumeInformation函數(shù)檢查FILE_SUPPORTS_REPARSE_POINTS比特標(biāo)志。
DeviceIoControl函數(shù)可以設(shè)置、修改、獲取、刪除重解析點(diǎn)。
GetFileAttributes函數(shù)可判斷一個(gè)文件或目錄是否包含重解析點(diǎn)。
CreateFile函數(shù)帶著FILE_FLAG_OPEN_REPARSE_POINT,可以打開一個(gè)重解析點(diǎn)文件。2
本詞條內(nèi)容貢獻(xiàn)者為:
李嘉騫 - 博士 - 同濟(jì)大學(xué)