Linux文件系統:從inode理解軟鏈接與硬鏈接

什么是inode?

在Linux磁盤存儲文件系統中,我們以塊劃分磁盤為兩部分:超級塊(superblock)和數據塊(data block);同時劃分單文件為戶數(user data)和元數據(meta data)兩個部分。

  • 用戶數據記錄的是文件的真實內容。比如你的血液、骨骼和各器官等等。

  • 元數據這是附加于文件的屬性信息。比如身高、體重、血型和年齡等等。通常包含了文件的大小、訪問模式、歸屬(主和組)、權限、時間戳等等。

為了快速查找分別存儲于超級塊和數據塊的文件,我們引進了索引節點inode(index node)。我們可以理解為元數據+數據塊指針=inode。每個inode大小固定為128bytes,每個文件占用一個inode。但是有一個問題,需要記錄的文件屬性特別多,而且一個文件可能有很多很多block,而inode又太小(記錄一個block要用4byte),怎么辦?linux的解決辦法是:將inode記錄block號碼的區域定義為12個直接、一個間接、一個雙間接與一個三間接記錄區??偣部捎涗浀腷lock數量為:12+256+256*256+256*256*256(K)=16G這只符合block大小為1K時的情況。

為了方便理解,我繪制的示例如下圖:

wKiom1ecZgKwRz6bAAC_o2O7VB4610.png


Linux是如何查找文件的?

文件的文件名是不包含在inode結構里的,用戶通過文件名來引用一個文件,文件名只是為了方便用戶識別文件的。

每個inode都有一個編號,我們稱為索引編號(inumber),兩者雖然極為相似,并且互相關聯,但他們卻是兩個不同的概念。 inode 指的是數據結構;而inumber實際上是 inode 的標識編號,因此也稱其為 inode 編號 或者索引編號。索引編號只是文件相關信息中一項重要的內容。Linux的內核內存是通過索引編號定位inode,再從inode里的指針,定位到data block,從而找到文件的。

值得注意的是,目錄也是文件,不過目錄的 data block 里的數據是目錄下的文件名(子目錄)它的inode 號之間的映射構成的。

現在我們通過示圖來展示 Linux 查找文件

1.假設有文件目錄結構如下圖:

wKiom1ecn-nyk7qMAAAeJ1kTy7o602.png

系統需要查找/testdir/A/b.txt文件,查找過程是

wKiom1edOQ3AdjhAAAJHnikK1h8934.gif


linux如何創建、刪除、移動文件?

創建

當我們直接創建(或通過復制創建)一個普通文件/PATH/file時,系統會分配一個空閑的inode,在inode表中生成inumber,同時父目錄/PATH的data block里添加file《═》inumber。這樣一個新文件創建成功了。

rm刪除

鏈接數遞減,從而釋放的inode 號可以被重用,
   

把數據塊放在空閑列表中

刪除父目錄里的映射項

數據實際上不會馬上被刪除,但當另一個文件使用數據塊
   
時將被覆蓋。

mv移動

1. 如果mv 命令的目標和源在相同的文件系統,作為mv  命令
   
    用新的文件名創建對應新的目錄項

   
    刪除舊目錄條目對應的舊的文件名

   
    不影響inode 表(除時間戳)或磁盤上的數據位置:沒有數據被移動!

   
2. 如果目標和源在一個不同的文件系統, 由于inode不能跨文件系統,所以mv 需要在目標文件系統中執行相當于cp 和rm。


軟鏈接和硬鏈接

為解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。鏈接為 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處。若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名hard link 就是 file 的一個別名,他們有共同的 inode)。硬鏈接可由命令 link 或 ln 創建。如下是對文件 oldfile 創建硬鏈接。

硬鏈接:

wKiom1eentDwLwKUAABg5vuX5bE659.png

從上圖中我們可以看到,硬鏈接與源文件是相同的inode和data block。因此

硬鏈接的特性為:


  • 只能對已存在的文件進行創建,創建硬鏈接會在inode里添加計數

           

  • 指向inode相同,與源文件的data block也相同

  • 不能對目錄創建硬鏈接

  • 不能跨文件系統進行硬鏈接的創建

  • 創建硬鏈接會在硬鏈接父目錄添加映射條目:hard link映射源文件inode

  • 刪除一個硬鏈接文件,會在父目錄清除該條映射,inode計數減一,所以不影響其他有相同 inode 號的文件。


     

硬鏈接展示:

源文件不存在, 無法創建硬鏈接:

 

wKiom1eeqAbhNrv5AAAYG0WlQBI604.png

不能對目錄進行創建硬鏈接:

 

wKioL1eepw6AqBD3AAAPdaAzfp4261.png

不能跨文件系統創建硬鏈接:

wKiom1eeqVujeiCsAABO6p2D5IE953.png

與源文件有相同的inode,inode里計數增加1:

 

wKiom1eeqI_CeCPyAADfjNj_s-A119.png


軟連接:

 
wKioL1eenzmTZVryAACSx5d6mCQ903.png

從上圖中我們可以看到,軟連接和源文件是兩個獨立inode的文件,因此

軟鏈接的特性為:


  • 可以指向一個目錄

  • 可以跨文件系統(分區)

  • 是一個指向源文件名稱的指針,是個一個文件

  • 指向的是另一個文件的路徑;其大小為指向的路徑字符串的長度;不增加或減少目標文件inode 的引用計數


     

軟鏈接展示:

可以對目錄創建軟鏈接:

wKiom1eeqnqi2T-jAAAcA66lwkc466.png

可以跨文件系統創建軟連接:

wKioL1eeq3rzyAbsAABL6t0Q5Us428.png

軟鏈接是指向源文件的指針,與源文件是兩個獨立inode的文件:

wKioL1eerdTjOzLRAAD6GKcF9MU758.png


寫在結束

本文描述了 inode 的結構體。通過索引節點結構體,區分硬鏈接與軟鏈接的不同存在。

本文參考資料主要來源于:

《理解 Linux 的硬鏈接與軟鏈接》http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/#fig2

《學習 Linux,101: 創建和更改硬鏈接和符號鏈接》http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-104-6/

文中主要通過個人理解進行描述,由于初學Linux,限于本人水平有限,文中難免錯誤紕漏。歡迎各位看官不吝指教、討論相關技術。謝謝。聯系我:jacky18676887374@aliyun.com

原創文章,作者:昭其,如若轉載,請注明出處:http://www.www58058.com/30437

(0)
昭其昭其
上一篇 2016-08-07
下一篇 2016-08-07

相關推薦

  • Linux防火墻之基本原理

    本系列文章主要講述Linux防火墻的基本原理和基礎使用方法: 1.什么是防火墻: 當我們把計算機連入互聯網與其他計算機進行通信時,這無疑也將自己的信息暴露了,那就意味著可能會有一些心懷不軌的人會利用這些信息來攻擊自己的主機,尤其是作為一臺服務器向互聯網用戶提供服務時,就迫切需要一種隔離和保護機制,來隔離外部網絡,達到保護自我的目的。而這種隔離機制就叫做防火墻…

    Linux干貨 2016-12-27
  • awk命令詳解

    簡介: wak是一個強大的文本分析工具,也可以叫做報告生成工具。相對于grep的查找,sed的編輯,awk在對其數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格 為默認分隔符將每行切片,切開的部分再進行各種分析處理。 awk有三個不同的版本:awk,nawk,gawk。我們目前所使用的awk一般指gawk,gawk是AWK和GN…

    Linux干貨 2016-11-28
  • phpMyAdmin安裝部署

    phpMyAdmin安裝部署 phpMyAdmin 是一個用PHP編寫的軟件工具,可以通過web方式控制和操作MySQL數據庫。通過phpMyAdmin 可以完全對數據庫進行操作,例如建立、復制和刪除數據等等。如果使用合適的工具,MySQL數據庫的管理就會變得相當簡單。應用 MySQL 命令行方式需要對 MySQL 知識非常熟悉,對SQL語言也是同樣的道理?!?/p>

    2017-06-13
  • 馬哥linux0801課程內容

    0801課堂筆記 硬鏈接和軟鏈接最根本的區別 硬鏈接是同一個文件,而軟鏈接是兩個文件 軟鏈接查詢到文件的軟鏈接個數.比較麻煩. 而硬鏈接的個數可以通過鏈接數就可以看到. 硬鏈接不能跨分區,而軟鏈接可以跨分區 (因為每個分區都有自己的inode表) ln 創建硬鏈接 ln–s 創建軟鏈接(軟鏈接如果使用相對路徑,對象是相對軟鏈接的路徑,而硬…

    Linux干貨 2016-08-04
  • M25初嘗試部署RAID磁盤陣列組

    在學習了linux系統管理硬盤設備的基礎后,現在嘗試部署RAID10硬盤組技術,在部署前我們先了解一下什么叫“RAID”磁盤冗余陣列(Redundant Array of Independent Disks)。 RAID技術就是把多塊硬盤設備組合成一個容量更大、更安全的硬盤組,可以把數據切割成多個區段后分別存在各個不同物理硬盤設備上,然后利用分散讀寫需求賴提…

    2017-07-12
  • 文件管理相關

     rename:對文件重命名     rename [options] expression replacement file        示例:          # rename -v cut.exe cut.exe3 cut.exe…

    Linux干貨 2017-02-25
欧美性久久久久