符號連結
NTFS 符號連結 又稱“符號連結”,是 NTFS 檔案系統中指向檔案系統中的另一個對象的一類對象,被指向的對象叫做“目標”。
NTFS 符號連結在 Windows 資源管理器中顯示為正常的檔案或目錄,並且用戶可以以管理普通檔案或資料夾一樣的方法去管理操作 NTFS 符號連結。
NTFS 符號連結的目錄或卷被稱為“連線點”和“掛載點”,這個概念是從 Windows 2000 時代的 NTFS 3.0 開始引入的。從 NTFS 3.1 開始,可以為任何類型的檔案系統對象創建 NTFS 符號連結。
但是與 NTFS 3.1 一起發布的 Windows XP 並沒有通過 ntfs.sys 系統驅動對用戶模式應用程式提供支持。但是可以安裝第三方篩選器驅動程式(比如 Masatoshi Kimura 的開源驅動程式 senable)來使 Windows XP 支持 NTFS 符號連結。直到 Windows Vista 發布,微軟才通過 ntfs.sys 在默認情況下對用戶模式應用程式進行支持。
NTFS 符號連結對檔案的連結和對目錄的連結是不同的。
與 NTFS 連線點不同,NTFS 符號連結不僅可以連結檔案,還可以連結 SMB網路中的路徑。NTFS 連線點只支持本地驅動器上的絕對路徑,而 NTFS 符號連結則既可以使用絕對路徑,也可以使用相對路徑。此外,NTFS 符號連結還對跨檔案系統的連結提供了全力支持。然而,跨主機的符號連結功能要求本地主機和遠程主機同時支持 NTFS 符號連結。
NTFS 符號連結與 Windows 捷徑檔案不同,這是一個普通的檔案。
Windows 捷徑檔案可以在任何檔案系統(比如早期的 FAT32)下創建,可以包含元數據(比如在 Windows 資源管理器中顯示的圖示),並且不是對應用程式透明的。當應用程式訪問 Windows 捷徑的時候,默認情況下訪問到的是捷徑檔案,而不會自動指向目標檔案。
NTFS 符號連結是對用戶透明的,也就是說,在絕大多數情況下,訪問 NTFS 符號連結與訪問目標是完全相同的。當應用程式訪問 NTFS 符號連結的時候,作業系統會自動將其指向目標,此時應用程式訪問到的就是目標而不是 NTFS 符號連結了。
許可權限制
在 Windows Vista / Windows 7 下,系統默認的安全限制禁止非管理員許可權的程式創建符號連結。
可以在本地組策略中進行設定,位置是“本地計算機 策略” -》 “計算機配置” -》 “Windows 設定” -》 “安全設定” -》 “本地策略” -》 “用戶許可權分配” -》 “創建符號連結”。
使用方法
命令格式
mklink [ [/D] | [/H] | [/J] ] Link Target
參數
參數 | 可選/必須 | 說明 |
/D | 可選 | 創建目錄符號連結而不是檔案符號連結(默認為檔案符號連結) |
/H | 可選 | 創建硬連結而不是符號連結 |
/J | 可選 | 創建目錄連線點 |
Link | 必須 | 指定新的符號連結名稱 |
Target | 必須 | 指定新符號連結引用的路徑(絕對路徑或相對路徑均可) |
注意:參數 Link 和 Target 要求不能使用 Windows 中不允許用作檔案名稱的字元(\ / : * ? " < > |)。並且如果 Link 和 Target 這兩個參數中需要包含空格,則必須使用英文雙引號將內容引起來,以避免參數識別錯誤。
限制
符號連結在系統啟動的時候是不工作的,所以下面這些檔案(夾)是不可以作為符號連結替換的:
•\Windows
•\Windows\system32
•\Windows\system32\config
Windows Install 並不完全支持符號連結,所以,如果將 \Windows\Installer 使用符號連結替換將會導致大多數基於 .msi 的 Windows Install 安裝程式出錯失敗,錯誤碼為 2755 或 1632。
以下檔案(夾)可以被符號連結替換:
•\Documents and Settings
•\ProgramData
•\Program Files
•\Program Files (x86)
•\Users
但是注意:
將 \Users 和 \ProgramData 使用符號連結替換是不推薦的,這會破壞 Windows Update 自動更新和 Windows Store 中的套用。
將 \Users、\ProgramData、"\Program Files" 或 "\Program Files (x86)" 使用符號連結替換將會破壞 Windows 的安裝、部署和升級。
將 "\Program Files" 或 "\Program Files (x86)" 使用符號連結替換將會破壞那些從 \Windows\WinSxS 倉庫中硬性連結了檔案到安裝目錄中的基於 Windows 組件的服務。
1.將 \Users 和 \ProgramData 使用符號連結替換是不推薦的,這會破壞 Windows Update 自動更新和 Windows Store 中的套用。
2.將 \Users、\ProgramData、"\Program Files" 或 "\Program Files (x86)" 使用符號連結替換將會破壞 Windows 的安裝、部署和升級。
3.將 "\Program Files" 或 "\Program Files (x86)" 使用符號連結替換將會破壞那些從 \Windows\WinSxS 倉庫中硬性連結了檔案到安裝目錄中的基於 Windows 組件的服務。
目錄符號連結與目錄連線點的區別
目錄符號連結(/D)與目錄連線點(/J)非常相似,但是本質是不同的。目錄符號連結依舊是符號連結,是指向目錄的符號連結,而目錄連線點不屬於符號連結。
目錄符號連結允許 Target 使用相對路徑,當使用相對路徑時創建目錄符號連結之後,如果移動了符號連結檔案,作業系統將無法再找到原來的目標。
目錄連線點只允許 Target 使用絕對路徑,當創建目錄連線點時,如果傳入的參數是相對路徑,mklink 命令會自動將相對路徑補全為絕對路徑。
當目錄符號連結使用絕對路徑時,其行為與目錄連線點完全一樣。
此外,目錄符號連結還可以指定 SMB 遠程網路中的路徑,而目錄連線點不可以。
注意事項
使用 mklink 創建符號連結的時候,作業系統並不會檢查目標是否存在。所以可以創建指向不存在的目標的符號連結。
注意儘可能不要使用符號連結嵌套。也就是在一個資料夾 A 中創建一個符號連結指向 A 自己。這會產生一個無限循環遞歸的檔案系統(Windows 下限制了路徑長度最大為 128 個位元組),會使大部分套用程在遍歷資料夾目錄的時候產生循環錯誤(因為對應用程式來說,資料夾的符號連結與普通的資料夾是完全一樣的)。
1.使用 mklink 創建符號連結的時候,作業系統並不會檢查目標是否存在。所以可以創建指向不存在的目標的符號連結。
2.注意儘可能不要使用符號連結嵌套。也就是在一個資料夾 A 中創建一個符號連結指向 A 自己。這會產生一個無限循環遞歸的檔案系統(Windows 下限制了路徑長度最大為 128 個位元組),會使大部分套用程在遍歷資料夾目錄的時候產生循環錯誤(因為對應用程式來說,資料夾的符號連結與普通的資料夾是完全一樣的)。