0、一句話總結(jié)
硬鏈接是“硬”的,因為它直接指向了inode。
軟鏈接是“軟”的,因為它是通過其他文件才指向了inode(就像是雙節(jié)棍或多節(jié)棍,比較靈活,所以是軟的)。
1、什么是軟鏈接和硬鏈接?
軟硬鏈接均可以理解成“無需copy文件,創(chuàng)建一個文件的別名”。示意圖如下:

硬鏈接一旦創(chuàng)建后就無法區(qū)分哪個是“源文件”,也就是說指向同一個inode的所有硬鏈接都是等價的。對應(yīng)到上圖中,“硬鏈接A1”和“硬鏈接A2”是等價的,沒有主次之分。
2、怎樣創(chuàng)建軟硬鏈接?
使用ln命令創(chuàng)建:
ln [-s] old_path new_path
不帶-s表示創(chuàng)建硬鏈接,帶上-s表示創(chuàng)建軟鏈接。這里的s其實是symbolic(符號)的意思,不過記成soft也沒啥影響。
有時可能容易混淆old_path和new_path的順序,可以通過下面這句話幫助記憶:
軟硬鏈接不能“無中生有”,所以要先指定現(xiàn)有文件,再指定需要新建的鏈接。
3、硬鏈接與軟鏈接有什么區(qū)別?
| 鏈接類型 | 能否對目錄創(chuàng)建該鏈接 | 能否跨文件系統(tǒng)創(chuàng)建該鏈接 | |
|---|---|---|---|
| 硬鏈接 | 不能 | 不能 | 不能 |
| 軟鏈接 | 能 | 能 | 能 |
注:Linux的文檔明確說明不能跨掛載點創(chuàng)建硬鏈接(
new_path和old_path必須在同一個掛載點上),即比“不能跨文件系統(tǒng)創(chuàng)建”的限制更加嚴格。
在Mac上實際測試,可以跨掛載點創(chuàng)建硬鏈接(兩個掛載點文件系統(tǒng)相同)。
4、軟硬鏈接有什么用途?
快捷方式
因為硬鏈接有上述兩條限制,所以一般用軟鏈接實現(xiàn)快捷方式。
控制動態(tài)庫的實際版本
例如系統(tǒng)的libc.so.6通常只是一個軟鏈接,鏈接到實際使用的libc.so.6的具體版本(一般位于同目錄下)。這樣不僅能方便地看出當前使用的libc.so.6的實際版本,還大大簡化了libc.so.6的升級工作。
防止文件被錯誤刪除
只有當指向一個文件的所有硬鏈接都被刪除后,系統(tǒng)才會真正刪除文件。所以通過創(chuàng)建硬鏈接可以避免文件被錯誤刪除(不能防止文件被修改?。?。
5、系統(tǒng)調(diào)用原型
硬鏈接是link,軟鏈接是symlink(即符號鏈接)。
6、軟硬鏈接文件權(quán)限和歸屬問題
硬鏈接:
具有相同inode的所有硬鏈接始終具有相同的權(quán)限和歸屬,即改變其中一個硬鏈接的權(quán)限和歸屬,其他硬鏈接的權(quán)限和歸屬也會變化。
軟鏈接:
文檔說“軟鏈接的權(quán)限是無關(guān)緊要的”,在Linux系統(tǒng)上實際測試,chmod命令操作的是軟鏈接對應(yīng)的目標文件(chmod的文檔也有說明),軟鏈接始終具有讀、寫、執(zhí)行的所有權(quán)限。
因為軟鏈接始終具有讀、寫、執(zhí)行的所有權(quán)限,所以基本不需要關(guān)心其歸屬問題。
總結(jié):軟鏈接的權(quán)限和歸屬問題基本可以忽略,只需要關(guān)心其目標文件的權(quán)限和歸屬即可。
7、多層軟鏈接會怎樣?
沒有影響,還是能正常工作。測試命令如下:
echo "abc" > test.txt
ln -s test.txt test_1
ln -s test_1 test_2
ln -s test_2 test_3
cat test_3
輸出為"abc"
8、軟鏈接的目標文件刪除后再重新創(chuàng)建會怎樣?
會鏈接到新創(chuàng)建的文件。
9、循環(huán)軟鏈接會怎樣?
能夠創(chuàng)建循環(huán)軟鏈接(即系統(tǒng)沒有檢測),但是讀取文件時會報錯。測試命令如下:
touch abc1
ln -s abc1 abc2
rm abc1
-s abc2 abc1
cat abc1
輸出是
cat: abc1: Too many levels of symbolic links