軟鏈接與硬鏈接

1. 是什么

  • 鏈接:一種在共享文件和訪問它的用戶的若干目錄項之間建立聯系的一種方法。
  • 【硬鏈接】(hard link):指通過索引節點來進行連接,就是一個文件(不是文件夾)的別名,無論有多少各別名,但它其實是一個文件。
    可以這樣理解:

一面墻上有一個洞,洞里放著一個蘋果。從墻的這一面看是這個蘋果,從墻的另一面看還是同一個蘋果
也就是說同一塊數據但有兩個不同的名字,讀寫的時候本質上都是修改的同一塊數據。

硬鏈接的刪除:

硬鏈接在刪除的時候只是刪除了一個名字,只有一塊數據的所有名字都刪除了的時候,數據才會被刪除。(刪除的時候相當于把墻的這一面糊上,但蘋果本身不動,只有兩面都糊上了,你才會看不到)

  • 【軟鏈接】(又稱符號鏈接,即 soft link 或 symbolic link):相當于我們 Windows 中的快捷方式,即如果你軟鏈接一個目錄,只是一個目錄的快捷方式到指定位置,操作系統找這個快捷方式會直接找到真實目錄下的文件。
    可以這樣理解:

我聲稱我有一個蘋果,但是當你找我要的時候,我對你說,到某個建筑物的倉庫就可以拿到那個蘋果了。可見我并不真正擁有一個蘋果,我只是擁有“某個地方有一個蘋果”這個信息。但對于外部的觀察者來說,這跟我實際上擁有一個蘋果并無差異。

軟鏈接的刪除:

假設我死了,不會影響到原始數據。假設原始數據沒了,那我這個符號鏈接就變成了一張空頭支票,也就是懸空的符號鏈接。

一個符號鏈接可以指向一個不存在的目標,而硬鏈接就表示肯定有文件存在。
硬鏈接可以指向文件,也可以指向目錄。可以跨越任何文件系統。拷貝刪除原始文件或者鏈接文件,不會造成相互影響。

2. 怎么查看

通過ls -l查看,->后面就是原始地址

$ ls -l
total 6964
lrwxrwxrwx 1 wangdanna wangdanna      48 10月 14 16:07 1.jpg -> /home/wangdanna/Downloads/picture/wallpaper1.jpg
-rw-rw-r-- 2 wangdanna wangdanna    3858 10月  9 02:13 7.jpg
-rw-rw-r-- 1 wangdanna wangdanna   14009 10月  9 01:51 love.jpg
-rw-rw-r-- 1 wangdanna wangdanna   66420 10月  9 16:51 persepolis_6-t2.jpg

如上圖,前面帶有l的就是軟鏈接,不帶的則是硬鏈接,lrwxrwxrwx 1 wangdanna wangdanna 48 10月 14 16:07 1.jpg -> /home/wangdanna/Downloads/picture/wallpaper1.jpg->后面的是真實路徑

3. 優缺點

  • 優點
    硬連接的作用是允許一個文件擁有多個有效路徑名,這樣用戶就可以建立硬連接到重要文件,以防止“誤刪”的功能。

比如我將一個名為test.txt/home/XX/筆記硬鏈接到/home/XX/桌面,
編輯桌面的test.txt時 筆記下的test.txt已同步更新了
即使不小心把桌面上的test.txt刪了, /home/XX/筆記里的test.txt還在
你可能會說為什么不直接復制test.txt呢?
復制要占兩個大小啊,而且復制了,你編輯了一個,另一個它不同步啊

  • 缺點
    軟鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了
    硬鏈接就沒有這個缺陷,你想怎么移就怎么移

4. 怎么創建

  • 查看
$ ls -l
total 504
-rw-rw-r-- 1 wangdanna wangdanna  91327 10月 11 14:03 github_api.png
-rw-rw-r-- 1 wangdanna wangdanna 413749 10月 12 21:40 html5播放器.png
drwxrwxr-x 2 wangdanna wangdanna   4096 10月  9 17:29 Wallpapers/

  • 創建軟鏈接
 $ ln -s old.file soft.link 
// 可對不存在的文件創建軟鏈接
 $ ls -l 
total 504
-rw-rw-r-- 1 wangdanna wangdanna  91327 10月 11 14:03 github_api.png
-rw-rw-r-- 1 wangdanna wangdanna 413749 10月 12 21:40 html5播放器.png
lrwxrwxrwx 1 wangdanna wangdanna      8 10月 14 16:28 soft.link -> old.file
drwxrwxr-x 2 wangdanna wangdanna   4096 10月  9 17:29 Wallpapers/

$ cat soft.link 
# 由于被指向的文件不存在,此時的軟鏈接 soft.link 就是死鏈接
cat: soft.link: No such file or directory 

$  echo "This is an original file_A" >> old.file 
// 創建被指向的文件 old.file,soft.link 恢復成正常的軟鏈接

$ cat soft.link 
#可看到文件內容了
This is an original file_A

5. 加深理解

$ touch f1
#創建一個測試文件f1

ln f1 f2
#創建f1的一個硬連接文件f2

ln -s f1 f3
#創建f1的一個軟鏈接文件f3

$ ls -li
#-i參數顯示文件的inode節點信息
total 0
4083871 -rw-rw-r-- 2 wangdanna wangdanna 0 10月 14 16:37 f1
4083871 -rw-rw-r-- 2 wangdanna wangdanna 0 10月 14 16:37 f2
4083907 lrwxrwxrwx 1 wangdanna wangdanna 2 10月 14 16:37 f3 -> f1

從上面的結果中可以看出,硬連接文件 f2 與原文件 f1 的inode節點相同,均為4083871,然而軟連接文件的inode節點不同

$ echo "I am f1 file" >>f1
$ cat f1
I am f1 file
$ cat f2
I am f1 file
$ cat f3
I am f1 file

$ rm -f f1
$ cat f2
I am f1 file
$ cat f3
No such file or directory

通過上面的測試可以看出:當刪除原始文件 f1 后,硬連接 f2 不受影響,但是軟鏈接 f1 文件無效

得出結論
  • 刪除軟鏈接 f3 ,對 f1,f2 無影響;
  • 刪除硬鏈接 f2,對 f1,f3 也無影響;
  • 刪除原文件 f1,對硬鏈接 f2 沒有影響,導致符號鏈接 f3 失效;
  • 同時刪除原文件 f1,硬鏈接 f2,整個文件會真正的被刪除。

6. 特性總結

【硬鏈接】

  • 文件有相同的 inode 及 data block;
  • 只能對已存在的文件進行創建;
  • 不能交叉文件系統進行硬鏈接的創建;
  • 不能對目錄進行創建,只可對文件創建;
  • 刪除一個硬鏈接文件并不影響其他有相同 inode 號的文件。
    不能對目錄創建的原因: 硬連接的話,相當于鏡像的方式,你創建一個目錄的硬連接之后,操作系統需要把這* 個目錄下所有的文件都要做一次硬連接(復制一份過去),這樣操作系統在訪問這個鏈接的時候要不斷去遍歷,大大增加復雜度,而且很容易進入死循環。現在linux沒有很好支持這個 所以 不支持。詳情見這里這里

【軟鏈接】

  • 軟鏈接有自己的文件屬性及權限等;
  • 可對不存在的文件或目錄創建軟鏈接;
  • 軟鏈接可交叉文件系統;
  • 軟鏈接可對文件或目錄創建;
  • 創建軟鏈接時,鏈接計數 i_nlink 不會增加;
  • 刪除軟鏈接并不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱為死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復為正常的軟鏈接

參考鏈接https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容