1. 程式人生 > >軟連結和硬連結

軟連結和硬連結

1. 是什麼

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

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

    硬連結的刪除:

    硬連結在刪除的時候只是刪除了一個名字,只有一塊資料的所有名字都刪除了的時候,資料才會被刪除。(刪除的時候相當於把牆的這一面糊上,但蘋果本身不動,只有兩面都糊上了,你才會看不到)

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

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

    軟連結的刪除:

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

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

2. 怎麼檢視

通過ls -l檢視,->後面就是原始地址

$ ls -l
total 6964
lrwxrwxrwx 1 wangdanna wangdanna      48 1014 16:07 1.jpg -> /home/wangdanna/Downloads/picture/wallpaper1.jpg
-rw-rw-r-- 2 wangdanna wangdanna    3858
109 02:13 7.jpg -rw-rw-r-- 1 wangdanna wangdanna 14009 109 01:51 love.jpg -rw-rw-r-- 1 wangdanna wangdanna 66420 109 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 1011 14:03 github_api.png
-rw-rw-r-- 1 wangdanna wangdanna 413749 1012 21:40 html5播放器.png
drwxrwxr-x 2 wangdanna wangdanna   4096 109 17:29 Wallpapers/
  • 建立軟連結
 $ ln -s old.file soft.link 
// 可對不存在的檔案建立軟連結
 $ ls -l 
total 504
-rw-rw-r-- 1 wangdanna wangdanna  91327 1011 14:03 github_api.png
-rw-rw-r-- 1 wangdanna wangdanna 413749 1012 21:40 html5播放器.png
lrwxrwxrwx 1 wangdanna wangdanna      8 1014 16:28 soft.link -> old.file
drwxrwxr-x 2 wangdanna wangdanna   4096 109 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,若被指向路徑檔案被重新建立,死連結可恢復為正常的軟連結