簡介
inode 是 UNIX 操作系統中的一種數據結構,它包含了與文件系統中各個文件相關的一些重要信息。在 UNIX 中創建文件系統時,同時將會創建大量的 inode 。通常,文件系統磁盤空間中大約百分之一空間分配給了 inode 表。 有時,人們使用了一些不同的術語,如 inode 和索引編號 (inumber)。這兩個術語非常相似,並且相互關聯,但它們所指的並不是同樣的概念。inode 指的是數據結構;而索引編號實際上是 inode 的標識編號,因此也稱其爲inode 編號 或者索引編號。索引編號只是文件相關信息中一項重要的內容。下一個部分將介紹 inode 中的其他一些屬性。 inode 表包含一份清單,其中列出了對應文件系統的所有 inode 編號。當用戶搜索或者訪問一個文件時,UNIX 系統通過 inode 表查找正確的 inode 編號。在找到 inode 編號之後,相關的命令纔可以訪問該 inode ,並對其進行適當的更改。 例如,使用 vi 來編輯一個文件。當您鍵入 vi <filename> 時,在 inode 表中找到 inode 編號之後,才允許您打開該 inode 。在 vi 的編輯會話期間,更改了該 inode 中的某些屬性,當您完成操作並鍵入 :wq 時,將關閉並釋放該 inode 。通過這種方式,如果兩個用戶試圖對同一個文件進行編輯, inode 已經在第一個編輯會話期間分配給了另一個用戶 ID (UID),因此第二個編輯任務就必須等待,直到該 inode 釋放爲止。inode 的結構
對於經驗豐富的 UNIX 開發人員或者管理員來說, inode 的結構相對比較簡單,但是可能還有一些您尚不瞭解的、令人驚訝的有關 inode 的內幕。下面的定義僅給出了 inode 中所包含的、UNIX 用戶經常使用的一些重要信息: ● inode 編號 ● 用來識別文件類型,以及用於 stat C 函數的模式信息 ● 文件的鏈接數目 ● 屬主的 UID ● 屬主的組 ID (GID) ● 文件的大小 ● 文件所使用的磁盤塊的實際數目 ● 最近一次修改的時間 ● 最近一次訪問的時間 ● 最近一次更改的時間 從根本上講, inode 中包含有關文件的所有信息(除了文件的實際名稱以及實際數據內容之外)。可以在 AIX 的 Header 文件 /usr/include/jf/ino.h 中、或者 Web 頁面 中可以找到完整的 inode 結構。 以上所列舉的信息對於文件來說非常重要,並且在 UNIX 中頻繁使用。如果沒有這些信息,那麼文件將被認爲遭到破壞和不可用。 與其他的操作系統相比,UNIX 系統中的目錄和文件可能看起來有所不同,但事實並非如此。在 UNIX 中,目錄本身就是文件,只是在它們的 inode 中使用了一些附加的設置。目錄 本質上就是一個包含了其他文件的文件。另外,其模式信息中設置了一些相應的標誌,以告知系統該文件實際上是一個目錄。使用 inode
瞭解如何在 UNIX 中使用 inode 可以節約大量的時間,並提高工作效率。在尚未了解 inode 之前,您可以使用下面的命令,以減少可能碰到的問題。 df 命令 如前所述,當您在 UNIX 中創建一個文件系統時,將爲 inode 表分配大約百分之一的總磁盤空間。每次在文件系統中創建一個文件時,都會爲該文件分配一個 inode 。通常,與一個文件系統相關聯的 inode 的數目足夠多,但耗盡 inode 的可能性始終存在。要監視是否發生了這種情況,您可以觀察 df 的輸出。 使用 df 命令,您可以查看所有已掛載的文件系統或者特定的文件系統。在該命令的輸出中,您可以查看各個文件系統中已使用的 inode 的數目,以及文件系統中總體使用情況百分比,如清單 1 中所示。 清單 1. 使用 df 來監視 inode 的使用# df -k|head -6 Filesystem 1024-blocks Free %Used Iused %Iused Mounted on /dev/hd4 229376 138436 40% 4730 13% / /dev/hd2 8028160 962692 89% 110034 33% /usr /dev/hd9var 1835008 366400 81% 25829 24% /var /dev/hd3 524288 523564 1% 98 1% /tmp /dev/hd1 32768 32416 2% 5 1% /home |
# istat /usr/bin/ksh Inode 18150 on device 10/8 File Protection: r-xr-xr-x Owner: 2(bin) Group: 2(bin) Link count: 5 Length 237804 bytes Last updated: Wed Oct 24 17:37:10 EDT 2007 Last modified: Wed Apr 18 23:58:06 EDT 2007 Last accessed: Mon Apr 28 11:25:35 EDT 2008 |
# df /usr/binFilesystem 512-blocks Free %Used Iused %Iused Mounted on/dev/hd2 16056320 1925384 89% 110034 33% /usr |
# istat 18150 /dev/hd2 Inode 18150 on device 10/8 File Protection: r-xr-xr-x Owner: 2(bin) Group: 2(bin) Link count: 5 Length 237804 bytes Last updated: Wed Oct 24 17:37:10 EDT 2007 Last modified: Wed Apr 18 23:58:06 EDT 2007 Last accessed: Mon Apr 28 11:44:20 EDT 2008 Block pointers (hexadecimal): 11620 ef8c0 |
# stat /bin/bash File: `/bin/bash' Size: 722684 Blocks: 1432 IO Block: 4096 regular fileDevice: fd00h/64768d Inode: 12799859 Links: 1Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2008-04-06 19:13:50.000000000 -0400Modify: 2006-07-12 03:11:53.000000000 -0400Change: 2007-11-22 04:05:30.000000000 -0500 |
# ls - -- -p fileA fileB fileC fileDfileE fileF fileG fileH fileI fileJ fileK fileL |
# ls –i 38988 38991 -p 38984 fileC 38982 fileF 38977 fileI 38978 fileL 38989 - 38980 fileA 38986 fileD 38983 fileG 38987 fileJ 38990 -- 38979 fileB 38976 fileE 38985 fileH 38981 fileK |
# find . -inum 38988 -exec rm {} \; |
# find . -inum 38989 -exec mv {} fileM \; |
# ls -i38990 -- 38979 fileB 38976 fileE 38985 fileH 38981 fileK38991 -p 38984 fileC 38982 fileF 38977 fileI 38978 fileL38980 fileA 38986 fileD 38983 fileG 38987 fileJ 38989 fileM |
# fsck –p /dev/hd1 –y |