inode
編輯inode(英文index node,讀作“eye-node”)是類Unix操作系統管理文件系統的基本數據結構。 每個 inode 在文件系統中由其 inode 編號xxx標識。 目錄中的每個名稱條目都指向一個索引節點。 這包含文件的元數據,指的是文件的數據或目錄的文件列表。
應用軟件在讀取或寫入數據時不再區分設備驅動程序和常規文件。 由于 inode 概念,在 Unix 變體中一切都被視為文件(“在 UNIX 系統上,說一切都是文件是相當安全的……”;請參閱一切都是文件)。 因此,此類操作系統在數據存儲管理方面不同于其他系統,例如使用 NTFS 的 Windows,但也不同于 VMS 或 MVS。
基礎知識
編輯如果在計算機上保存文件,不僅要保存文件內容(用戶數據),還要保存文件創建時間或文件所有者等元數據。 同時,計算機必須能夠有效地將相應的用戶數據和元數據分配給一個文件名——包括文件路徑。這種數據如何組織和存儲在數據載體上的規范稱為文件系統。 根據應用程序和操作系統的不同,存在不同的文件系統。 文件系統規范由驅動程序實現,驅動程序既可以作為操作系統核心(內核)的內核模塊來實現,也可以作為用戶空間中的普通程序實現,這種情況很少見。
類 Unix 操作系統(例如 Linux 和 macOS)的文件系統使用所謂的 inode。 這些包含元數據和對用戶數據存儲位置的引用。索引節點的大小、數量和位置存儲在文件系統中的一個特殊位置,即超級塊。 inode 被編號并存儲在磁盤上的一個片段中。 文件系統的根目錄有一個固定的索引節點號。 子文件夾是“普通”文件,其中包含它們包含的文件列表以及作為用戶數據的關聯 inode 編號的分配。
例如,如果要打開文件/bin/ls,則簡化如下:
- 文件系統驅動程序讀取超級塊。 這告訴他 inode 的起始位置及其長度。 所以現在可以找到并讀取任何 inode。
- 現在根目錄的索引節點將被打開。 由于這是一個文件夾,它包含一個指針,指向它包含的所有文件列表的位置,以及它們的 inode 編號。 搜索bin目錄。
- 現在可以讀取bin目錄的inode,類似于上一步,可以找到ls文件的inode。
- 因為 ls 文件是一個常規文件,而不是一個目錄,它的索引節點現在包含對所需數據位置的引用。
inode結構
編輯恰好一個 inode 分配給每個單獨的名稱,由斜杠 /(斜杠)分隔。 這將保存有關文件的以下元信息,但不保存實際名稱:
- 文件類型(常規文件、目錄、符號鏈接……),見下文;
- 所有者(UID、用戶id)和組(GID、組id)的數字標識符;
- 所有者(用戶)、組(組)和所有其他人(其他)的訪問權限;經典用戶和權限管理是通過程序 chown(更改所有者)、chgrp(更改組)和 chmod(更改模式)。 訪問控制列表 (ACL) 可實現更精細的權限分配。
- 文件的不同時間:創建、訪問(訪問時間,atime)和最后修改(修改時間,mtime);
- inode最后一次狀態變化的時間(status,ctime);
- 文件的大小;
- 鏈接計數器(見下文);
- 對存儲實際數據的塊的一個或多個引用。
普通文件
常規文件既是用戶數據又是可執行程序。 后者由可執行權限標識,并在調用時由系統在單獨的進程中啟動。 不僅編譯的程序被認為是“可執行的”,而且 shebang 指定要使用的解釋器的腳本也被認為是“可執行的”。 對于“稀疏文件”,即所謂的稀疏文件,邏輯大小與數據塊實際占用的硬盤空間不同。
目錄
目錄是其“文件內容”是從 en 的表格列表中選擇的文件包含的文件。 該表包含一個包含文件名的列和一個包含關聯 inode 編號的列。 對于某些文件系統,該表包含附加信息。 這樣,ext4也把所有包含文件的文件類型保存在里面,這樣在列出一個目錄的內容時就不用從所有文件的inode中讀取了,每個目錄總有一個條目。 和 .. 作為對當前目錄或父目錄的引用。
硬鏈接和符號鏈接
符號鏈接是特殊文件,包含鏈接指向的文件路徑,而不是數據。 根據文件系統和文件路徑的長度,鏈接要么直接存儲在 inode 中,要么存儲在 inode 指向的數據塊中。
另一方面,硬鏈接不是特殊文件。 硬鏈接是指從不同目錄或不同文件多次引用 inode。 所有對 inode 的引用(鏈接)都是等價的; 所以沒有原創。 在 inode 中,鏈接計數表示有多少文件名引用了它。 創建文件后,它為 1,一旦為此文件創建了更多硬鏈接,它就會增加。 對于一個目錄,它比它包含的子文件夾的數量多兩個,因為在上面文件夾中的條目旁邊和條目“。” 在該文件夾中,所有子文件夾中的條目“..”都引用它。如果刪除一個文件,則其條目將從更高級別的目錄中刪除,鏈接計數器減一。 如果此時鏈接計數器為 0,則可能需要等到文件不再被任何程序打開,然后才釋放內存空間。
其他類型的文件
除了這些常用文件外,還有其他文件類型:
數據引用
編輯在較舊的文件系統中,索引節點通常包含有限數量的數據塊條目,文件的用戶數據位于這些數據塊中。 由于 inode 中的條目數會嚴重限制文件大小,因此對于較大的文件,對數據塊的引用存儲在 inode 中,其中存儲具有對數據塊的引用的列表而不是用戶數據。 從理論上講,這個原則可以以任何嵌套方式重復。
作為替代方案,更現代的文件系統具有所謂的范圍,在這種情況下,inode 中僅存儲數據塊的連續區域的xxx個和最后一個塊的編號。 如果文件沒有分片,不管文件大小,只需要保存兩個塊ID:xxx個數據塊的編號和最后一個數據塊的編號。
例子
對于 ext2 文件系統,inode 的大小默認為 128 字節。 在其中,一個常規文件的最多 12 個條目每個都引用存儲實際內容的數據塊。 如果這 12 個塊還不夠,則 inode 中的一個條目指向一個簇,然后該簇包含對實際數據簇的引用。 這樣的引用稱為單個間接塊。 最多可以使用三重間接塊,因此xxx文件大小范圍為 16 GiB 到 4 TiB,具體取決于塊大小。
一個 inode 結構的例子,在直接尋址的數據塊中有 12KiB,在間接尋址的數據塊/簇中大約有 1600 萬 KiB + 65536KiB + 256KiB,每個大小為 1 KiB:
引用塊中的 256 個條目是由于 1KiB 塊可以包含恰好 256 個長度為 4 字節(32 位地址空間)的地址。
inode練習
編輯可以使用 ls -i filename 命令顯示文件的 inode 號,find 程序提供了 -inum 選項來搜索具有特定 inode 號的文件。
可以使用 stat 命令查看 inode 中存儲的元數據。 debugfs 工具知道 stat 命令來顯示 inode 中存儲的數據。
在某些文件系統中,可能的 inode 數量以及可能的文件數量是有限的; 如果達到xxx數量,則無法創建更多文件。 創建ext2/ext3/ext4文件系統時可以設置inode數量。 對于包含大量小文件的數據載體,格式化時必須注意選擇足夠多的 inode。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/358180/