NTFS重解析点

**NTFS 重解析點**（英語：**NTFS reparse point**），微軟官方也譯作重新分析點、重新剖析點、重新分析指標，是 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）

分層儲存管理是一種轉移檔案的手段，它根據檔案熱度將資料在普通與昂貴的儲存媒介間轉移。在下次存取該檔案時，該檔案的重解析點會確定所需的儲存媒介並從那裡檢索。

### 原生結構化儲存（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 Clusters（頁面存檔備份，存於網際網路檔案館）
* Reparse Points（頁面存檔備份，存於網際網路檔案館） in the Microsoft Developer Network (MSDN) Library