1. 程式人生 > >hjimmy 的文件: inode 介紹(來自維基百科)

hjimmy 的文件: inode 介紹(來自維基百科)

inode是指在許多“類Unix檔案系統”中的一種資料結構。每個inode儲存了檔案系統中的一個檔案系統物件(包括檔案目錄裝置檔案socket管道, 等等)的元資訊資料,但不包括資料內容或者檔名[1]

目錄

  [隱藏

命名[編輯]

Unix先驅丹尼斯·裡奇[2],inode這個命名的來源可能是檔案系統的儲存組織為一個扁平陣列,分層目錄資訊使用一個數作為檔案系統這個扁平陣列的索引值(index)。

細節[編輯]

檔案系統建立(格式化)時,就把儲存區域分為兩大連續的儲存區域。一個用來儲存檔案系統物件的元資訊資料,這是由inode組成的表,每個inode預設是256位元組或者128位元組。另一個用來儲存“檔案系統物件”的內容資料,劃分為512位元組的扇區,以及由8個扇區組成的4K位元組的塊。塊是讀寫時的基本單位。一個檔案系統的inode的總數是固定的。這限制了該檔案系統所能儲存的檔案系統物件的總數目。典型的實現下,所有inode佔用了檔案系統1%左右的儲存容量。

檔案系統中每個“檔案系統物件”對應一個“inode”資料,並用一個整數值來辨識。這個整數常被稱為inode號碼(“i-number”或“inode number”)。由於檔案系統的inode表的儲存位置、總條目數量都是固定的,因此可以用inode號碼去索引查詢inode表。

Inode儲存了檔案系統物件的一些元資訊,如所有者、訪問許可權(讀、寫、執行)、型別(是檔案還是目錄)、內容修改時間、inode修改時間、上次訪問時間、對應的檔案系統儲存塊的地址,等等。知道了1個檔案的inode號碼,就可以在inode元資料中查出檔案內容資料的儲存地址。

檔名與目錄名是“檔案系統物件”便於使用的別名。一個檔案系統物件可以有多個別名,但只能有一個inode,並用這個inode來索引檔案系統物件的儲存位置。

  • inode不包含檔名或目錄名的字串,只包含檔案或目錄的“元資訊”。
  • Unix的檔案系統的目錄也是一種檔案。開啟目錄,實際上就是讀取“目錄檔案”。目錄檔案的結構是一系列目錄項(dirent)的列表。每個目錄項,由兩部分組成:所包含檔案或目錄的名字,以及該檔案或目錄名對應的inode號碼。
  • 檔案系統中的一個檔案是指存放在其所屬目錄的“目錄檔案”中的一個目錄項,其所對應的inode的類別為“檔案”;檔案系統中的一個目錄是指存放在其“父目錄檔案”中的一個目錄項,其所對應的inode的類別為“目錄”。可見,多個“檔案”可以對應同一個inode;多個“目錄”可以對應同一個inode。
  • 檔案系統中如果兩個檔案或者兩個目錄具有相同的inode號碼,那麼就稱它們是“硬連結”關係。實際上都是這個inode的別名。換句話說,一個inode對應的所有檔案(或目錄)中的每一個,都對應著檔案系統某個“目錄檔案”中唯一的一個目錄項。
  • 建立一個目錄時,實際做了3件事:在其“父目錄檔案”中增加一個條目;分配一個inode;再分配一個儲存塊,用來儲存當前被建立目錄包含的檔案與子目錄。被建立的“目錄檔案”中自動生成兩個子目錄的條目,名稱分別是:“.”和“..”。前者與該目錄具有相同的inode號碼,因此是該目錄的一個“硬連結”。後者的inode號碼就是該目錄的父目錄的inode號碼。所以,任何一個目錄的"硬連結"總數,總是等於它的子目錄總數(含隱藏目錄)加2。即每個“子目錄檔案”中的“..”條目,加上它自身的“目錄檔案”中的“.”條目,再加上“父目錄檔案”中的對應該目錄的條目。
  • 通過檔名開啟檔案,實際上是分成三步實現:首先,作業系統找到這個檔名對應的inode號碼;其次,通過inode號碼,獲取inode資訊;最後,根據inode資訊,找到檔案資料所在的block,讀出資料。

Linux系統使用struct inode作為資料結構名稱。BSD派生的系統,使用vnode名稱,其中v表示“virtual file system”。

POSIX inode[編輯]

POSIX標準強制規範了檔案系統的行為。每個“檔案系統物件”必須具有:

  • 位元組為單位表示的檔案大小。
  • 裝置ID,標識容納該檔案的裝置。
  • 檔案所有者的User ID。
  • 檔案的Group ID
  • 檔案的模式(mode),確定了檔案的型別,以及它的所有者、它的group、其它使用者訪問此檔案的許可權。
  • 額外的系統與使用者標誌(flag),用來保護該檔案。
  • 3個時間戳,記錄了inode自身被修改(ctimeinode change time)、檔案內容被修改(mtimemodification time)、最後一次訪問(atimeaccess time)的時間。
  • 1個連結數,表示有多少個硬連結指向此inode。
  • 檔案系統儲存位置的指標。通常是1K位元組或者2K位元組的儲存容量為基本單位。

使用stat系統呼叫可以查詢一個檔案的inode號碼及一些元資訊。

推論[編輯]

  • 一個檔案系統物件可以有多個名字,這些具有硬連結關係的檔案系統物件名字具有相同的inode號碼,彼此是平等的。即首個被建立的檔案並沒有特殊的地位。這與符號連結不同。一個符號連結檔案有自己的inode,符號連結檔案的內容是它所指向的檔案的名字。因此刪除符號連結所指向的檔案,將導致這個符號連結檔案在訪問時報錯。
  • 刪除一個檔案或目錄,實際上是把它的inode的連結數減1。這並不影響指向此inode的別的硬連結。
  • 一個inode如果沒有硬連結,此時inode的連結數為0,檔案系統將回收該inode所指向的儲存塊,並回收該inode自身。
  • 從一個inode,通常是無法確定是用哪個檔名查到此inode號碼的。開啟一個檔案後,作業系統實際上就拋掉了檔名,只保留了inode號碼來訪問檔案的內容。庫函式getcwd()用來查詢當前工作目錄的絕對路徑名。其實現是從當前工作目錄的inode逐級查詢其上級目錄的inode,最後拼出整個絕對路徑的名字。
  • 歷史上,對目錄的硬連結是可能的。這可以使目錄結構成為一個有向圖,而不是通常的目錄樹的有向無環圖。一個目錄甚至可以是自身的父目錄。現代檔案系統一般禁止這些混淆狀態,只有根目錄保持了特例:根目錄是自身的父目錄。ls /..就是根目錄的內容。
  • 一個檔案或目錄在檔案系統內部移動時,其inode號碼不變。檔案系統碎片整理可能會改變一個檔案的物理儲存位置,但其inode號碼不變。非UNIX的FAT及其衍生的檔案系統是無法實現inode不變這一特點。
  • inode檔案系統中安裝新庫十分容易。當一些程序正在使用一個庫時,其它程序可以替換該庫檔名字的inode號碼指向新建立的inode,隨後對該庫的訪問都被自動引導到新inode所指向的新的庫檔案的內容。這減少了替換庫時重啟系統的需要。而老的inode的連結數已經為0,在使用老庫的程序結束後,老的inode與老庫檔案會被系統自動回收。
  • stat查詢、顯示一個檔名所對應的inode的元資訊資料。
  • 檢視檔案系統的inode總數和已經使用的數量,可以使用df -i
  • 檢視inode自身佔用位元組數量,可以用sudo dumpe2fs -h /dev/hda | grep "Inode size"

實際考慮[編輯]

系統管理員使用的很多程式往往用inode號碼來替代檔名來訪問檔案系統。例如磁碟完整性檢查程式fsck或。因此,inode號碼與檔案全路徑名的互查是需要的。可以用find帶引數選項-inumls帶引數選項(-i做到。

檔案系統可能會用盡inode。這導致檔案系統還有空閒的儲存空間,但已經沒有空閒的inode可供使用了。例如,一個電子郵件伺服器可能會被大量的小檔案用盡所有inode,但是卻沒有填滿檔案儲存空間。

現代的檔案系統如JFS和XFS能夠動態地增加inode,因此不會用盡inode。

參考文獻[編輯]

  1. ^ Inode Definition. The Linux Information Project. September 15, 2006 [2010-01-12].

外部連結[編輯]