深度解析Unix中inode塊與超級塊

2021-06-22 23:00:58 字數 2699 閱讀 6161

[日期:2009-05-20]
雖然unix作業系統要比windwos系統要穩定。但是unix作業系統有時候也會有鬧脾氣罷工的時候。這主要是因為unix作業系統中inode塊與超級塊在作怪。那麼這兩個塊在unix作業系統中到底佔據了什麼位置呢?

一、inode塊,unix檔案的核心。

首先需要明白的是,在unix作業系統中的任何資源都被當作檔案來管理。如目錄、光碟機、終端裝置等等,都被當作是一種檔案。從這方面來說,unix作業系統中的所有的目錄、硬體裝置跟普通檔案一樣,具有共同的屬性。而這些屬性的話,就是儲存在inode塊中。

inode塊中儲存了乙個檔案系統中的全部inode節點。也就是說,當系統建立了乙個檔案(或者新增了乙個新裝置)時,系統就會從這個塊中給這個檔案分配乙個inode結點。在這個結點中儲存了這個檔案的大部分屬性,如建立、修改時間等等。但是需要注意的是,有兩個屬性不包含在這個inode結點中,分別為檔名與結點號。這主要是因為inode節點按順序排列,所以系統核心就可以採用簡單的演算法,就可以得出inode節點號。通過系統提供的ls命令顯示檔案或者目錄資訊的時候,就需要用到這個結點中的資訊。ls命令為了確定乙個檔案的inode節點需要查詢它所在的目錄,然後讀取它的inode 結點,並根據inode節點得到檔案的屬性。正常情況下,這個節點號不會出現什麼問題。但是如果由於意外斷電或者其他原因的話,有可能會發生一些故障。如可能乙個inode結點在系統中已經被建立,但是其沒有被正常使用,或者可能塊號超出了範圍。這些故障會給作業系統留下安全隱患。為此當出現意外關機或者其他意外事件時,最好系統工程師能夠利用fsck系統命令來修復inode結點中的錯誤。

另外需要注意的是,在inode結點中還儲存著乙個重要的資訊,就是儲存了乙個包含13-15位指標元素的陣列,這些指標是磁碟塊區的位址。這些指標非常的重要。作業系統就是依靠這些指標在硬碟上定位相關的檔案,並讀取它。如上所述,因為一些意外的操作也會使得這個指標位址出現錯誤。有時候這會非常的嚴重。如一些檔案無法讀取等等。如果這些檔案不幸的是系統的一些配置檔案,那麼就會導致系統的崩潰。如果這些指標位址出現錯誤,則檔名仍然會顯示在作業系統中。但是如果使用者試著去開啟這些檔案時,系統卻會告知無法開啟這些檔案。如果遇到這種情況該這麼辦呢?此時系統工程師就需要手工執行fsck命令。如果這個檔案損壞的不是很嚴重,那麼作業系統內核心會為其再建立乙個鏈結。但是如果原檔案損壞的比較厲害了,無法再重新讀取。則系統會建立使用者刪除這個檔案(從硬碟中刪除)。

由於一些檔案的屬性(如建立修改時間等等)都儲存在inode結點中,為此一些命令在獲取這些屬性的時候,是不需要開啟檔案的。如現在系統工程師在編寫乙個檔案備份程式,就需要用到inode節點中的修改時間截這個屬性。此時可以利用相關的命令直接從inode結點中去獲取,而不需要開啟對應的檔案去得知這個資訊。為此在unix作業系統中檔案備份程式的執行效率會比較高,實現起來也相對簡單一點。

從上面的這些分析中可以看到,inode結點是unix作業系統中檔案的核心,也是作業系統與硬碟中儲存的資料打交道的乙個中介者。如果這個結點資訊出現錯誤的話,那麼硬碟中儲存的資料塊就好像是無主的流浪者,無法被使用者所採用。另外我們平時刪除檔案,其實只是刪除了這個聯絡。所以通過一線恢復工具仍然可以恢復被刪除了的檔案。如果需要真正刪除檔案的話,就需要格式化硬碟(低格)或者複製大檔案把其覆蓋掉。只有如此硬碟中儲存的資料塊才會被真正的刪除掉。最後需要說明的是,按照正常的關機程式來關閉unix作業系統,是保護inode結點資訊的最好措施。突然斷電或者其他意外事故,是inode結點的最大殺手。

二、超級塊,檔案系統的心臟。

如果說inode塊是unix作業系統中檔案的核心,那麼超級塊就是檔案系統的心臟。啟動unix作業系統後,發現某個檔案系統無法使用,很有可能就是超級塊出現了問題。為什麼這個超級塊有這麼大的作用呢?主要是因為在超級塊中儲存了全域性檔案資訊,如硬碟已用空間、資料塊可用空間、inode結點資訊等等。做乙個形象的比喻,這個超級塊就好像是企業的資產負債表,乙個檔案系統中有哪些資源都記錄在這個表中。  

可見超級塊如果發生損壞的話,對於檔案系統的破壞性非常的大。輕者的話導致某個檔案系統無法掛載,重則的話導致整個作業系統崩潰。在unix作業系統中,除了可以利用sync命令來保證硬碟上的內容決不會比記憶體裡的內容更新之外,還提供了乙個很有利的措施來保證其的安全性。其實,這個技術很早就有,只是一開始並沒有用在超級塊的管理中。這個技術就是跟磁碟陣列類似。作業系統會將多個超級塊內容儲存到硬碟中的不同區域。當其中乙個超級塊出現問題時,作業系統會自動採用另外乙個超級塊。等到系統執行正常後,系統內容就會把可用的超級塊去替換那個故障的超級塊。為此除非所有的超級塊都損壞了,否則的話,只要有乙個超級塊是可用的,那麼檔案系統與作業系統就可以正常掛載與啟動。這種安全機制在很大程度上提高了超級塊的安全性,系統了unix作業系統的穩定性。現在大部分的unix作業系統(包括linux作業系統)已經實現了類似的安全機制。

另外系統工程師需要了解在超級塊中到底儲存了哪些資訊。這對於以後遇到問題時查詢問題原因有一定的故障。根據筆者的了解,在超級塊中儲存了如下有用的資訊。一是儲存了檔案系統的大小以及所用酷塊的大小;二是儲存了可用資料庫的數量和部分可以及時分配的空閒資料塊列表;三是最近一次的更新時間與檔案系統的狀態;四是空閒inode結點的個數和部分可以及時使用的inode結點列表。有時候在unix作業系統上進行應用程式開發也需要用到這些資訊。

最後筆者需要強調一點,超級塊損壞的最大殺手仍然是意外斷電或者其他原因的意外當機。因為此時記憶體中的超級塊資訊無法及時更新到硬碟中。為此就出現了記憶體與超級塊中內容不一致的地方,從而會導致系統啟動時的一系列故障。為此在unix伺服器上部署乙個ups是非常重要的。這雖然是乙個老生常談的方法,但是卻非常有效。

深度解析VC中的訊息(下)

前面,我們分析了訊息的基本理論和基本的函式及用法,接下來,我們將進一步討論訊息傳遞在mfc中的實現。mfc訊息的處理實現方式 初看mfc中的各種訊息,以及在頭腦中根深蒂固的c 的影響,我們可能很自然的就會想到利用c 的三大特性之一 虛擬機制來實現訊息的傳遞,但是經過分析,我們看到事情並不是想我們想象...

深度解析VC中的訊息(下)

前面,我們分析了訊息的基本理論和基本的函式及用法,接下來,我們將進一步討論訊息傳遞在mfc中的實現。mfc訊息的處理實現方式 初看mfc中的各種訊息,以及在頭腦中根深蒂固的c 的影響,我們可能很自然的就會想到利用c 的三大特性之一 虛擬機制來實現訊息的傳遞,但是經過分析,我們看到事情並不是想我們想象...

深度解析原型中的各個難點

本文不會過多介紹基礎知識,而是把重點放在原型的各個難點上。大家可以先仔細分析下該圖,然後讓我們進入主題 首先來介紹下prototype屬性。這是乙個顯式原型屬性,只有函式才擁有該屬性。基本上所有函式都有這個屬性,但是也有乙個例外 let fun function.prototype.bind 如果你...