軟鏈接與硬鏈接 詳細講解

1、鏈接作用

軟鏈接與硬鏈接是用來幹什麼的呢?

爲解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。鏈接爲 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處。

2、硬鏈接

2.1、硬鏈接特性說明

由於linux下的文件是通過索引節點(Inode)來識別文件硬鏈接可以認爲是一個指針,指向文件索引節點的指針,系統並不爲它重新分配inode。每添加一個一個硬鏈接,文件的鏈接數就加1。

硬連接之間沒有主次之分,刪除某個硬鏈接,只是將其從目錄的數據塊中刪除相關信息,並且文件鏈接數減一。不會從inode表中刪除inode,除非只剩下一個鏈接數。

下面舉例說明:

#創建文件夾hardlink
[root@localhost ~]# mkdir /hardlink
#在hardlink內創建文件aa.txt
[root@localhost hardlink]# touch aa.txt
#查看其鏈接數爲1
#注意,此處鏈接數就是硬鏈接的次數
[root@localhost hardlink]# ls -il
total 0
51190844 -rw-r--r--. 2 root root 0 Feb  2 13:04 aa.txt
#創建硬鏈接
[root@localhost hardlink]# ln aa.txt  aa.link
[root@localhost hardlink]# ls -il
total 0
51190844 -rw-r--r--. 2 root root 0 Feb  2 13:04 aa.link
51190844 -rw-r--r--. 2 root root 0 Feb  2 13:04 aa.txt
#往aa.txt文件中寫入一些內容
[root@localhost hardlink]# echo "123" >aa.txt
#發現aa.link中也同樣可以看到
[root@localhost hardlink]# cat aa.txt 
123
[root@localhost hardlink]# cat aa.link 
123
#刪除aa.txt
[root@localhost hardlink]# rm -f aa.txt 
#aa.link依然可以正常查看內容
[root@localhost hardlink]# cat aa.link 
123
#l鏈接數 -1,inode不變
[root@localhost hardlink]# ls -il
total 4
51190844 -rw-r--r--. 1 root root 4 Feb  2 14:00 aa.link

那這時候,就有個疑問了,如果鏈接數只剩下一個,再次刪除,會進行什麼樣的操作呢?
實際上,如果我們這時候再刪除aa.link這個文件,系統只會刪除掉inode table中aa.link指向的inode信息,和hardlink 目錄項中aa.link的相關信息。然後會將aa.link inode指針所指向的數據塊設置爲空閒的狀態,告訴系統這些數據塊可以被再次使用。而裏面的內容卻不會被刪除,直到新的數據覆蓋爲止!

這也就說明了,實際上 linux中被刪除的文件數據是可以被找回的,只要相應的數據塊沒有被再次覆蓋使用。

如果觀察的再細緻一些,我們會發現,爲什麼hardlink這個文件夾再創建後就會有兩個鏈接數呢?

[root@localhost hardlink]# ls -ail
total 4
51190841 drwxr-xr-x.  2 root root  21 Feb  2 14:02 .
      64 dr-xr-xr-x. 20 root root 267 Feb  2 13:02 ..
51190844 -rw-r--r--.  1 root root   4 Feb  2 14:00 aa.link
[root@localhost hardlink]# ls -il /
total 20
51190841 drwxr-xr-x.   2 root root   21 Feb  2 14:02 hardlink
....

通過上述查看,我們可以看出,當進入hardlink目錄下後,默認會有個 **.**的隱藏目錄,而該目錄也就是當前目錄的意思。即hardlink目錄。所以纔會有兩個鏈接數。

2.2、硬鏈接存在的問題

1、無法跨分區,跨設備創建硬鏈接

[root@localhost hardlink]# ln aa.link  /boot/
ln: failed to create hard link ‘/boot/aa.link’ => ‘aa.link’: Invalid cross-device link

因爲每個分區都有自己獨立的inode體系,假設A分區的文件在B分區做了一個硬鏈接,此時訪問B分區的此鏈接,按照我們想的是需要它訪問A分區的inode,進行數據查詢,但是它只會根據B分區的inode,在B數據塊中查找數據。就相當於兩套獨立的數據庫,你不可能拿着A數據庫的某個主鍵去B數據庫搜索數據,是一樣的道理。

2、無法創建文件夾的硬鏈接

[root@localhost hardlink]# ln /hardlink   /test/dir.link
ln: ‘/hardlink’: hard link not allowed for directory

至於爲何設置爲無法創建文件夾,這裏還是用反推來驗證。假設可以創建文件夾的硬鏈接:ln /hardlink /test/dir.link。那麼有個問題,首當其衝。

[root@localhost hardlink]# ls -al
total 4
drwxr-xr-x.  2 root root  21 Feb  2 14:02 .
dr-xr-xr-x. 20 root root 267 Feb  2 13:02 ..
-rw-r--r--.  1 root root   4 Feb  2 14:00 aa.link

hardlink目錄下的 . 是當前目錄的意思,此處代表hardlink,那dir.link中的 **.**是代表test目錄呢?還是 hardlink目錄呢?

其次,假設存在目錄 /A/B.link 和 /B/A.link。如果B.link是B目錄的硬鏈接,A.link是
A目錄的硬鏈接。那A.link既然是/A的鏈接,那它裏面肯定有B.link。同理B.link裏面肯定有A.link。這樣依次循環 /A/B.link/A.link/B.link/A.link/…。就造成了死循環的現象。這也就是爲什麼不允許創建文件夾硬鏈接的原因了。

由於硬鏈接侷限性比較多,所以工作中使用的不多。

3、軟鏈接

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

下面舉例說明軟鏈接的特性

[root@localhost ~]# mkdir /softlink
[root@localhost ~]# cd /softlink/
[root@localhost softlink]# touch aa.txt
#創建軟鏈接
[root@localhost softlink]# ln -s aa.txt  soft.link
[root@localhost softlink]# ls -il
total 0
1156025 -rw-r--r--. 1 root root 0 Feb  2 15:12 aa.txt
1156029 lrwxrwxrwx. 1 root root 6 Feb  2 15:13 soft.link -> aa.txt

如上可以看出,軟連接與原文件並不是同一inode,鏈接數也沒有增加。並且爲何連大小也不一樣呢?
這裏我們寫入一些內容到aa.txt中

[root@localhost softlink]# echo "111111111111111111111" >aa.txt 
[root@localhost softlink]# ls -il
total 4
1156025 -rw-r--r--. 1 root root 22 Feb  2 15:27 aa.txt
1156029 lrwxrwxrwx. 1 root root  6 Feb  2 15:13 soft.link -> aa.txt

再次查看,原文件大小發生了改變,而鏈接文件大小依舊沒變化。

這其實就是軟鏈接的特性之一,因爲軟鏈接的inode指向的數據塊保存的是 原文件的路徑,如果沒有路徑,是由文件名,默認會在軟鏈接所在路徑查找
在這裏插入圖片描述
再次舉例驗證:

[root@localhost softlink]# ln -s /usr/bin/ls  ls.link
#ls.link大小正好是 /usr/bin/ls的路徑字符串大小
[root@localhost softlink]# ll
total 4
-rw-r--r--. 1 root root 22 Feb  2 15:27 aa.txt
lrwxrwxrwx. 1 root root 11 Feb  2 15:45 ls.link -> /usr/bin/ls
lrwxrwxrwx. 1 root root  6 Feb  2 15:13 soft.link -> aa.txt

軟鏈接的使用,如果觀察Centos7,會發現,既有使用相對路徑創建的軟鏈接,也有使用絕對路徑創建的軟鏈接。
而使用相對路徑創建軟鏈接,則有如下注意點:
在這裏插入圖片描述
上圖中,我們使用 ln -s …/aa.txt /tmp/aa.link在/tmp下創建了軟鏈接,卻發現,竟然提示報錯!找不到aa.txt。因爲/tmp/aa.link在指向…/aa.txt 的過程中。它會以自己的路徑爲初始點去尋找aa.txt。即 /tmp/aa.link -> …/aa.txt,在系統看來,它會理解成。以aa.link所在路徑爲起點,回到上一級目錄,去尋找aa.txt。很顯然沒有找到,所以報錯。

創建的軟連接,指向的文件,默認會以軟鏈接的路徑爲主,去尋找指向的文件,所以創建時,請以軟鏈接的路徑作爲起點路徑 去寫原文件的相對路徑

那既然相對路徑創建這麼麻煩,爲什麼還要使用這種方式呢?因爲使用相對路徑的話,遷移只要相對遷移,不會影響鏈接的使用,更加靈活。而絕對路徑的軟鏈接,則必須要求路徑的正確性。

而由於軟鏈接 inode指向的數據塊只保存 原文件的地址字符串,所以可以跨分區、跨設備創建,並且文件夾也可以創建。當然如果原文件被刪除了,鏈接則也會失效,無法向硬鏈接那樣擁有獨立性。

4、軟鏈接與硬鏈接的區別

1、本質:
硬鏈接:同一個inode,只是多個名字。
軟鏈接:是不同的文件,inode不同
2、跨分區
硬鏈接無法跨分區、跨設備建立,軟鏈接可以
3、目錄
硬鏈接無法創建目錄硬鏈接,軟鏈接可以
4、相互關係
硬鏈接沒有主次之分,相互獨立
軟鏈接依賴於原文件,原文件被刪除,軟鏈接即不可用
5、鏈接數
硬鏈接會刪除增加會影響鏈接數,軟鏈接不會,因爲inode不一樣。
6、相對路徑
硬鏈接創建時,原始文件路徑是相對於當前路徑。
軟鏈接創建時,原始文件路徑是 相對於軟鏈接的路徑
7、文件類型
硬鏈接的類型與原始文件類型一致,軟鏈接則會顯示 symbolic link
8、創建方式
硬鏈接創建:ln [原文件] [硬鏈接]
軟鏈接創建:ln -s [原文件] [軟鏈接]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章