天天看點

Linux軟連接配接和硬連結 Linux連結概念 Linux 的檔案與目錄 硬連結與軟連結的聯系與差別 總結

連結——是一種在共享檔案和通路它的使用者的若幹目錄項之間建立聯系的一種方法。

linux連結分兩種,一種被稱為硬連結(hard link),另一種被稱為符号連結(symbolic link)。預設情況下,ln指令産生硬連結。

硬連結與軟連結是 linux 檔案系統中的一個重要概念,其涉及檔案系統中的索引節點 (index node 又稱 inode),而索引節點對象是 linux 虛拟檔案系統 (vfs) 的四個基本概念之一。

通過剖析硬連結與軟連結的聯系與差別,我們可更好的了解 linux 中 vfs 這一通用檔案模型。并讓 linux 普通使用者和系統管理者正确使用硬連結與軟連結,幫助檔案系統開發者擷取 inode 的相關知識。

硬連接配接指通過索引節點來進行連接配接。在linux的檔案系統中,儲存在磁盤分區中的檔案不管是什麼類型都給它配置設定一個編号,稱為索引節點号(inode index)。在linux中,多個檔案名指向同一索引節點是存在的。

一般這種連接配接就是硬連接配接。硬連接配接的作用是允許一個檔案擁有多個有效路徑名,這樣使用者就可以建立硬連接配接到重要檔案,以防止“誤删”的功能。

其原因如上所述,因為對應該目錄的索引節點有一個以上的連接配接。隻删除一個連接配接并不影響索引節點本身和其它的連接配接,隻有當最後一個連接配接被删除後,檔案的資料塊及目錄的連接配接才會被釋放。也就是說,檔案真正删除的條件是與之相關的所有硬連接配接檔案均被删除。

另外一種連接配接稱之為符号連接配接(symbolic link),也叫軟連接配接。軟連結檔案有類似于windows的快捷方式。

它實際上是一個特殊的檔案。在符号連接配接中,檔案實際上是一個文本檔案,其中包含的有另一檔案的位置資訊。

現代作業系統為解決資訊能獨立于程序之外被長期存儲引入了檔案,檔案作為程序建立資訊的邏輯單元可被多個程序并發使用。在unix 系統中,作業系統為磁盤上的文本與圖像、滑鼠與鍵盤等輸入裝置及網絡互動等 i/o 操作設計了一組通用 api,使他們被處理時均可統一使用位元組流方式。

換言之,unix 系統中除程序之外的一切皆是檔案,而 linux 保持了這一特性。

為了便于檔案的管理,linux 還引入了目錄(有時亦被稱為檔案夾)這一概念。目錄使檔案可被分類管理,且目錄的引入使 linux 的檔案系統形成一個層級結構的目錄樹。清單 1.所示的是普通 linux 系統的頂層目錄結構,其中 /dev 是存放了裝置相關檔案的目錄。

1. linux 系統的頂層目錄結構

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

linux 與其他類 unix 系統一樣并不區分檔案與目錄:目錄是記錄了其他檔案名的檔案。

使用指令 mkdir 建立目錄時,若期望建立的目錄的名稱與現有的檔案名(或目錄名)重複,則會建立失敗。

我們知道檔案都有檔案名與資料,這在 linux 上被分成兩個部分:

使用者資料 (user data), 即檔案資料塊 (data block),資料塊是記錄檔案真實内容的地方;

中繼資料 (metadata),是檔案的附加屬性,如檔案大小、建立時間、所有者等資訊。

在 linux 中,中繼資料中的 inode 号(inode 是檔案中繼資料的一部分但其并不包含檔案名,inode 号即索引節點号)才是檔案的唯一辨別而非檔案名。檔案名僅是為了友善人們的記憶和使用,系統或程式通過 inode 号尋找正确的檔案資料塊。

要解釋清楚兩者的差別和聯系需要先說清楚 linux 檔案系統中的 inode 這個東西。

簡單的說這個inode即使檔案在一個檔案系統中的唯一辨別,需要通路這個檔案的時候必須先找到并讀取這個檔案的 inode。

inode 裡面存儲了檔案的很多重要參數,其中唯一辨別稱作 inumber, 其他資訊還有建立時間(ctime)、修改時間(mtime) 、檔案大小、屬主、歸屬的使用者組、讀寫權限等資訊。

當劃分磁盤分區并格式化的時候,整個分區會被劃分為兩個部分,即inode區和資料區域

在 linux 系統中檢視<code>inode</code>号可使用指令<code>stat</code>或<code>ls -i</code>

Linux軟連接配接和硬連結 Linux連結概念 Linux 的檔案與目錄 硬連結與軟連結的聯系與差別 總結

使用指令 mv 移動并重命名檔案,其結果不影響檔案的使用者資料及 inode 号。

通常會根據分區的用途來安排inode的數量(這是另外一個話題了),比如檔案數量很多而檔案都很小,則需要調增inode較大,以便能索引全部檔案。否則将會出現這個分區并沒有寫滿而無法寫入任何檔案的情況。

檢視 inodes 使用情況的指令 df -i :

Linux軟連接配接和硬連結 Linux連結概念 Linux 的檔案與目錄 硬連結與軟連結的聯系與差別 總結

知道了inode的作用就不難了解軟硬連結的差別了。

軟連接配接相當于快捷方式,如果打開并修改軟連接配接,相應的檔案也會随之改變。但是如果删除軟連接配接,源檔案并不會受到影響。

硬連結有點像引用和指針的結合,當打開和修改它時,相應的檔案随之改變,但是所有這個檔案的硬連結的内容也随之改變,這是因為所有的硬連結都擁有唯一的一個 inode 号,他們指向的是同一檔案。

軟連接配接可以跨檔案系統建立,也就是可以在某個分區中建立到另外一個分區的軟連接配接

硬連結則隻能在本檔案系統中使用(想想為什麼?),其實原理很簡單,因為 inode 是這個檔案在目前分區中的索引值,是相對于這個分區的,當然不能跨越檔案系統了。

最後一個差別是軟連接配接可以連接配接任何檔案或者檔案夾,而硬連結則隻能在檔案之間建立

為解決檔案的共享使用,linux 系統引入了兩種連結:硬連結 (hard link) 與軟連結(又稱符号連結,即 soft link 或 symbolic link)。連結為 linux 系統解決了檔案的共享使用,還帶來了隐藏檔案路徑、增權重限安全及節省存儲等好處。若一個 inode 号對應多個檔案名,則稱這些檔案為硬連結。換言之,硬連結就是同一個檔案使用了多個别名。

好了前面我們了解到了inode,這個才是linux系統中檔案存儲的關鍵。是以我們建立連結的時候,連結檔案和源檔案的inode相同,這樣他們就是一個檔案,硬連結成為源檔案的一個别名,這樣我們可以友善的共享檔案,快速通路檔案。

硬連結可由指令 link 或 ln 建立。如下是對檔案 oldfile 建立硬連結。

Linux軟連接配接和硬連結 Linux連結概念 Linux 的檔案與目錄 硬連結與軟連結的聯系與差別 總結

由于硬連結是有着相同 inode 号僅檔案名不同的檔案,是以硬連結存在以下幾點特性:

檔案有相同的 inode 及 data block;

隻能對已存在的檔案進行建立;

不能交叉檔案系統進行硬連結的建立;

不能對目錄進行建立,隻可對檔案建立;

删除一個硬連結檔案并不影響其他有相同 inode 号的檔案。

為什麼不能對目錄建立硬連結 原因有幾種,最重要的是:檔案系統不能存在連結環(目錄建立時的”..”除外,這個系統可以識别出來), 存在環的後果會導緻例如檔案周遊等操作的混亂 (du,pwd等指令的運作原理就是基于檔案硬連結,順便一提,ls -l結果的第二列也是檔案的硬連結數,即inode節點的連結數)硬連結的限制
Linux軟連接配接和硬連結 Linux連結概念 Linux 的檔案與目錄 硬連結與軟連結的聯系與差別 總結
值得一提的是,linux 系統存在 inode 号被用完但磁盤空間還有剩餘的情況。我們建立一個 5m 大小的 ext4 類型的 mo.img 檔案,并将其挂載至目錄 /mnt。然後我們使用一個 shell 腳本将挂載在 /mnt 下 ext4 檔案系統的 indoe 耗盡(見清單 6.)。

軟連結與硬連結不同,若檔案使用者資料塊中存放的内容是另一檔案的路徑名的指向,則該檔案就是軟連接配接。軟連結就是一個普通檔案,隻是資料塊内容有點特殊。

軟連結有着自己的 inode 号以及使用者資料塊。是以軟連結的建立與使用沒有類似硬連結的諸多限制

軟連結有自己的檔案屬性及權限等;

可對不存在的檔案或目錄建立軟連結;

軟連結可交叉檔案系統;

軟連結可對檔案或目錄建立;

建立軟連結時,連結計數 i_nlink 不會增加;

删除軟連結并不影響被指向的檔案,但若被指向的原檔案被删除,則相關軟連接配接被稱為死連結(即 dangling link,若被指向路徑檔案被重新建立,死連結可恢複為正常的軟連結)。

不能對目錄建立硬連結

不能對不同的檔案系統建立硬連結,即兩個檔案名要在相同的檔案系統下。

不能對不存在的檔案建立硬連結,由原理即可知原因。

可以對目錄建立軟連結,周遊操作會忽略目錄的軟連結。

可以跨檔案系統

可以對不存在的檔案建立軟連結,因為放的隻是一個字元串,至于這個字元串是不是對于一個實際的檔案,就是另外一回事了

硬連結原檔案/連結檔案公用一個inode号,說明他們是同一個檔案,而軟連結原檔案/連結檔案擁有不同的inode号,表明他們是兩個不同的檔案;

在檔案屬性上軟連結明确寫出了是連結檔案,而硬連結沒有寫出來,因為在本質上硬連結檔案和原檔案是完全平等關系;

連結數目是不一樣的,軟連結的連結數目不會增加;

檔案大小是不一樣的,硬連結檔案顯示的大小是跟原檔案是一樣的。而這裡軟連結顯示的大小與原檔案就不同了

硬連結不能跨越檔案系統,且不能指向目錄,但是軟連結沒有這些限制

總之,建立軟連結就是建立了一個新檔案。當通路連結檔案時,系統就會發現他是個連結檔案,它讀取連結檔案找到真正要通路的檔案。

當然軟連結也有硬連結沒有的缺點,因為連結檔案包含有原檔案的路徑資訊,是以當原檔案從一個目錄下移到其他目錄中,再通路軟連結檔案,系統就找不到了,而硬連結就沒有這個缺陷,你想怎麼移就怎麼移;還有它要系統配置設定額外的空間用于建立新的索引節點和儲存原檔案的路徑。

轉載:http://blog.csdn.net/gatieme/article/details/50922523

繼續閱讀