符號連結就像 windows 下的捷徑一樣,符號連結本身是獨立的檔案,裡面包含目標的「路徑」,可以是相對路徑或絕對路徑。
要了解硬連結,首先要知道一個目錄僅是一個 List,裡面只是包含檔名和檔案的 inode 位置,並不實際包含檔案的資料。
而硬連結只是在該目錄的 List 中增加一個項目,此項目的 inode 跟原來的檔案相同。因此無論從任何角度看,都跟原來的檔案沒有差別,資料相同、權限相同,只是多一個路徑可以存取他罷了。
其實這樣看就已經大概知道符號連結與硬連結的種種性質了。
因為符號連結是指向目標的路徑,假如我把符號連結的來源檔案搬到別的路徑,那那個符號連結就等於爛掉了。如果是硬連結,不管我把來源檔案搬到別的路徑、別的磁碟,甚至刪掉,硬連結都還保有原來檔案的資料、權限(只要還有任何一個 directory entry 指向某 inode ,此 inode 就不會被刪除,資料也會繼續保存。所以硬連結也滿適合用來防止重要檔案被誤砍) 。
所以在同一個 file system 下作
- 代碼: 選擇全部
ln /foo/bar/file1 /bar/foo/file2
rm /foot/bar/file1
跟
- 代碼: 選擇全部
mv /foo/bar/file1 /bar/foo/file2
的結果是相同的。
硬連結是建立一個有相同 inode address 的 directory entry,所以必須要與來源檔案在同一個 file system。符號連結則沒此限制,你只要能表示出來源檔案的路徑,就能建立符號連結,甚至該路徑不存在都沒關係(不過建立目標不存在的符號連結也沒啥意義)。
另外,硬連結不能指向目錄,符號連結可以。這部份小弟就不太明白了,要讓硬連結能指向目錄應該也是做得出來才對。
其實小弟沒專業背景,上面是隨便看看一些資料得來的答案,有錯請包容並糾正。