【linux命令】軟連接和硬鏈接的區別(ln命令)


Linux 文件系統把硬盤分為三個部分:超級塊、inode 列表、數據區

  inode 指示:該文件的數據存放在數據區的哪些塊內。因為這個“映射”關系不能變更,因此,inode 相當於代表着文件本身。(值得注意的是,文件名與文件本身不是直接映射起來的,中間隔着 inode)

  內核為每一個新創建的文件分配一個Inode(索引結點),每個文件都有一個唯一的inode號。文件屬性保存在索引結點里,在訪問文件時,索引結點被復制到內存,從而實現文件的快速訪問。

  鏈接是一種在共享文件和訪問它的用戶的若干目錄項之間建立聯系的一種方法。

  Linux中包括兩種鏈接:硬鏈接(Hard Link)和軟鏈接(Soft Link),軟鏈接又稱為符號鏈接(Symbolic link)。

硬鏈接

  硬鏈接相當於是一個指針,指向文件索引節點,系統並不為它重新分配inode。用 ln 命令來建立硬鏈接。

  當我們創建了一個文件的硬鏈接時,硬鏈接會使用和文件相同的inode號,此時我們發現,原來的文件的inode連接數由最初的1變為了2,實際上硬鏈接和文件使用了相同的inode,只不過是inode連接數增加了,刪除文件不會影響硬鏈接,硬鏈接的inode數會從2變為1

# 不管是硬鏈接還是軟連接,源文件必須先存在
[root@tanbaobao thy]# touch codefile.txt
[root@tanbaobao thy]# vi codefile.txt 

# 索引數量為1
[root@tanbaobao thy]# ls -il
總用量 8
922461 -rw-r--r-- 1 root root  6 12月 18 11:04 codefile.txt

# 默認不加任何參數是創建硬鏈接,且參數二必須是要創建的鏈接文件
[root@tanbaobao thy]# ln codefile.txt h_codefile.txt

# 查看硬鏈接,會發現它們的inode索引號是相同的,但索引的數量會加1
[root@tanbaobao thy]# ls -il
總用量 12
922461 -rw-r--r-- 2 root root  6 12月 18 11:04 codefile.txt
922461 -rw-r--r-- 2 root root  6 12月 18 11:04 h_codefile.txt

# 刪除源文件並不會影響硬鏈接(只有將所有指向文件內容的指針,也即鏈接數減為0時,內核才會把文件內容從磁盤上刪除。)
[root@tanbaobao thy]# rm -rf codefile.txt 
[root@tanbaobao thy]# ls -li
總用量 8
922461 -rw-r--r-- 1 root root  6 12月 18 11:04 h_codefile.txt

PS:硬鏈接,只能應用於文件,而不能應用於目錄,而且不能跨文件系統(即分區)。不可以在不同文件系統的文件間建立鏈接。

軟連接(符號鏈接)

  符號鏈接是對一個文件的間接指針。硬鏈接直接指向文件的i節點。 

  軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。甚至可以跨越不同機器、不同網絡對文件進行鏈接。建立軟鏈接只要在ln后面加上選項 –s。   

  在創建文件的軟鏈接時,軟鏈接會使用一個新的inode,所以軟鏈接的inode號和文件的inode號不同,軟鏈接的inode里存放着指向文件的路徑,刪除文件,軟鏈接也無法使用了,因為文件的路徑不存在了;當我們再次創建這個文件時(文件名與之前的相同),軟鏈接又會重新指向這個文件(inode號與之前的不同了),而硬鏈接不會受其影響

# 先創建源文件
[root@tanbaobao thy]# touch srcfile.txt
[root@tanbaobao thy]# ls -l
總用量 4
-rw-r--r-- 1 root root 38 12月 18 11:01 srcfile.txt

# 創建軟連接(參數二必須是軟連接文件名)
[root@tanbaobao thy]# ls -l
總用量 4
-rw-r--r-- 1 root root 38 12月 18 11:01 srcfile.txt

# 查看(軟連接的索引是不相同的,且索引數量都為1,並且軟連接文件名后邊會指向鏈接的源文件)
[root@tanbaobao thy]# ls -il
總用量 8
922457 lrwxrwxrwx 1 root root 11 12月 18 11:02 desfile.txt -> srcfile.txt
922460 -rw-r--r-- 1 root root 64 12月 18 11:03 srcfile.txt

# 刪除源文件,軟連接就會失效(因為索引指向的源文件路徑已經不存在了)
[root@tanbaobao thy]# rm -r srcfile.txt 
rm:是否刪除普通文件 "srcfile.txt"?y
[root@tanbaobao thy]# ls -il
總用量 4
922457 lrwxrwxrwx 1 root root 11 12月 18 11:02 desfile.txt -> srcfile.txt

 

 

查看軟連接文件會顯示沒有該文件:

 

 

重新創建之后又會恢復,因為路徑指向的文件存在:

[root@tanbaobao thy]# touch srcfile.txt
[root@tanbaobao thy]# ll -i
總用量 4
922457 lrwxrwxrwx 1 root root 11 12月 18 11:02 desfile.txt -> srcfile.txt
922458 -rw-r--r-- 1 root root  0 12月 18 11:43 srcfile.txt

 

說明:可以創建多個鏈接文件,但是不能在軟連接文件上創建鏈接文件,這樣會導致斷裂,形成混亂的鏈接鏈

區別:

掛載點

  只能在同種存儲媒體上的文件之間創建硬鏈接(Hard Link),不能在不同掛載點下的文件間創建硬鏈接,對於后一種情況,可以使用軟鏈接;(區分不同掛載點與同一掛載點不同目錄)

目錄

  軟連接就相當於 win 中的快捷方式即如果軟鏈接一個目錄只是一個目錄的快捷方式到指定位置,操作系統找這個快捷方式會直接找到真實目錄下的文件。但是硬鏈接的話,相當於鏡像的方式,創建一個目錄的硬鏈接之后,操作系統需要把這個目錄下所有的文件都要做一次硬鏈接(復制一份過去),這樣操作系統在訪問這個鏈接的時候要不斷去遍歷,大大增加復雜度,而且很容易進入死循環。

  硬鏈接不能對目錄創建受限於文件系統的設計。Linux 文件系統中的目錄均隱藏了兩個特殊的目錄,當前目錄和父目錄。其實是兩個硬鏈接,若系統運行對目錄創建硬鏈接,則會產生目錄環。

總結:

 

  1)硬鏈接原文件&鏈接文件共用一個inode號,說明他們是同一個文件;而軟鏈接原文件&鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;

  2)在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出來,因為在本質上硬鏈接文件和原文件是完全平等關系,就像文件被復制了一份一樣;

  3)鏈接數目是不一樣的,軟鏈接的鏈接數目不會增加,硬鏈接會相應的加一;  

  4)文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文件是一樣的,而這里軟鏈接顯示的大小與原文件就不同了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM