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 22:05
下一篇 2016-08-07 22:05

相關推薦

  • 軟件包管理

    一、軟件管理程序rpm 簡介:RPM是通過預編譯并打包成為RPM文件格式后再加以安裝的一種方式,并且還能夠進行數據庫的記載。 1、優點:     1、RPM內含已經編譯過的程序與設置文件等數據,可以讓用戶免除重新編譯的困擾;     2、RPM在被安裝之前,會先檢查系統的硬盤容量…

    Linux干貨 2016-08-24
  • sed的模式匹配用法探討

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1405753 [root@sunsky Desktop]# cat sunsky a b c d e f [root@sunsk…

    Linux干貨 2016-08-15
  • Linux命令格式及常用命令詳解

    Linux命令格式及常用命令詳解 Linux的命令格式 COMMAND OPTIONS ARGUMENTS COMMAND 表示要執行的命令 OPTIONS 表示命令的運行特性 RGUMENTS 命令的作用對象,有時可以包含多個對象,空格隔開 常用命令詳解 ifconfig 功能描述:獲取網絡接口配置信息或配置網絡接口 命令格式: ifconfig [-a]…

    Linux干貨 2017-07-02
  • linux下手工創建新用戶

    當我們要創建一個用戶時,通常使用useradd命令就可以自動創建了一個用戶;實際上,在linux下,一切皆文件,設置好幾個文件,也是可以創建出一個用戶: 文件如下: /etc/passwd  :用戶 /etc/shadow  :密碼 /home/username:用戶家目錄 /etc/group:用戶組 /etc/skel/*: &nbs…

    Linux干貨 2015-03-30
  • linux時間

    linux有兩個時間:     系統時間和硬件時間 系統時間: 最簡單的使用date命令顯示當前系統的時間,命令行輸入date。 # date Thu Jun  2 17:11:48 CST 2016 date的具體使用方式:     1. date格式顯示:date …

    Linux干貨 2016-06-03
  • 馬哥教育網絡班20期+第四周課程練習

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 cp -r /etc/skel/ /home/tuser1 chmod o-rwx /home/tuser1/.* 2、編輯/etc/group文件,添加組hadoop。 e…

    Linux干貨 2016-06-26
欧美性久久久久