1. 程式人生 > >Linux下對inode和塊的理解

Linux下對inode和塊的理解

條目 純粹 數據大小 兩個 style bubuko 單位 新建 mil

基本概念

首先講下inode和塊的基本概念。在Linux系統中,文件由元數據數據塊組成。數據塊就是多個連續性的扇區(sector),扇區是文件存儲的最小單位(每個512字節)。塊(block)的大小,最常見的是4KB,也就是連續8個sector組成,存儲文件數據和目錄數據。而元數據用來記錄文件的創建者、創建日期、大小等,這種存儲文件元數據信息的區域叫做inode,即索引節點。

由於inode也是用來存儲文件相關屬性信息的,所以也會消耗硬盤空間。具體包含的信息有inode號,文件的字節數、User ID、Group ID、讀、寫、執行權限、時間戳(共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間)、鏈接數(軟硬鏈接)、數據block的位置,註意沒有文件名。

在硬盤格式化的時候,操作系統就會將硬盤分為兩個區,即數據區和inode區。每個inode節點的大小一般為128B或者256B,inode的總數在格式化文件系統的時候就已經確定。

另外還有幾個概念了解一下:

inode Bitmap:即inode位圖,用二進制的方式記錄了inode的使用情況, 比如inode是否空閑等。

Block Bitmap:即塊位圖,同Inode Bitmap,用二進制方式記錄了塊的使用情況。當查找或創建文件時,會掃描此位圖來尋找空閑的inode號對應的塊。

super block:超級塊包含了該硬盤或分區上的文件系統的整體信息,如文件系統的大小等。

dentry

:在內核中起到了連接不同的文件對象inode的作用,進而起到了維護文件系統目錄樹的作用。dentry是一個純粹的內存結構,由文件系統在提供文件訪問的過程中在內存中直接建立。dentry中包含了文件名,文件的inode號等信息。

下圖為文件系統inode區block區圖:

技術分享圖片

文件的查找、創建、刪除原理

接下來對文件的查找、創建、刪除原理三個方面來對inode和塊的理解。

文件的查找:比如要查找/var/log/message

文件的創建:比如要創建/backup/test.txt(前提backup目錄存在)

文件的刪除:刪除/backup/test.txt

查找

技術分享圖片

  1. 首先根目錄(目錄也是個文件,不是容器!也可以理解為路徑的映射表)
    會自引用。找到inode表中對應的條目。(暫且把inode表中inode號和其對應的塊信息成為條目)
  2. inode表中對應的信息指向根目錄對應的塊,其中有var目錄對應的信息和inode號。
  3. 系統根據var目錄inode號回頭找到inode表中var目錄其對應的條目。
  4. 根據var目錄對應的塊信息找到對應的塊,其中有log目錄對應的信息和inode號。
  5. 系統又根據log目錄inode號在inode表中找到其對應的條目。
  6. 根據log目錄對應的塊信息找到對應的塊,其中有messages文件。
  7. 根據messages文件的inode號在inode表中找到其對應的條目。
  8. 最後系統根據messages對應的條目信息告訴我們messages文件對應了多少的塊,最後給我們呈現的就是所看到的數據。

創建

技術分享圖片

  1. 首先掃描inode位圖,找空閑的inode號,找到之後占用。
  2. 根目錄自引用找到inode表中對應的條目,並根據條目找到對應的塊。
  3. 依據根目錄對應的塊中backup目錄對應的inode號,回頭找到inode表中條目。
  4. inode表中條目又找到對應的塊,在這個塊的dentry中新建了一個文件test.txt。
  5. 然後在最開始掃描占用的inode號給到此test.txt文件。

當要存數據給test.txt文件時,會進行如下:

系統掃描塊位圖(加速查找磁盤空閑塊,記錄是否空閑等),找到空閑塊,分配大於數據大小的塊,最後再回收(避免磁盤碎片)。比如要創建10k大小的test.txt文件,一個塊4k,只需要3個塊,系統分配4個或者多於,最後再去把這多余的塊分配到空閑塊中等待使用。

刪除

當要刪除一個文件時,其實就是把其使用的block位圖標記為空閑,inode位圖的相關位置成空,相當於不被占用,系統就認為此文件刪除。但是數據還在,在下次創建文件時,就可覆蓋原已清空block位圖和inode位圖的文件的數據。

文件粉粹也只是使用一些隨機數據填充進原來文件的數據塊中,導致文件難以恢復。

以上

Linux下對inode和塊的理解