1. 程式人生 > >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的快捷方式。

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

Linux 的檔案與目錄

linux的檔案結構

現代作業系統為解決資訊能獨立於程序之外被長期儲存引入了檔案,檔案作為程序建立資訊的邏輯單元可被多個程序併發使用。在UNIX 系統中,作業系統為磁碟上的文字與影象、滑鼠與鍵盤等輸入裝置及網路互動等 I/O 操作設計了一組通用 API,使他們被處理時均可統一使用位元組流方式。

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

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

 /              根目錄
├── bin     存放使用者二進位制檔案
├── boot    存放核心引導配置檔案
├── dev     存放裝置檔案
├── etc     存放系統配置檔案
├── home    使用者主目錄
├── lib     動態共享庫
├── lost+found  檔案系統恢復時的恢復檔案
├── media   可解除安裝儲存介質掛載點
├── mnt     檔案系統臨時掛載點
├── opt     附加的應用程式包
├── proc    系統記憶體的對映目錄,提供核心與程序資訊
├── root    root 使用者主目錄
├── sbin    存放系統二進位制檔案
├── srv     存放服務相關資料
├── sys     sys 虛擬檔案系統掛載點
├── tmp     存放臨時檔案
├── usr     存放使用者應用程式
└── var     存放郵件、系統日誌等變化檔案

Linux 與其他類 UNIX 系統一樣並不區分檔案與目錄:目錄是記錄了其他檔名的檔案。

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

inode結點

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

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

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

在 Linux 中,元資料中的 inode 號(inode 是檔案元資料的一部分但其並不包含檔名,inode 號即索引節點號)才是檔案的唯一標識而非檔名。檔名僅是為了方便人們的記憶和使用,系統或程式通過 inode 號尋找正確的檔案資料塊。

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

簡單的說這個inode即使檔案在一個檔案系統中的唯一標識,需要訪問這個檔案的時候必須先找到並讀取這個檔案的 inode。

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

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

在 Linux 系統中檢視inode號可使用命令statls -i

這裡寫圖片描述

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

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

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

這裡寫圖片描述

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

  • 軟連線相當於快捷方式,如果開啟並修改軟連線,相應的檔案也會隨之改變。但是如果刪除軟連線,原始檔並不會受到影響。

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

  • 軟連線可以跨檔案系統建立,也就是可以在某個分割槽中建立到另外一個分割槽的軟連線

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

  • 最後一個區別是軟連線可以連線任何檔案或者資料夾,而硬連結則只能在檔案之間建立

硬連結與軟連結的聯絡與區別

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

硬連結的特徵

好了前面我們瞭解到了inode,這個才是linux系統中檔案儲存的關鍵。所以我們建立連結的時候,連結檔案和原始檔的inode相同,這樣他們就是一個檔案,硬連結成為原始檔的一個別名,這樣我們可以方便的共享檔案,快速訪問檔案。

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

link oldfile newfile 
ln oldfile newfile

這裡寫圖片描述

由於硬連結是有著相同 inode 號僅檔名不同的檔案,因此硬連結存在以下幾點特性:

  • 檔案有相同的 inode 及 data block;

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

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

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

  • 刪除一個硬連結檔案並不影響其他有相同 inode 號的檔案。

為什麼不能對目錄建立硬連結

原因有幾種,最重要的是:檔案系統不能存在連結環(目錄建立時的”..”除外,這個系統可以識別出來),

存在環的後果會導致例如檔案遍歷等操作的混亂

(du,pwd等命令的運作原理就是基於檔案硬連結,順便一提,ls -l結果的第二列也是檔案的硬連結數,即inode節點的連結數)硬連結的限制

這裡寫圖片描述

值得一提的是,Linux 系統存在 inode 號被用完但磁碟空間還有剩餘的情況。我們建立一個 5M 大小的 ext4 型別的 mo.img 檔案,並將其掛載至目錄 /mnt。然後我們使用一個 shell 指令碼將掛載在 /mnt 下 ext4 檔案系統的 indoe 耗盡(見清單 6.)。

軟連結的誕生

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

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

  • 軟連結有自己的檔案屬性及許可權等;

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

  • 軟連結可交叉檔案系統;

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

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

  • 刪除軟連結並不影響被指向的檔案,但若被指向的原檔案被刪除,則相關軟連線被稱為死連結(即 dangling link,若被指向路徑檔案被重新建立,死連結可恢復為正常的軟連結)。

總結

硬連結的限制

  • 不能對目錄建立硬連結

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

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

軟連結的特徵

  • 可以對目錄建立軟連結,遍歷操作會忽略目錄的軟連結。

  • 可以跨檔案系統

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

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

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

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

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

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

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

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