| 1. 簡單介紹 使用Window每次非正常退出系統都會招來scandisk的一頓狂掃;Linux也不例外,只不過它調用的是fsck程式來檢查檔案系統。作為一名系統管理員,當你發現檔案系統發生故障時,你會怎麼做?當然是手動地執行fsck來檢查檔案系統。所以本文就是教大家如何正確地使用並且使用好fsck工具的。 2. 檔案系統 2.1. 超級資料區塊(Superblock) 一個檔案系統總是由它的superblock來定義的,所以建立檔案系統的同時superblock也被建立。它包含了檔案系統的一些基本參數,例如檔案系統中的資料區塊(data blocks)數和最大檔案數等等。因為superblock包含了一些臨界資料,以便於進行災難性的恢複。預設的superblock總是固定地位於檔案系統所在磁碟分割的開始處。Superblock還有一個備份叫做冗餘superblock,就像DOS中的檔案配置表的副本。冗餘superblock和預設的superblock不一樣,它被分散地儲存在磁碟分割上。 一個特定的檔案被看成是目錄或包含了指向它的內容的指標。每一個檔案都有一個和檔案節點(inode)相關聯的描述符。一個檔案節點包含了檔案的屬性,例如檔案的所有者、最後修改時間、最後訪問時間和指向此檔案資料區塊的指標等等。假設一個檔案的前12個資料區塊被檔案節點結構中的變數直接指向,那麼檔案節點結構可能還包含著指向間接檔案資料區塊的指標以便將來擴充檔案的內容。其實檔案節點結構中包含了3個層級的資料區塊指標,一個檔案有4096個位元組的資料區塊,則第一級間接資料區塊包含了1024個位元組,第二級間接資料區塊也包含了1024個位元組,並且被第一級間接資料區塊指向;同理,第二級間接資料區塊也指向第三級大小為1024位元組的間接資料區塊。其實在實際應用中第三級間接資料區塊很少被使用,因為一般沒有那麼大的檔案。檔案系統的資料區塊大小儲存在superblock中,這就使在同一系統中同時訪問不同資料區塊大小的檔案系統成為可能。 最後再說明一下,檔案資料區塊的大小是在建立檔案系統時給定的,並且在以後的使用中無法被改變。 2.2. 概要資訊(Summary information) 概要資訊和superblock相關聯,並且是唯一關聯;當檔案系統被改變時,它就隨之記錄這種改變,記錄檔案系統中的資料區塊數目、片段數目、檔案節點和目錄等資訊。 2.3. 柱面組群(Cylinder groups) 檔案系統將磁碟分為一個或多個被稱為"柱面組群"的地區,它包含了一個和多個連續的磁碟柱面。每個柱面組群指示了檔案的節點槽,一個資料區塊映象(block map)描述了在柱面組群中所有可用的資料區塊,並且概要資訊描述了在柱面組群中資料區塊的使用方式。當檔案系統產生時,柱面組群中的檔案節點數就被確定了下來。目前一般的規則是在磁碟上每2048個位元組被分配入一個檔案節點。在每個柱面組群的開始處都記錄有組群資訊,一旦磁碟發生錯誤時將組群資訊丟失。 2.4. 磁碟片段(Fragments) 為了防止儲存小檔案時浪費磁碟空間,檔案系統允許將一個資料區塊分割成2、4或8份。其中最小的份額時磁碟的簇大小,通常為512個位元組。每一個同柱面組群相關聯的資料區塊映象記錄著磁碟空間的片段程度。 2.5. 檔案系統的更新 在每天的日常工作中,我們建立、刪除數以百計的檔案。作業系統為此產生了一系列的檔案系統更新工作。當資料被寫入磁碟時,產生了一個連續的檔案系統,同時檔案系統更新所有的臨界資訊。當使用者改變檔案系統時,比如執行write時,要寫入的資料被複製入系統核心的被稱作in-core的緩衝區中,所以這種資料更新不是同步的,只有當write函數執行完畢,並且返回時,資料才真正地被寫入磁碟。同時使用者也可以手工地執行sync命令來迫使資料寫入磁碟。另外,每當核心的in-core緩衝區被用作新用途時,系統也會使用/etc/update來調用sync將資料寫入磁碟。 3. 修複破壞的檔案系統 有很多方式可以使檔案系統遭到破壞,最通常的是不順利關機和一些硬體錯誤。原因是在關閉系統並且掛起CPU之前沒有執行sync來將資料寫入磁碟,導致檔案系統不完整。另外,硬體錯誤也是很致命的,特別是磁碟的物理損傷,將導致資料永久性地丟失。 3.1. 檢測和修複被破壞的檔案系統 平時,fsck不進行互動式執行,而是每當不正常退出系統後,開機時自動執行。這個功能是在fsck進行互動式執行時的一個子集。所以本文下面的介紹都是基於互動式執行的,並且所有可能發生的錯誤都會被捕捉到。在此模式下運行,我們可以根據錯誤的類型來採取相應的修複措施。對於一個靜態檔案系統,fsck檢查它的結構完整性。在下面的介紹裡,我們著重討論發現柱面組群、檔案節點、間接檔案節點和資料區塊的錯誤和各種可能採取的修複措施。 3.2.超級資料區塊檢查 常見的檔案系統破壞形式是概要資訊中關於超級資料區塊的資訊破壞。概要資訊很容易被破壞,因為對檔案系統的任何改變都會導致概要資訊的修改,並且也很容易在非正常退出時被破壞。對超級資料區塊的檢查主要是針對檔案系統的長度、檔案節點數目、空閑資料區塊統計和空閑檔案節點統計等;檔案系統的長度必須大於被超級資料區塊使用的資料區塊數目的總和和被檔案節點列表所使用的資料區塊數目的總和。對fsck來說,檔案系統的長度和它的布局資訊是最為重要的。 3.3. 空閑資料區塊檢查 Fsck檢查所有在柱面組群的資料區塊映象中被標識為未使用的資料區塊,也即空閑資料區塊。Fsck合計空閑資料區塊的數目,並且把它加上被檔案節點使用的資料區塊的數目,檢查這個結果是否等於檔案系統中所有資料區塊的總和。如果fsck探索資料塊分配映象有錯時,它會自動重建它。概要資訊中和超級資料區塊相聯絡的資訊包含了在檔案系統中所有空閑資料區塊的數目。Fsck將它檢查所得到的空閑資料區塊數目和上面概要資訊中的空閑資料區塊數目進行比較,如果兩者不一致,fsck就將實際檢查得到的空閑資料區塊覆蓋概要資訊中的空閑資料區塊資訊。對於空閑檔案節點的檢查也會作同樣的處理。 3.4. 檔案節點狀態檢查 一個單獨的檔案節點一般不會出錯,然而,由於在檔案系統中有大量的檔案節點處入活動狀態,所以會有一小部分檔案節點會發生錯誤。Fsck從第二個檔案節點開始檢查(檔案節點0被標記為"未使用"、檔案節點1被留作後用)直至最後一個檔案節點。每一個檔案節點都被進行格式、類型、連結數、重複資料區塊、壞資料區塊和節點大小的檢查。 每個檔案節點都有一個模式定義,它指示了檔案節點的類型和分配狀態,這些類型有:常規節點、目錄節點、符號串連節點、特殊塊裝置節點、特殊字元裝置節點和通訊端節點;而其分配狀態有:未分配、已指派和非分配三種狀態,其中非分配狀態的節點指示了這個節點具有不正確的節點格式,這種情況常常是由於非法資料的寫入而造成的,對於這種情況,fsck會清除此檔案節點的內容。 3.5. 檔案節點連結 每一個檔案節點都包含有對於目錄項的總連結數。Fsck為了校核一個檔案節點的連結數,它從根目錄開始掃描,並且依次遞減目錄項中的連結數,最後比較所得連結數和檔案節點包含的連結數是否一致,如果不一致則fsck會將實際的連結數儲存到檔案節點中。如果發現連結數為零,則說明此目錄項是被丟棄了的,於是fsck會將此目錄項儲存到lost+found目錄項中。每一個檔案節點都儲存有一個列表或是指向該列表的指標,此列表包含了此節點所使用的資料區塊。由於間接資料區塊是被檔案節點所擁有的,所以如果它被破壞也直接地影響到檔案節點。Fsck檢查一個檔案節點所擁有資料區塊是否存在於"已指派資料區塊"列表中,如果不是,則查看它是否存在於"重複塊(duplicate blocks)"列表中,如果都不是,則將這個資料區塊的塊號加入到"已指派資料區塊"列表中。另外由於沒有足夠的資訊來表明檔案節點所指向的資料區塊內容的正確性,所以如果檔案內容被改變則無法被探測到。如果遇到硬體故障使得資料區塊內容改變,此時fsck同時清除資料區塊和檔案節點。Fsck檢查一個檔案節點包含的所有資料區塊號對應的資料區塊,如果這個資料區塊號小於檔案系統中最小的資料區塊號或者大於最大的資料區塊號則將它置為壞塊。壞塊通常是由硬體故障引起的,如果一個檔案節點包含有壞塊號,則fsck將會清除此節點。 3.6. 檔案結點資料大小 每個檔案節點都有它所包含資料區塊的總數,這個總是是已指派資料區塊數目和間接資料區塊數目的總和。Fsck就比較它計算所得到的資料區塊總數和檔案節點中的資料區塊總數,看兩者是否一致,如果不一致,那麼fsck將修複它。另外,每一個檔案節點都包含有一個32位的長度欄位,它表示了檔案大小的位元組描述。 3.7. 檢查與檔案節點相關聯的資料 一個檔案節點可以和三種形式的資料區塊相關聯。它們是:無格式資料區塊(Plain data blocks)、符號連結資料區塊(symbolic link data blocks)和目錄資料塊(directory data blocks)。 其中,無格式資料區塊包含了檔案的內容;符號連結資料區塊包含了所指向檔案的路徑;而目錄資料塊包含了目錄的結構資訊。 Fsck只能檢查目錄資料塊的有效性,它檢查一系列的目錄錯誤,它們包括目錄節點號所指向的未分配檔案節點、目錄節點號是否大於檔案系統中所允許的最大目錄節點號、關於目錄項"."及".."的節點號是否有錯和一個目錄資料塊是否附在檔案系統之上等錯誤。如果一個目錄節點的類型是"未分配節點"時,fsck將會刪除整個目錄節點和它所包含的目錄資料塊,這通常是由硬體故障引起的。當一個非法資料寫入目錄資料塊時,會引起目錄節點跑到檔案系統節點列表之外,這種情況,fsck將刪除這個目錄節點。另外,對於目錄項"."的資料區塊號必須時目錄節點資料區塊列表中的第一項,因為它相當於這個目錄節點,如果不是這樣,fsck會修正它並使它成為此目錄節點資料區塊列表中的第一資料區塊。 3.8. 檔案系統的連通性 Fsck檢查檔案系統的連通性,檢查目錄項是否都被鏈入檔案系統,如果不是則將它們存入lost+found目錄中,這種情況通常發生於硬體故障。 |