Linux的硬鏈接和軟連接(符號鏈接)的區別

一、引言

1.什麼是目錄?

Linux 文件系統是樹狀結構的。根目錄下存在一系列子目錄。目錄裏邊有文件或者子目錄。 但問題在於:

目錄是什麼?
文件又是什麼?
文件是:數據 + 屬性(比如名字、創建時間、所有者之類)
目錄是:一個列表,列表中的每一項是:inode –> filename

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

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

首先要弄清楚,在Linux系統中,內核爲每一個新創建的文件分配一個Inode(索引結點),每個文件都有一個惟一的inode號。文件屬性保存在索引結點裏,在訪問文件時,索引結點被複制到內存,從而實現文件的快速訪問。

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

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

二、硬鏈接

硬鏈接說白了是一個指針,指向文件索引節點,系統並不爲它重新分配inode。可以用:ln命令來建立硬鏈接。

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

在這裏插入圖片描述

只有將所有指向文件內容的指針,也即鏈接數減爲0時,內核纔會把文件內容從磁盤上刪除。另外,硬鏈接,只能應用於文件,而不能應用於目錄,而且不能跨文件系統(即分區)。

儘管硬鏈接節省空間,也是Linux系統整合文件系統的傳統方式,但是存在一下不足之處:(1)不可以在不同文件系統的文件間建立鏈接(2)只有超級用戶纔可以爲目錄創建硬鏈接。

三、軟連接(符號鏈接)

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

軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。因而現在更爲廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網絡對文件進行鏈接。建立軟鏈接,只要在ln後面加上選項 –s。

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

在這裏插入圖片描述

在這裏插入圖片描述

當然軟鏈接也有硬鏈接沒有的缺點,因爲鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了,而硬鏈接就沒有這個缺陷,你想怎麼移就怎麼移;還有它要系統分配額外的空間用於建立新的索引節點和保存原文件的路徑。

四、區別

掛載點

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

目錄

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

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

小結

總結一下,可以看出,硬鏈接原文件&鏈接文件公用一個inode號,說明他們是同一個文件,而軟鏈接原文件&鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出來,因爲在本質上硬鏈接文件和原文件是完全平等關係,就像文件被複制了一份一樣;鏈接數目是不一樣的,軟鏈接的鏈接數目不會增加,硬鏈接會相應的加一;文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文件是一樣的,而這裏軟鏈接顯示的大小與原文件就不同了。

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