inode - Wikiwand
For faster navigation, this Iframe is preloading the Wikiwand page for inode.

inode

維基百科,自由的百科全書

此條目需要補充更多來源。 (2018年8月9日)請協助添加多方面可靠來源以改善這篇條目,無法查證的內容可能會因為異議提出而移除。

inode(index node)是指在許多「類Unix檔案系統」中的一種資料結構,用於描述 檔案系統物件(包括檔案目錄裝置檔案socket管道, 等等)。每個inode儲存了 檔案系統物件資料 的屬性和磁碟塊位置[1]檔案系統物件屬性 包含了各種元資料(如:最後修改時間[2]) ,也包含用戶組(owner )和權限資料[3]

資料夾是inode的名字。一個資料夾包含自身節點,父節點和每個子節點。

命名

Unix先驅丹尼斯·里奇[4],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自身被修改(ctime, inode change time)、檔案內容被修改(mtime, modification time)、最後一次存取(atime, access 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與舊函式庫檔案會被系統自動回收。

實際考慮

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

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

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

參考文獻

  1. ^ Tanenbaum, Andrew S. Modern Operating Systems 3rd. : 279. 
  2. ^ JVSANTEN. Difference between mtime, ctime and atime - Linux Howtos and FAQs. Linux Howtos and FAQs. 
  3. ^ Anatomy of the Linux virtual file system switch. ibm.com. 
  4. ^ Linux Kernel list archive. Retrieved on 2011-01-12.

外部連結

{{bottomLinkPreText}} {{bottomLinkText}}
inode
Listen to this article