1. 程式人生 > >關於 inode 瞭解 UNIX 檔案系統如何管理檔案

關於 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 頁面

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 的使用

# 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 命令的結果
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 相關技術資訊的協作環境。