簡介
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 釋放為止。
結構
對於經驗豐富的 UNIX 開發人員或者管理員來說, inode 的結構相對比較簡單,但是可能還有一些您尚不了解的、令人驚訝的有關 inode 的內幕。下面的定義僅給出了 inode 中所包含的、UNIX 用戶經常使用的一些重要信息:
● inode 編號
● 用來識別檔案類型,以及用於 stat C 函式的模式信息
● 檔案的連結數目
● 屬主的ID (UID)
● 屬主的組 ID (GID)
● 檔案的大小
● 檔案所使用的磁碟塊的實際數目
● 最近一次修改的時間
● 最近一次訪問的時間
● 最近一次更改的時間
從根本上講, inode 中包含有關檔案的所有信息(除了檔案的實際名稱以及實際數據內容之外)。可以在 AIX 的 Header 檔案 /usr/include/jf/ino.h 中、或者 Web 頁面 中可以找到完整的 inode 結構。
以上所列舉的信息對於檔案來說非常重要,並且在 UNIX 中頻繁使用。如果沒有這些信息,那么檔案將被認為遭到破壞和不可用。
與其他的作業系統相比,UNIX 系統中的目錄和檔案可能看起來有所不同,但事實並非如此。在 UNIX 中,目錄本身就是檔案,只是在它們的 inode 中使用了一些附加的設定。目錄 本質上就是一個包含了其他檔案的檔案。另外,其模式信息中設定了一些相應的標誌,以告知系統該檔案實際上是一個目錄。
使用
了解如何在 UNIX 中使用 inode 可以節約大量的時間,並提高工作效率。在尚未了解 inode 之前,您可以使用下面的命令,以減少可能碰到的問題。
df 命令
如前所述,當您在 UNIX 中創建一個檔案系統時,將為 inode 表分配大約百分之一的總磁碟空間。每次在檔案系統中創建一個檔案時,都會為該檔案分配一個 inode 。通常,與一個檔案系統相關聯的 inode 的數目足夠多,但耗盡 inode 的可能性始終存在。要監視是否發生了這種情況,您可以觀察 df 的輸出。
使用 df 命令,您可以查看所有已掛載的檔案系統或者特定的檔案系統。在該命令的輸出中,您可以查看各個檔案系統中已使用的 inode 的數目,以及檔案系統中總體使用情況百分比,如清單 1 中所示。
清單 1. 使用 df 來監視 inode 的使用
# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda2 1036320 147459 888861 15% / tmpfs 254955 6 254949 1% /dev/shm /dev/sda1 76912 38 76874 1% /boot |
如果由於某種原因,某個檔案系統 inode 的使用率達到百分之百,那么您將無法在該檔案系統中創建更多的檔案、設備、目錄等等。對於這種情況,一種解決方案是通過 smitty chfs 命令為該檔案系統添加更多的空間,如圖 1 所示。另一種解決方案是創建較小的 inode 區段。現在,在增強的日誌檔案系統 (Enhanced Journal File System) 中,IBM AIX 5L 允許 inode 區段小於 16KB 的預設大小。請記住,如果您在 AIX 5L 中使用這個選項,那么將無法從較早版本的 AIX 訪問該檔案系統。
圖 1. smitty chfs 命令的結果
istat 和 stat 在 AIX 中檢查 inode 的一種快捷的方式是使用 istat 命令。使用這個命令,您可以找到特定檔案的索引編號,以及其他的 inode 項目,如許可權、檔案類型、UID、GID、連結的數目(非
符號連結)、檔案大小和最近一次更新、最近一次修改以及最近一次訪問的
時間戳。
清單 2 顯示了 AIX 中檔案 /usr/bin/ksh 的 inode 信息。
清單 2. /usr/bin/ksh 的 inode 信息
# 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 |
除了顯示來自 istat 的標準信息之外,現在您還知道了 /usr/bin/ksh 對應的索引編號。如果您同時還找到了該檔案所處的邏輯卷,那么甚至可以顯示更多的信息。要查找該信息,一種方式是通過使用 df 命令來查看該檔案位於哪個已掛載的檔案系統中:
# df /usr/binFilesystem 512-blocks Free %Used Iused %Iused Mounted on/dev/hd2 16056320 1925384 89% 110034 33% /usr |
檔案 /usr/bin/ksh 位於目錄 /usr/bin 中。查看 df 命令的輸出,您可以發現,目錄 /usr/bin 包含於 /usr 檔案系統中,並且 /usr 檔案系統位於邏輯卷 /dev/hd2 之中。現在,您已經知道了索引編號和邏輯卷的名稱,那么就可以將這兩個信息項作為參數來使用 istat,這樣一來,您可以確定組成該檔案的磁碟塊的十六進制地址,如清單 3 中所示。
清單 3. 確定檔案磁碟塊的十六進制地址
# 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 |
Linux 提供了其特有的 istat 版本:stat。Linux stat 命令可以顯示類似的信息,並且還包括一些在 AIX istat 命令中沒有提供的命令開關:
# 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 命令
在您的日常工作中總會碰到這樣的情況,難以刪除或者管理某些檔案,因為這些檔案的檔案名稱中使用了短橫線或者其他特殊字元、或者其檔案名稱完全不正確。這很可能是有人對該檔案進行了錯誤命名。
因為 UNIX 中的大多數命令,包括開關或者選項在內,都是以
連字元 (-) 或者雙連字元 (--) 開頭的,很難使用諸如 rm、mv 和 cp 之類常用的命令來操作這些檔案。幸運的是,某些命令提供了一些選項,以用來顯示相關檔案所關聯的 inode 的索引編號。ls 命令就提供了一個這樣的選項:
# ls - -- -p fileA fileB fileC fileDfileE fileF fileG fileH fileI fileJ fileK fileL |
使用 ls -i 命令,您可以看到檔案名稱稱旁邊的索引編號,如清單 4 中所示。現在,您已經知道了檔案的索引編號,那么就可以很容易地操作該檔案了。
清單 4. 查看檔案的索引編號
# 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 命令
使用 UNIX find 命令,您可以完成使用 ls 命令所開始的工作。對於要進行操作的檔案,您已經知道了它們的索引編號,那么就可以開始進行相應的操作了!
要刪除看似無名的檔案,您只需要使用 find 和 -inum 開關對索引編號和檔案進行定位。然後,在找到該檔案之後,使用 find 和 -exec 開關刪除該檔案:
# find . -inum 38988 -exec rm {} \; |
要對該檔案進行重命名,可以再次進行相同的操作,但這一次使用 mv 而不是 rm:
# find . -inum 38989 -exec mv {} fileM \; |
為了驗證取得了預期的結果,只需要再次使用 ls -i 命令:
# 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 命令
不幸的是,硬體設備不可能一直使用下去,系統可能會在使用多年後出現故障。當發生這種情況,以及由於電源故障或者某些其他問題而導致作業系統異常關閉的時候,您可能會在還原系統備份時碰到一些在崩潰期間處於打開狀態的檔案,並且現在需要對其加以處理。此時,您可能會碰到一些需要修復 inode 或者存在錯誤的訊息。如果發生這種狀況,那么 fsck 命令可以用來救急!您可以使用 fsck 來修復檔案系統或者修正受損的 inode ,而不是
還原系統、或者甚至重新構建作業系統。
下面的命令可以嘗試修復邏輯卷 /dev/hd1:
通過使用 fsck 命令,您還可以縮小受損 inode 的搜尋範圍。如果您正在搜尋一個特定的 inode ,那么可以使用帶 -ii-NodeNumber 開關的 fsck 命令。
意義
如果沒有 inode ,那么 UNIX 中的檔案和目錄將根本無法使用。希望在閱讀完本文之後,您可以更好地了解 inode 、它們對於 AIX 系統的重要性,以及如何管理它們。您可能會對 df 命令的看法大為改觀。