NTFS重解析點

NTFS重解析點（NTFS reparse point），微軟官方也譯作-{zh-cn:重分析點、重新解析點、重新分析點;zh-tw:重新分析點、重新剖析點、重新分析指標}-，是NTFS文件系統中的一種對象類型。它在Windows 2000及之後版本中的NTFS v3.0及以上版本中可用。重解析點提供一種擴展NTFS文件系統的方法。一個重解析點包含一個重解析標籤和數據，文件系統過濾器（file system filter）可以按標籤解讀它。微軟提供了幾個默認標籤，包括NTFS符號鏈接、NTFS目錄交接點和NTFS卷掛載點。另外，在Windows 2000的分層存儲系統中，重解析點被用作已移動文件的佔位符。此外，它也可以被用作硬鏈接，並且不僅限於指向同分卷中的文件，還可以指向任何本地分卷中的目錄。

**設計**
一般情況：- 硬鏈接：鏈接到一個文件（MFT記錄）。只要存在至少一個指向它的鏈接，數據會保持可用。- 軟鏈接：鏈接到文件名（文件路徑）。

**軟鏈接**
Windows Vista支持新的符號鏈接能力。它取代了Windows 2000和Windows XP中的目錄交接點。它的設計目的是幫助遷移和提升與UNIX操作系統的應用程序的兼容性。不同於目錄交接點，符號鏈接也可以指向一個文件或遠程SMB網絡路徑。此外，NTFS符號鏈接提供了跨文件系統的鏈接支持。但是，啟用跨主機的符號鏈接功能需要遠程系統也支持它，這使支持限制在Windows Vista及更高版本的Windows操作系統。- NTFS符號鏈接(SYMLINK)：本地或遠程，相對或絕對SMB文件或路徑。Windows Server 2008使用軟連接重定向 \Users\All Users\ -> \ProgramData\。符號鏈接可以指向不存在的目標，因為操作系統不會檢查目標是否存在。使用 mklink 或 mklink /D 時，相對符號鏈接僅限於單個卷。- 目錄交接點，也稱軟鏈接：可用於同一臺計算機的同一個卷或不同卷的目錄的鏈接。不能用於對文件的連接。底層用重解析點實現。使用 mklink /J 創建 junction 點後，使用Windows資源管理器刪除它時，如果使用了Shift+Delete，將立即刪除目標文件 (Windows 2000/XP/2003)。 del my_junction 命令不應該使用，因為它會刪除目標目錄中的所有文件。在Windows Vista及更高版本中，使用junction刪除目錄交接點是安全的。- 卷裝載點（Volume Mount Points）：卷裝載點和前2者類似，只是更進一層：它能創建對整個卷的鏈接。- 遠程存儲服務器（Microsoft Remote Storage Server）：Windows 2000的這個特性能利用一些規則來移除NTFS捲上不常用的文件，放到存檔介質裡（比如CD-RW或磁帶）。當它把文件移出到“線下”或“半線下”的存儲介質上時，RSS會自動創建指向這個存檔文件的重解析點，以備日後使用。

**硬鏈接**
NTFS 硬鏈接：從Windows NT 4開始：多個路徑指向同一驅動器上的文件。從Windows 2000開始，Windows API包括一個 CreateHardLink() 函數來創建硬鏈接，並且可用 DeleteFile() 移除。所有Windows NT版本都可以使用 GetFileInformationByHandle() 來確定一個文件已關聯的硬鏈接數量。硬鏈接需要NTFS分區。運行在Windows上的類Unix仿真或軟件兼容層（如Cygwin和基於UNIX應用程序的子系統）允許在Windows上使用POSIX接口。大多數現代操作系統不允許硬鏈接目錄，以避免無限遞歸目錄；而且，硬鏈接目錄可能導致父目錄的條目不一致；通常使用符號鏈接和NTFS目錄交接點達到此目的。硬鏈接只能對同一文件系統上的文件創建。如果需要創建到另一文件系統的鏈接，應該使用符號鏈接。硬鏈接可以使用 mklink /H 命令創建。
硬鏈接使用與原文件相同的MFT記錄。添加一個硬鏈接會創建一個新的文件名屬性並增加硬鏈接計數器（每個新創建的文件+1）。刪除一個硬鏈接會移除相應的文件名並將硬鏈接計數器-1。當計數器歸零時，文件系統將刪除該文件、釋放其佔用的磁盤空間及其MFT記錄。所有名稱屬性是獨立的，因此刪除、移動或重命名文件不會影響其他硬鏈接。

**特性**

**卷掛載點**
NTFS卷掛載點類似Unix掛載點，將另一個文件系統的根附加到一個目錄。在NTFS中，這允許額外的文件系統不逐一佔用驅動器號（如 C:、D:）並掛載。
如果一個卷被掛在到另一個卷的現有目錄上，該目錄以前列出的內容將被隱藏，已掛載卷的根目錄將取代它。已掛載卷仍然有自己單獨分配的驅動器號。文件系統不允許卷被手動互相掛載。卷掛載點可以持久或非持久存在，兩者區別是系統重啟後是否會自動重新掛載。
已掛載卷可能使用非NTFS的文件系統，並可能有自己的安全設置和根據遠程文件系統策略重新映射的訪問權限。

**目錄交接點**
類似卷掛載點，但引用目標為文件系統中的其他目錄而非其他卷。舉例來說，目錄 C:\exampledir 有一個目錄junction屬性，其包含到 D:\linkeddir 的鏈接，因此當它被用戶模式的應用程序訪問時，將會自動引用 D:\linkeddir 目錄。此功能在概念上類似Unix中對目錄的符號鏈接，除了NTFS中的目標必須始終是另一個目錄（典型的Unix文件系統允許符號鏈接的目標是任何類型的文件）。
目錄交接點（可以在命令行提示符中使用 MKLINK /J junctionName targetDirectory 創建，以及用 RMDIR junctionName 移除）是持久的，並在服務器側解析，它們與本地文件系統或掛載內容所在的父卷共享相同的安全領域；不過目錄交接點本身可能有不同的安全設置。取消一個目錄交接點鏈接不會刪除目標目錄中的文件。
某些目錄交接點在Windows Vista上已默認安裝，目的是保證對以前Windows版本的兼容性，例如系統分區根目錄中的Documents and Settings就是鏈接到同個卷根目錄中的的Users物理目錄。不過它在默認情況下是隱藏的，並且設定了安全設置以要求Windows文件資源管理器拒絕在外殼和大多數應用程序中打開它，除了本地內置的SYSTEM用戶或本地管理員組（這兩個用戶帳戶用於在系統中安裝軟件）。這個額外的安全性限制是為了避免用戶誤入此目錄和看到、誤以為並刪除明顯重複的文件。目錄交接點的語義不同於硬鏈接，對目標內容和引用容器本身都不存在引用計數。
目錄交接點是一種軟鏈接（它們可以持久存在，哪怕目標目錄被刪除），可以作為一種有限的符號鏈接使用（對目標位置有所約束），但它是一個優化的版本，重解析點的設計允許更快地處理它，比NTFS符號鏈接具有更小的系統開銷，並且可以在服務器側解析（當發現於遠程共享目錄時）。

**符號鏈接**
符號鏈接（或軟鏈接）在Windows Vista中被引入。符號鏈接在客戶端側解析。因此當符號鏈接被共享時，目標受到客戶端而非服務器的訪問限制。
符號鏈接的創建可以指向文件（用 MKLINK 符號鏈接 目標文件 創建）或目錄（用 MKLINK /D 符號鏈接 目標目錄 創建），但不同於Unix符號鏈接，創建鏈接時必須提供鏈接的類型。符號鏈接創建時不需要目標存在或可用：在符號鏈接可用時才會檢查可用性，NTFS也會在那時檢查類型（文件/目錄）是否正確；如果現有目標的類型錯誤，將會返回“找不到”錯誤。
它們還可引用遠程主機上的共享目錄或文件，以及共享項目錄中的子目錄：它們的目標不會立即掛載，只在使用 OpenFile() 或 CreateFile() API時臨時請求。

**分佈式鏈接跟蹤（DLT）**
分佈式鏈接跟蹤允許應用程序跟蹤文件、快捷方式和OLE鏈接，即使它已被重命名或移動到同個機器、域或工作組中的另一個分卷。跟蹤實現為一個系統服務，使用對象標識符（OID）的索引存儲在一個元文件中。當應用程序請求跟蹤一個文件或目錄時，跟蹤服務創建指向該文件的OID記錄。在文件被重命名、複製或移動到一個NTFS v3分卷時，對象ID也將被複制。因此跟蹤服務最終能找到目標文件。

**單實例存儲（SIS）**
當多個目錄有不同但類似的文件時，這些文件可能有著相同的內容。單實例存儲允許相同的文件被合併為一個文件，並創建一個到合併後文件的引用。SIS包括：一個文件系統篩選器，它管理複製、修改和合並文件；一個用戶空間服務（或稱groveler），它搜索相同並需要合併的文件。SIS的主要設計目的是遠程安裝的服務器，其存在的多個安裝鏡像可能包含許多相同的文件，SISK可以合併這些。不同於硬鏈接，每個文件仍然是不同的；對一個副本的更改不會改變其他的副本。這類似於寫時複製，但那個技術是內存複製並未真正完成，直至副本被修改。

**分層存儲管理（HSM）**
是一種轉移文件的手段，它根據文件熱度將數據在普通與昂貴的存儲介質間轉移。在下次訪問該文件時，該文件的重解析點會確定所需的存儲介質並從那裡檢索。citation needed

**原生結構化存儲（NSS）**
NSS原是ActiveX文檔存儲技術，它已被微軟停止使用。它允許ActiveX文檔存儲在ActiveX內部使用的多流格式中。NSS文件系統篩選器可以被加載並處理透明傳輸到應用該程序的多個流，並在文件被傳輸到非NTFS格式的磁盤卷時將多個流變為單個流。

**Windows Vista（及其後）的默認文件夾位置變化**
與Windows XP（Windows NT 5.x）相比，在Windows 7、Windows 10等操作系統（Windows NT 6.x/Windows NT 10.x）中，存放用戶數據（user data）和系統數據（system data）的默認文件夾位置發生變化。例如，在Windows XP中存放用戶數據的文件為%SystemDrive%\Documents and Settings；在Windows 7中則為%SystemDriver%\User。這樣的變化無疑對以前應用程序能否在Windows 7下順利運行帶來兼容性問題。為了最大程度地保證對以前在Windows XP運行的程序的兼容性，在Windows 7中採用了junction points（連接點）技術。通過這個技術，原來在Windows XP下運行的程序對%SystemDrive%\Documents and Settings文件夾下的數據存取操作，能自動地更改到%SystemDriver%\User文件夾。

**編程解析**
重解析點tag是個DWORD，為獲取它，使用FindFirstFile函數，如果輸出參數的dwFileAttributes結構域包含了FILE_ATTRIBUTE_REPARSE_POINT 屬性，那麼dwReserved0結構域就是重解析點的tag值。
為判斷文件系統是否支持重解析點，調用GetVolumeInformation函數檢查FILE_SUPPORTS_REPARSE_POINTS比特標誌。
DeviceIoControl函數可以設置、修改、獲取、刪除重解析點。
GetFileAttributes函數可判斷一個文件或目錄是否包含重解析點。
CreateFile函數帶著FILE_FLAG_OPEN_REPARSE_POINT，可以打開一個重解析點文件。

**參見**
 NTFS符號鏈接- NTFS junction點- NTFS卷掛載點- 符號鏈接

**參考資料**

**外部鏈接**
  Reparse Point Support in Windows 2000-Based Clustersdate=20140222100614 -  Reparse Pointsdate=20160309181025  in the Microsoft Developer Network (MSDN) Library