細說GNU/Linux系統的檔案及檔案系統(轉)

ba發表於2007-08-16
細說GNU/Linux系統的檔案及檔案系統(轉)[@more@]  這是我自己覺得寫得比較好的一篇作業系統文章,而且可能對大家在Linux的使用中有幫助,所以貼上來。

  GNU/Linux使用者都知道,在*nix業界有一句話叫做“一切皆檔案”,這是對Linux檔案系統的一個很好抽象,正規地,Linux的檔案系統可以認為包括4種主要組成部分:名字空間(給事物取名,並按一種層次解構組織他們的形式)、API(用來便利和操作物件的一套系統呼叫)、安全模型(用來保護,隱藏何共享事物的方案)、實現(把邏輯模型同實際硬體聯絡到一起的軟體)。

  Linux定義了一個抽象的核心級介面,能夠容許集中不同的後端檔案系統,檔案樹的有些部分由傳統的給予磁碟的實現來處理,其他部分則由核心中單獨的驅動程式來負責。我們說“Linux中一切皆檔案”直觀地可以這樣理解:所有的東西,裝置、記憶體都模擬成檔案,我們可以把他分成5種檔案型別,c 字元裝置、b 塊裝置、l 連線、f 普通檔案、d 目錄。而Windows中,我們則可以極端地認為“一切皆裝置”,所有檔案都使用inode檔案索引,inode檔案索引是Linux檔案系統的一大特色,利弊都很明顯,inode設計方便程式使用,能夠提供各種功能的實現,但是同時inode本身也成為了一種限制(比如inode用完了就算還有物理空間都不能再使用了),但是我們在使用mke2fs格式化檔案系統的時候,可以透過引數-i來指定目標邏輯分割槽的inode數量,說到mke2fs就必然說到linux傳統的兩種檔案格式——ext2跟ext3,ext3跟ext2檔案格式的不同,就是在於ext3是在ext2檔案格式上加入了日值系統,於是我們可以想到,我們可以不必改變檔案格式的基礎結構,在這兩種方式間互相切換,我們可以很簡單地使用mke2fs -j /dev/hda*來為ext2開啟日誌使之成ext3檔案系統(反之,我們也可以透過關閉日誌把它當作一個ext2檔案系統來使用。),Linux的靈活性還體現在我們甚至可以透過-J device=""來指定日誌檔案的存放位置,也就是說,我們可以把/dev/hda1的日誌檔案放在/dev/hda2上,ext3日誌檔案大小介於1024到102400個檔案系統塊之間,在使用mke2fs -j格式化完成一個檔案系統之後,我們可以透過df -h /dev/hda*整個命令來檢視被格式化硬碟的狀況,我們可以看到約有1%的空間被使用掉了。這就是為日誌檔案開闢的區域!

  在發生檔案系統操作的時候,所要求的修改首先寫入日誌,在完成日誌更新之後,寫入一條“提交記錄(commit record)”標記日誌項的結束。只有這樣以後,才對正規的檔案系統做修改,如果發生了崩潰,可以用日誌記錄重構出完全相同的檔案系統,除了ext3檔案系統,還有一種叫做ReiserFS的檔案系統也被廣泛地應用,它也是一種日誌檔案系統,但是這種檔案系統沒有針對系統(比如伺服器)進行最佳化,可能會碰到大量的同時讀寫現象。除了日誌功能之外,Reiser還提供了一種模組化的檔案系統介面,能讓軟體開發人員和系統管理員在非常細的粒度上指定應該怎樣處理和保護檔案。

  下面再詳細地講一下ext2跟ext3檔案系統,ext2檔案系統由5個部分構成,一組索引結點(inode)儲存單元,一組分散的“超級塊(superblock)”,一組檔案系統中磁碟塊的對映表。一份磁碟塊使用情況的彙總,最後是資料塊。每個檔案系統都被分成若干個塊簇,諸如inode表這樣的結構在塊簇之間進行分配,於是,要一起訪問的若干磁碟塊可以在硬碟上彼此儲存得很靠近。這種成簇機制減少了在訪問同一個檔案時需要搜尋整個硬碟的情況,縮影結點是長度固定的表項,每個索引結點都儲存著一個檔案的資訊,因為在Linxu初始化檔案系統的結構時,必須開闢出一塊空間用來儲存索引結點。也就是我前面說過的mke2fs -i來指定inode數量,但是一般情況下我們預設即可,superblock是一個描述檔案系統特性的記錄。它包括的資訊有:磁碟塊的長度,索引結點表的大小和位置,磁碟塊的對映表和使用資訊,塊簇大小,以及其他幾個重要的檔案系統的引數,因為superblock的如此重要,所以損壞超級塊會對檔案系統造成很嚴重的後果,因此在硬碟上的分散位置(在每個塊簇的起始處)儲存有它的幾個副本。Linux為每個已經安裝的檔案系統在記憶體中儲存有一個超級塊的副本,又在硬碟上儲存了幾個副本,系統呼叫sync把被快取的超級塊flush到它們硬碟上的永久位置上,瞬間就讓檔案系統保持了一致性。sync也會flush已經修改過的索引結點和被快取的資料塊,我們可以透過update命令啟動守護程式bdflush,它每30s執行一次sync呼叫,將每次崩潰,比如斷電造成的資料損失降到最低。(我們都知道,Linux為了提高效能,一定程度上緩和磁碟讀寫速度瓶頸,採用了系統記憶體做磁碟快取,一旦斷電,快取中的資料將無法及時寫入磁碟,造成損失。)檔案系統的磁碟塊對映表是它所包含的自由塊的一張表。在寫心檔案的時候,就要檢查這個對映表,設計一種有效的佈局方案。塊的使用情況彙總記錄了已經投入使用的塊的基本資訊。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-960603/,如需轉載,請註明出處,否則將追究法律責任。

相關文章