inode
此條目需要補充更多來源。 (2018年8月9日) |
inode (index node)是指在許多「類Unix檔案系統」中的一種數據結構,用於描述檔案系統對象(包括檔案、目錄、裝置檔案、socket、管道等)。每個inode儲存了檔案系統對象數據的屬性和磁碟塊位置[1]。檔案系統對象屬性包含了各種元數據(如:最後修改時間[2]) ,也包含用戶組(owner)和權限數據[3]。
命名
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 標準強制規範的檔案系統的行為受到傳統 UNIX 檔案系統的深刻影響。可以用短語「檔案序列號」來形容inode,定義為檔案系統範圍的唯一檔案識別碼。[6]上述的檔案序列號和包含此檔案的裝置ID一起,在整個系統上對應唯一的檔案。[7]
在POSIX系統上,可使用stat
系統呼叫取得檔案的下列屬性:[7]
- 以位元組為單位表示的檔案大小。
- 裝置ID,標識容納該檔案的裝置。
- 檔案所有者的User ID。
- 檔案的Group ID
- 檔案的模式(mode),確定了檔案的類型,以及它的所有者、它的group、其它用戶訪問此檔案的權限。
- 額外的系統與用戶標誌(flag),用來保護該檔案。
- 3個時間戳,記錄了inode自身被修改(ctime, inode change time)、檔案內容被修改(mtime, modification time)、最後一次訪問(atime, access time)的時間。
- 1個連結數,表示有多少個硬連結指向此inode。
- 到檔案系統儲存位置的指標。通常是1K位元組或者2K位元組的儲存容量為基本單位。
可以查詢一個檔案的inode號碼及一些元資訊。
推論
- 一個檔案系統對象可以有多個名字,這些具有硬連結關係的檔案系統對象名字具有相同的inode號碼,彼此是平等的。即首個被建立的檔案並沒有特殊的地位。這與符號連結不同。一個符號連結檔案有自己的inode,符號連結檔案的內容是它所指向的檔案的名字。因此刪除符號連結所指向的檔案,將導致這個符號連結檔案在訪問時報錯。
- 刪除一個檔案或目錄,實際上是把它的inode的連結數減1。這並不影響指向此inode的別的硬連結。
- 一個inode如果沒有硬連結,此時inode的連結數為0,檔案系統將回收該inode所指向的儲存塊,並回收該inode自身。
- 從一個inode,通常是無法確定是用哪個檔名查到此inode號碼的。打開一個檔案後,作業系統實際上就拋掉了檔名,只保留了inode號碼來訪問檔案的內容。函數庫函數getcwd()用來查詢當前工作目錄的絕對路徑名。其實現是從當前工作目錄的inode逐級尋找其上級目錄的inode,最後拼出整個絕對路徑的名字。
- 歷史上,對目錄的硬連結是可能的。這可以使目錄結構成為一個有向圖,而不是通常的目錄樹的有向無環圖。一個目錄甚至可以是自身的父目錄。現代檔案系統一般禁止這些混淆狀態,只有根目錄保持了特例:根目錄是自身的父目錄。這項限制最著名的一個例外可在Mac OS X(10.5或更高版本)上找到:它允許超級用戶建立目錄的硬連結。[8]
- 一個檔案或目錄在檔案系統內部移動時,其inode號碼不變。檔案系統碎片整理可能會改變一個檔案的物理儲存位置,但其inode號碼不變。非UNIX的FAT及其衍生的檔案系統是無法實現inode不變這一特點。
- inode檔案系統中安裝新函數庫十分容易。當一些行程正在使用一個函數庫時,其它行程可以替換該函數庫檔案名字的inode號碼指向新建立的inode,隨後對該函數庫的訪問都被自動引導到新inode所指向的新的函數庫檔案的內容。這減少了替換函數庫時重新啟動系統的需要。而舊的inode的連結數已經為0,在使用舊函數庫的行程結束後,舊的inode與舊函數庫檔案會被系統自動回收。
- 一些檔案系統,由於inode表在檔案系統建立時就已經確定並且不能再動態增加,新增的檔案數量可能會用盡inode。這導致檔案系統還有空閒的儲存空間,但已經沒有空閒的inode可供使用了。例如,一個電子郵件伺服器可能會被大量的小檔案用盡所有inode,但是卻沒有填滿檔案儲存空間。部分檔案系統,如JFS和XFS,能夠動態地增加inode,因此不會用盡inode。
實際考慮
系統管理員使用的很多程式往往用inode號碼來替代檔名來訪問檔案系統。例如磁碟完整性檢查程式fsck
或pfiles
。因此,inode號碼與檔案全路徑名的互查是需要的。可以用find
帶參數選項-inum
,ls
帶參數選項(-i
做到。
參考文獻
- ^ Tanenbaum, Andrew S. Modern Operating Systems 3rd. : 279.
- ^ JVSANTEN. Difference between mtime, ctime and atime - Linux Howtos and FAQs. Linux Howtos and FAQs. [2020-01-20]. (原始內容存檔於2020-09-21).
- ^ Anatomy of the Linux virtual file system switch. ibm.com. [2020-01-20]. (原始內容存檔於2018-10-02).
- ^ Linux Kernel list archive (頁面存檔備份,存於互聯網檔案館). Retrieved on 2011-01-12.
- ^ Bach, Maurice J. The Design of the UNIX Operating System. Prentice Hall. 1986: 94. Bibcode:1986duos.book.....B.
- ^ Definitions - 3.176 File Serial Number. The Open Group. [10 January 2018]. (原始內容存檔於2013-04-29).
- ^ 7.0 7.1 <sys/stat.h>. The Open Group. [15 January 2018]. (原始內容存檔於2022-01-30).
- ^ What is the Unix command to create a hardlink to a directory in OS X?. Stack Overflow. 16 Jan 2011 [5 Jan 2020]. (原始內容存檔於5 January 2020).