關於 inode 瞭解 UNIX 檔案系統如何管理檔案
轉載:https://www.ibm.com/developerworks/cn/aix/library/au-speakingunix14/
對話 UNIX
關於 inode
瞭解 UNIX 檔案系統如何管理檔案
Adam Cormany
2008 年 8 月 11 日釋出
inode 是 UNIX 作業系統中的一種資料結構,它包含了與檔案系統中各個檔案相關的一些重要資訊。在 UNIX 中建立檔案系統時,同時將會建立大量的 inode 。通常,檔案系統磁碟空間中大約百分之一空間分配給了 inode 表。
有時,人們使用了一些不同的術語,如 inode 和索引編號 (inumber)。這兩個術語非常相似,並且相互關聯,但它們所指的並不是同樣的概念。 inode 指的是資料結構;而索引編號實際上是 inode 的標識編號,因此也稱其為 inode 編號 或者索引編號。索引編號只是檔案相關資訊中一項重要的內容。下一個部分將介紹 inode 中的其他一些屬性。
inode 表包含一份清單,其中列出了對應檔案系統的所有 inode 編號。當用戶搜尋或者訪問一個檔案時,UNIX 系統通過 inode 表查詢正確的 inode 編號。在找到 inode 編號之後,相關的命令才可以訪問該 inode ,並對其進行適當的更改。
例如,使用 vi 來編輯一個檔案。當您鍵入 vi 時,在 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 頁面
以上所列舉的資訊對於檔案來說非常重要,並且在 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
如果由於某種原因,某個檔案系統 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/bin
Filesystem 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 file
Device: fd00h/64768d Inode: 12799859 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2008-04-06 19:13:50.000000000 -0400
Modify: 2006-07-12 03:11:53.000000000 -0400
Change: 2007-11-22 04:05:30.000000000 -0500
ls 命令
在您的日常工作中總會碰到這樣的情況,難以刪除或者管理某些檔案,因為這些檔案的檔名中使用了短橫線或者其他特殊字元、或者其檔名完全不正確。這很可能是有人對該檔案進行了錯誤命名。
因為 UNIX 中的大多數命令,包括開關或者選項在內,都是以連字元 (-) 或者雙連字元 (–) 開頭的,很難使用諸如 rm、mv 和 cp 之類常用的命令來操作這些檔案。幸運的是,某些命令提供了一些選項,以用來顯示相關檔案所關聯的 inode 的索引編號。ls 命令就提供了一個這樣的選項:
# ls
- -- -p fileA fileB fileC fileD
fileE 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 -i
38990 -- 38979 fileB 38976 fileE 38985 fileH 38981 fileK
38991 -p 38984 fileC 38982 fileF 38977 fileI 38978 fileL
38980 fileA 38986 fileD 38983 fileG 38987 fileJ 38989 fileM
fsck 命令
不幸的是,硬體裝置不可能一直使用下去,系統可能會在使用多年後出現故障。當發生這種情況,以及由於電源故障或者某些其他問題而導致作業系統異常關閉的時候,您可能會在還原系統備份時碰到一些在崩潰期間處於開啟狀態的檔案,並且現在需要對其加以處理。此時,您可能會碰到一些需要修復 inode 或者存在錯誤的訊息。如果發生這種狀況,那麼 fsck 命令可以用來救急!您可以使用 fsck 來修復檔案系統或者修正受損的 inode ,而不是還原系統、或者甚至重新構建作業系統。
下面的命令可以嘗試修復邏輯卷 /dev/hd1:
# fsck –p /dev/hd1 –y
通過使用 fsck 命令,您還可以縮小受損 inode 的搜尋範圍。如果您正在搜尋一個特定的 inode ,那麼可以使用帶 -ii-NodeNumber 開關的 fsck 命令。
結束語
如果沒有 inode ,那麼 UNIX 中的檔案和目錄將根本無法使用。希望在閱讀完本文之後,您可以更好地瞭解 inode 、它們對於 AIX 系統的重要性,以及如何管理它們。您可能會對 df 命令的看法大為改觀。
相關主題
- 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。
- 對話 UNIX:檢視本系列中的其他部分。
- Wikipedia 中的 inode :在 Wikipedia 的條目中,閱讀有關 inode 的更多資訊。
- Wikipedia 中的 AIX 條目:閱讀 Wikipedia 中有關 AIX 作業系統的極好的條目,以獲取有關其背景和開發的更多資訊。
- istat 命令:從 Combined IBM Systems 資訊中心瞭解有關 istat 命令的更多資訊。
- fsck 命令:從 Combined IBM Systems 資訊中心瞭解有關 fsck 命令的更多資訊。
- df 命令:從 Combined IBM Systems 資訊中心瞭解有關 df 命令的更多資訊。
- chfs 命令:從 Combined IBM Systems 資訊中心瞭解有關 chfs 命令的更多資訊。
- ls 命令:從 Combined IBM Systems 資訊中心瞭解有關 ls 命令的更多資訊。
- find 命令:從 Combined IBM Systems 資訊中心瞭解有關 find 命令的更多資訊。
- smitty 命令:從 Combined IBM Systems 資訊中心瞭解有關 smitty 命令的更多資訊。
- inode.h 檔案:從 Combined IBM Systems 資訊中心瞭解有關 inode.h 檔案的更多資訊。
- AIX and UNIX 專區:developerWorks 的“AIX and UNIX 專區”提供了大量與 AIX 系統管理的所有方面相關的資訊,您可以利用它們來擴充套件自己的 UNIX 技能。
- AIX and UNIX 新手入門:訪問“AIX and UNIX 新手入門”頁面可瞭解更多關於 AIX 和 UNIX 的內容。
- AIX and UNIX 專題彙總:AIX and UNIX 專區已經為您推出了很多的技術專題,為您總結了很多熱門的知識點。我們在後面還會繼續推出很多相關的熱門專題給您,為了方便您的訪問,我們在這裡為您把本專區的所有專題進行彙總,讓您更方便的找到您需要的內容。
- AIX Wiki:訪問此 AIX 相關技術資訊的協作環境。