1. 程式人生 > >Linux檔案系統----軟連結和硬連結

Linux檔案系統----軟連結和硬連結

更多Linux檔案系統知識:Linux檔案系統-----基礎IO

Linux檔案系統的認知

1、Linux系統下一切皆檔案

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

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

在這裡插入圖片描述

2、認識檔案的儲存結構

下圖是一個檔案的儲存結構圖

在這裡插入圖片描述

超級塊(super block) 包含檔案系統資訊的資料結構。檔案系統的控制資訊、單獨檔案的資訊這些都包含超級塊中。超級塊通常存放在特定的扇區中。
inode索引節點 包含檔案的描述資訊(屬性資訊)的結構體,其中有檔案的儲存位置等。

儲存一個檔案:通過data點陣圖找到未使用data區域,寫入檔案資料,通過inode點陣圖找到未使用的inode結點,將檔案的源資訊以及檔案的資料儲存位置記錄到inode節點中。

3、作業系統如何管理檔案

Linux作業系統為了方便管理檔案,將每一個檔案描述成files_struct結構體==》這些結構體被作業系統組織成特殊的雙鏈表。

例如:檔案系統(Ext2的雙鏈表示意圖)

在這裡插入圖片描述

程序預設開啟就打開了下面三個檔案:
標準輸入 標準輸出 標準錯誤輸出 應用場景
檔案流指標 stdin stdout stderr C庫IO操作控制代碼
檔案描述符 0 1 2 系統呼叫方式

在這裡插入圖片描述

檔案描述符:實際上是數字,這個數字是程序pcb中的files_struct這個結構體中檔案描述資訊的結構體陣列的下標,作業系統可以通過這數字下標找到對應的檔案資訊,來完對這個檔案的操作。

由此可見,程序:檔案=1:n(n>=3),C語言的IO庫函式是對系統呼叫的封裝,也就是說,C庫的IO操作函式實際是通過呼叫系統呼叫實現的。
區別在於檔案流指標中還定義了一個緩衝區,我們所說的換行重新整理緩衝區(只針對於標準輸出),實際就是重新整理的這個緩衝區,這個緩衝區用於將短小資料組織合成大資料一次性寫入檔案,這樣提高效率,而系統呼叫沒有緩衝區。緩衝區就在FILE*這個結構體裡,而系統呼叫則沒有這個緩衝區。
系統呼叫通過使用檔案描述符來實現,C語言的IO庫函式通過系統呼叫實現,那麼檔案流指標結構體中一定有int型別的成員來表示檔案描述符。

軟/硬連結

我們知道檔案都有檔名與資料,這在 Linux 上被分成兩個部分:使用者資料 (user data) 與元資料 (metadata)。使用者資料,即檔案資料塊 (data block),資料塊是記錄檔案真實內容的地方;而元資料則是檔案的附加屬性,如檔案大小、建立時間、所有者等資訊。在 Linux 中,元資料中的 inode 號(inode 是檔案元資料的一部分但其並不包含檔名,inode 號即索引節點號)才是檔案的唯一標識而非檔名。檔名僅是為了方便人們的記憶和使用,系統或程式通過 inode 號尋找正確的檔案資料塊。圖 1.展示了程式通過檔名獲取檔案內容的過程。

在這裡插入圖片描述

軟連結

軟連結是獨立的檔案,檔案資料內容是原始檔的路徑

若檔案使用者資料塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟連線。軟連結就是一個普通檔案,只是資料塊內容有點特殊。軟連結有著自己的 inode 號以及使用者資料塊(見 圖 2.)。

在這裡插入圖片描述

軟連結的建立與使用沒有類似硬連結的諸多限制:
  • 軟連結有自己的檔案屬性及許可權等;
  • 可對不存在的檔案或目錄建立軟連結;
  • 軟連結可交叉檔案系統;
  • 軟連結可對檔案或目錄建立;
  • 建立軟連結時,連結計數 i_nlink 不會增加;
  • 刪除軟連結並不影響被指向的檔案,但若被指向的原檔案被刪除,則相關軟連線被稱為死連結(即 dangling link,若被指向路徑檔案被重新建立,死連結可恢復為正常的軟連結)。

硬連結

若一個 inode 號對應多個檔名,則稱這些檔案為硬連結。換言之,硬連結就是同一個檔案使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。

由於硬連結是有著相同 inode 號,僅檔名不同的檔案,因此硬連結存在以下幾點特性:
  • 與原始檔檔案有相同的 inode 及 data block;
  • 只能對已存在的檔案進行建立;
  • 不能交叉檔案系統進行硬連結的建立;
  • 不能對目錄進行建立,只可對檔案建立;
  • 刪除一個硬連結檔案,並不影響其他有相同 inode 號的檔案。

建立軟/硬連結

建立軟連結

ln -s 原檔名 軟連結檔名

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

link oldfile newfile 
ln oldfile newfile

在這裡插入圖片描述

軟連結和硬連結的區別

1、軟連結有自己的inode節點,是一個獨立的檔案;硬連結檔案inode節點號與原始檔相同,是一個檔名(目錄項)
2、刪除原始檔,硬連結沒有影響,只是inode中的連結數-1;刪除原始檔,軟連結檔案將無法使用
3、軟連結不僅可以針對檔案操作,還可以針對目錄操作,硬連結只能針對檔案
4、硬連結不能跨分割槽建立,軟連結可以

注:
stat 檔名檢視檔案資訊
ll -i 檔名可以檢視檔案的inode節點號