Linux 文件系統 -- inode 筆記


什么是 inode

inode 的定義:Unix 文件系統中的一種數據結構,用來存儲文件的元信息數據
 
文件在硬盤中的存儲是以"塊"(block)為單位的,常見的塊大小是 4k
一個稍微大一點的文件則會存儲在多個塊中,那么如何快速訪問到這些數據呢?答案就是 inode
 
在文件系統中,每個文件對象都對應着一個 inode,其中存儲着常用的一些信息(所有者、創建時間、修改時間、文件權限、對應文件對象在系統中存儲塊的位置等等)
操作系統訪問一個文件時分為三個步驟:

  1. 通過文件名找到對應的 inode 編號
  2. 通過 inode 編號訪問對應文件對象的元信息
  3. 根據元信息找到文件對應的 block,讀取數據

從上面的描述可以看出,inode 實際上就是文件系統中的一種索引,便於管理文件以及快速訪問數據

關於 inode 的一些細節

inode 的內容

POSIX 標准定義了 inode 所包含的信息:

  • 以字節為單位表示的文件大小
  • 設備ID,標識容納該文件的設備
  • 文件所有者的 User ID
  • 文件的 Group ID
  • 文件的模式(mode),確定了文件的類型,以及它的所有者、它的 group、其它用戶訪問此文件的權限
  • 額外的系統與用戶標志(flag),用來保護該文件
  • 3 個時間戳,記錄了 inode 自身被修改(ctime, inode change time)、文件內容被修改(mtime, modification time)、最后一次訪問(atime, access time)的時間
  • 1 個鏈接數,表示有多少個硬鏈接指向此inode
  • 指向文件系統存儲位置的指針

使用 stat 命令可以查詢一個文件的 inode 編號及對應的文件元信息:

inode 的存儲

inode 存儲文件對象的元信息,也會占用一部分磁盤空間
當文件系統創建(格式化)時,會把存儲區域分為兩大連續的區域,其中一個用來保存 inode,稱為 inode table,每個 inode 默認 128 or 256 字節
另一塊區域則用來保存文件的數據塊

從這里可以看出,一個文件系統中 inode 的數量在初始化時確定了,inode 的數量和磁盤大小成正比

查看每個硬盤分區的 inode 總數和已經使用的數量,可以使用 df 命令:

由於每個文件都會對應一個 inode,當磁盤中存在大量小文件時,就可能出現磁盤空間有空閑但是 inode 用完的情況
例如一個電子郵件服務器可能會存在大量 eml 文件使磁盤 inode 耗盡,無法入信新郵件
所以一般大型的郵件系統都會設計自己的文件系統來存儲郵件數據,如使用信桶(mbox)文件結構來存儲單個用戶的所有郵件數據

目錄文件、硬鏈接和軟鏈接

Linux 中一切皆文件,目錄也是文件的一種,每個目錄項包含兩部分:目錄中所有文件的文件名、所有文件名對應的 inode 編號
使用 ls -i 命令查看目錄的內容:

如果想要查看該目錄下文件的詳細信息,那么就需要根據每個文件的 inode 編號,找到對應的 inode 訪問元信息:

 
上述 inode 中包含的信息中,可以發現並不存在文件名這一信息,實際上在 Unix 環境下,一個文件對象可以對應多個文件名,即硬鏈接(hard link)
 
使用 ln 命令可以創建硬鏈接:

ln 源文件 目標文件


上圖中 f1.txt f2.txt 都指向同一個 inode,修改其中一個文件內容會影響到另一個
從 inode 內容中可以發現有一個鏈接數,當我們創建了一個硬鏈接時,所對應的文件的 inode 中鏈接數就會 +1,表示其對應的文件名(引用計數)+1
同理,當刪除一個文件后,該鏈接數將 -1,鏈接數為 0 時文件數據就被完全清除了

 
與硬鏈接對應的還有軟鏈接,使用 ln -s 命令可以創建軟鏈接:

ln -s 源文文件或目錄 目標文件或目錄


軟鏈接和硬鏈接的區別在於,軟鏈接指向其鏈接的文件名,而不是 inode,一個軟鏈接有自己的 inode
刪除其指向的文件后,該軟鏈接則不可訪問(No such file or directory)
 
這里的設計類似於 C++ 中指針和引用,硬鏈接可以類比為引用,而軟鏈接則是指針,其中保存着文件名(訪問文件數據的地址)
而 inode 鏈接數則和智能指針的引用計數設計思路相似,不得不說計算機系統中很多設計都有共通性

inode 的其他作用

由於硬鏈接的存在,文件名和 inode 是多對一的關系,操作系統打開一個文件后就拋棄了文件名,只保留 inode 編號來訪問文件內容
庫函數 getcwd() 的實現,就是從當前工作目錄的 inode 逐級查找上級目錄的 inode,最后拼出完整的絕對路徑
 
inode 的設計,使得在操作系統中安裝/更換新的庫文件十分方便
當一些進程還在使用庫時,其他進程可以替換該庫文件 inode 編號指向新創建的 inode,后面對該庫的訪問都被引導至新庫文件的內容,減少了替換庫時重啟系統的必要
由於舊的 inode 中鏈接數已經為 0,在使用舊庫的進程結束后,舊的 inode 和舊庫文件將被文件系統自動回收


參考文獻

理解inode -- 阮一峰的網絡日志
inode -- wikipedia


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM