天天看點

關于 inode

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 頁面 http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/inode.h.htm 中可以找到完整的 inode 結構。

以上所列舉的資訊對于檔案來說非常重要,并且在 UNIX 中頻繁使用。如果沒有這些資訊,那麼檔案将被認為遭到破壞和不可用。

與其他的作業系統相比,UNIX 系統中的目錄和檔案可能看起來有所不同,但事實并非如此。在 UNIX 中,目錄本身就是檔案,隻是在它們的 inode 中使用了一些附加的設定。目錄 本質上就是一個包含了其他檔案的檔案。另外,其模式資訊中設定了一些相應的标志,以告知系統該檔案實際上是一個目錄。

使用 inode

了解如何在 UNIX 中使用 inode 可以節約大量的時間,并提高工作效率。在尚未了解 inode 之前,您可以使用下面的指令,以減少可能碰到的問題。

df 指令

如前所述,當您在 UNIX 中建立一個檔案系統時,将為 inode 表配置設定大約百分之一的總磁盤空間。每次在檔案系統中建立一個檔案時,都會為該檔案配置設定一個 inode 。通常,與一個檔案系統相關聯的 inode 的數目足夠多,但耗盡 inode 的可能性始終存在。要監視是否發生了這種情況,您可以觀察 

df

 的輸出。

使用 

df

 指令,您可以檢視所有已挂載的檔案系統或者特定的檔案系統。在該指令的輸出中,您可以檢視各個檔案系統中已使用的 inode 的數目,以及檔案系統中總體使用情況百分比,如清單 1 中所示。

清單 1. 使用 df 來監視 inode 的使用

1

2

3

4

5

6

7

8

# 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 指令的結果
關于 inode

istat 和 stat

在 AIX 中檢查 inode 的一種快捷的方式是使用 

istat

 指令。使用這個指令,您可以找到特定檔案的索引編号,以及其他的 inode 項目,如權限、檔案類型、UID、GID、連結的數目(非符号連結)、檔案大小和最近一次更新、最近一次修改以及最近一次通路的時間戳。

清單 2 顯示了 AIX 中檔案 /usr/bin/ksh 的 inode 資訊。

清單 2. /usr/bin/ksh 的 inode 資訊

9

10

# 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. 确定檔案磁盤塊的十六進制位址

11

12

13

# 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 ,而不是還原系統、或者甚至重新建構作業系統。

# fsck –p /dev/hd1 –y

結束語

相關主題

    • 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。
    • 對話 UNIX:檢視本系列中的其他部分。
    • Wikipedia 中的 inode :在 Wikipedia 的條目中,閱讀有關 inode 的更多資訊。
    • Wikipedia 中的 AIX 條目:閱讀 Wikipedia 中有關 AIX 作業系統的極好的條目,以擷取有關其背景和開發的更多資訊。
    • istat

       指令:從 Combined IBM Systems 資訊中心了解有關 

      istat

       指令的更多資訊。
    • fsck

      fsck

    • df

      df

    • chfs

      chfs

    • ls

      ls

    • find

      find

    • smitty

      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 相關技術資訊的協作環境。
上一篇: 淺談inode
下一篇: inode directory

繼續閱讀