在先前關于Linux文件系統(tǒng)的文章中,我很想去深入地討論更多EXT文件系統(tǒng)的特性的信息。所以,首先讓我們來回答這個問題:什么是文件系統(tǒng)?一個文件系統(tǒng)應該遵循以下特點:
1.數(shù)據(jù)存儲:文件系統(tǒng)主要的功能是結構化存儲和取回數(shù)據(jù)。
2.命名空間:提供一套命名和組織的方法,就是命名和結構化數(shù)據(jù)的規(guī)則。
3.安全模型:一種訪問控制的策略。
4.API:系統(tǒng)操控文件系統(tǒng)對象的函數(shù),就像操作文件夾和文件一樣。
5.實現(xiàn):一個實現(xiàn)以上功能的軟件。
這篇文章集中與上面清單的第一項,還有探究元數(shù)據(jù)結構---在EXT文件系統(tǒng)中提供數(shù)據(jù)存儲的邏輯框架。
EXT文件系統(tǒng)歷史
雖然是為Linux編寫的,但EXT文件系統(tǒng)起源于Minix操作系統(tǒng),而Minix文件系統(tǒng)早在1987年首次發(fā)布,比Linux還早五年就已經發(fā)布了。如果我們查看EXT文件系統(tǒng)家族從其Minix根開始的歷史和技術演變,就會更容易理解EXT4文件系統(tǒng)。
Minix
當編寫原始Linux內核,Linus Torvalds需要一個文件系統(tǒng),但是不想開發(fā)它。因此他簡單的使用了Minix文件系統(tǒng),這是 Andrew S. Tanenbaum開發(fā)的,而且是Tanenbaum 的Minix操作系統(tǒng)的一部分。Minix是類Unix操作系統(tǒng),為教育使用而開發(fā)。它的代碼開放使用,而且合理的授權給Torvalds,允許他將它用于Linux的初代版本。
Minix結構如下,其中大部分位于文件系統(tǒng)生成的分區(qū)中:
引導扇區(qū)(boot sector)安裝于硬盤的第一個扇區(qū)。引導塊(boot block)包含一個非常小的引導記錄和一個分區(qū)表。
每一個分區(qū)中的第一個塊是超級塊(superblock),它包含了定義其他文件系統(tǒng)結構的元數(shù)據(jù),并將它們定位在分配給分區(qū)的物理磁盤上。
節(jié)點位圖塊(inode bitmap block),它確定了哪個節(jié)點在使用以及哪個節(jié)點是空閑的。
節(jié)點(inodes),它們在磁盤上有它們自己的空間。每個節(jié)點包含了一個文件的信息,包括數(shù)據(jù)塊的位置,即文件所屬的區(qū)域。
區(qū)域位圖(zone bitmap)跟蹤記錄數(shù)據(jù)區(qū)域的使用和釋放。
數(shù)據(jù)區(qū)域(data zone),數(shù)據(jù)實際上存儲的位置。
對于位圖的兩個類型來說,一個bit代表了一個特有的數(shù)據(jù)區(qū)域或者一個特有的節(jié)點。如果這個bit是0,這個區(qū)域或者節(jié)點是空閑的而且可供使用,但是如果這個bit是1,這個數(shù)據(jù)區(qū)域或者節(jié)點是在使用中的。
節(jié)點是什么?它是索引節(jié)點(index-node)的縮寫,一個節(jié)點是在磁盤上的一個256字節(jié)的塊,而且它存儲文件相關的數(shù)據(jù)。這些數(shù)據(jù)包括文件的大??;文件的用戶和所屬組的用戶ID;文件模式(即訪問權限);以及三個時間戳具體說明了時間,包括:文件最后訪問時間,最后修改時間,以及節(jié)點中的數(shù)據(jù)最后修改時間。
節(jié)點也包含了:指向硬盤上文件數(shù)據(jù)所在的位置。在Minix和EXT1-3文件系統(tǒng)中,它是一個數(shù)據(jù)區(qū)域和塊的列表。Minix文件系統(tǒng)節(jié)點支持9個數(shù)據(jù)塊,7個直接指針和2個間接指針。如果你想了解的更多,這有一個很好的PDF詳細描述了Minix文件系統(tǒng)結構,以及在Wikipedia上對節(jié)點指針結構的快速概述。
EXT
最初的EXT文件系統(tǒng)(Extended)由Rémy Card編寫,并于1992年與Linux一起發(fā)布,以規(guī)避Minix文件系統(tǒng)的一些大小限制。其中主要的結構變化是基于Unix文件系統(tǒng)(UFS)的文件系統(tǒng)元數(shù)據(jù),該結構也被稱為伯克利快速文件系統(tǒng)(FFS)。我發(fā)現(xiàn)很少有關于此EXT文件系統(tǒng)的可考究的發(fā)布信息,顯然是因為它存在重大問題,并很快被EXT2文件系統(tǒng)所取代。
EXT2
EXT2文件系統(tǒng)非常成功。它在Linux發(fā)行版中被使用了很多年,并且它是我在1997年左右開始使用Red Hat Linux 5.0時遇到的第一個文件系統(tǒng)。EXT2文件系統(tǒng)與EXT文件系統(tǒng)具有基本相同的元數(shù)據(jù)結構,但EXT2更具前瞻性,因為在元數(shù)據(jù)結構之間保留大量磁盤空間以供未來使用。
像Minix一樣,EXT2在其安裝的硬盤的第一個扇區(qū)中有一個引導扇區(qū),其中包括一個非常小的引導記錄和一個分區(qū)表。在引導扇區(qū)后面有一些預留空間,它跨越引導記錄和硬盤上通常位于下一個柱面邊界上的第一個分區(qū)之間的空間。 GRUB2(可能還有GRUB1)使用這個空間作為其啟動代碼的一部分。
每個EXT2分區(qū)中的空間被劃分為多個柱面組,可以更加精細地管理數(shù)據(jù)空間。 根據(jù)我的經驗,組大小通常約為8MB。下面的圖1顯示了柱面組的基本結構。柱面中的數(shù)據(jù)分配單元是塊,其大小通常為4K。
圖1:EXT文件系統(tǒng)中柱面組的結構
柱面組中的第一個塊是一個超級塊,它包含定義其他文件系統(tǒng)結構并將其定位在物理磁盤上的元數(shù)據(jù)。分區(qū)中的一些附加組將具有備份超級塊,但不是全部。損壞的超級塊可以使用dd等磁盤實用程序將備份超級塊的內容復制到主超級塊。它并不經常發(fā)生,但是多年前曾經有一個受損的超級塊,我可以使用其中一個備份超級塊來恢復其內容。幸運的是,我已經預見到并使用dumpe2fs命令轉儲我系統(tǒng)上分區(qū)的描述符信息。
每個柱面組都有自己的inode位圖,該位圖用于確定使用哪些inode,以及該組中哪些是空閑的。inode在每個組中都有自己的空間。每個inode都包含有關一個文件的信息,包括屬于該文件的數(shù)據(jù)塊的位置。塊位圖跟蹤文件系統(tǒng)中使用和釋放的數(shù)據(jù)塊。注意,上面顯示的輸出中有大量關于文件系統(tǒng)的數(shù)據(jù)。在很大的文件系統(tǒng)中,組數(shù)據(jù)可以長達數(shù)百頁。組元數(shù)據(jù)包括組中所有空閑數(shù)據(jù)塊的列表。
EXT文件系統(tǒng)實現(xiàn)了保證文件碎片最小化的數(shù)據(jù)分配策略。減少磁盤碎片化可改善文件系統(tǒng)的性能。這些策略將在下文的EXT4部分中進行介紹。
在某些情況下,我曾遇到的EXT2文件系統(tǒng)的最大問題是在崩潰后可能需要幾個小時才能恢復,因為fsck(file system check)程序需要很長時間才能找到并糾正文件系統(tǒng)中的任何不一致。它曾在我的一臺計算機上花費了28個小時的時間,以實現(xiàn)在發(fā)生崩潰到重新啟動時完全恢復磁盤 -并且這是在磁盤大小為數(shù)百兆字節(jié)下測試的結果。
EXT3
EXT3文件系統(tǒng)的唯一目標是克服fsck程序需要大量時間來完全恢復因文件更新操作期間發(fā)生的不正確關閉而損壞的磁盤結構的問題。EXT文件系統(tǒng)的唯一增加是journal,它預先記錄了將對文件系統(tǒng)執(zhí)行的改動。磁盤結構的其余部分和EXT2中是相同的。
EXT3中的journal并不是直接將數(shù)據(jù)寫入磁盤的數(shù)據(jù)區(qū)域,而是將文件數(shù)據(jù)及其元數(shù)據(jù)寫入到磁盤上的指定區(qū)域。一旦數(shù)據(jù)安全地存儲在硬盤上,它就可以合并到目標文件或附加到目標文件中,而這幾乎不會丟失數(shù)據(jù)。由于該數(shù)據(jù)被提交到磁盤的數(shù)據(jù)區(qū)域,因此需更新journal以便在發(fā)生系統(tǒng)故障時文件系統(tǒng)保持一致狀態(tài),然后該journal中的所有數(shù)據(jù)都被提交。在下次啟動時,將檢查文件系統(tǒng)是否存在不一致性,然后將journal中剩余的數(shù)據(jù)提交到磁盤的數(shù)據(jù)區(qū)域以完成對目標文件的更新。
日志化確實會降低數(shù)據(jù)寫入性能,但journal提供了三種選項可供用戶在性能,數(shù)據(jù)完整性和安全性之間進行選擇。我的個人偏好是安全性,因為我的環(huán)境不需要繁重的磁盤寫入操作。
日志函數(shù)最多可以減少在檢查硬盤驅動發(fā)現(xiàn)不一致性所需的時間:從幾小時(甚至幾天)到幾分鐘不等。多年來,我遇到了很多導致系統(tǒng)崩潰的問題。個中細節(jié)可以填滿另一篇文章,但足以證實大多數(shù)是自我原因造成的,就像踢掉電源插頭一樣。幸運的是,EXT日志化文件系統(tǒng)已將啟動恢復時間縮短到兩三分鐘。另外,自從我開始使用帶日志功能的EXT3以來,我從來沒有遇到丟失數(shù)據(jù)的問題了。
EXT3的日志功能可以關閉,然后作為EXT2文件系統(tǒng)運行。日志功能本身仍然存在,它是空的并且是未使用的。只需使用mount命令重新掛載分區(qū),使用type參數(shù)指定EXT2。您可以在命令行中執(zhí)行此操作,這取決于您使用的是哪個文件系統(tǒng),但是您可以更改/etc/fstab文件中的類型說明符,然后重新啟動。我強烈建議不要將EXT3文件系統(tǒng)作為EXT2使用,因為可能會丟失數(shù)據(jù)并延長恢復時間。
現(xiàn)有的EXT2文件系統(tǒng)可以通過使用以下命令添加日志來升級到EXT3。
tune2fs -j /dev/sda1
其中/dev/sda1是驅動器和分區(qū)標識符。確保在/etc/fstab中更改文件類型說明符,并重新啟動分區(qū)或重新啟動系統(tǒng)以使更改生效。
EXT4
EXT4文件系統(tǒng)主要改善了性能,可靠性和容量。為了提升可靠性,添加了元數(shù)據(jù)和日志校驗和。為了完成各種各樣的關鍵任務的需求,文件系統(tǒng)時間戳將時間間隔精確到了納秒。時間戳字段的兩個高位bit將2038年問題延續(xù)到了2446年——至少為EXT4文件系統(tǒng)延續(xù)了。
在EXT4中,數(shù)據(jù)分配從固定塊變成了擴展塊。一個擴展塊通過它在硬盤上的起始和結束位置來描述。這使得在一個單一節(jié)點指針條目中描述非常長的物理連續(xù)文件成為可能,它可以顯著減少大文件中的描述所有數(shù)據(jù)的位置的所需指針的數(shù)量。為了進一步減少碎片化,其他分配策略已經在EXT4中實現(xiàn)。
EXT4通過在磁盤上分散新創(chuàng)建的文件來減少碎片化,因此他們不會像早期的PC文件系統(tǒng),聚集在磁盤的起始位置。文件分配算法嘗試盡量將文件均勻的覆蓋到柱面組,而且當不得不產生碎片時,盡可能地將間斷文件范圍靠近同一個文件的其他碎片,來盡可能壓縮磁頭尋找和旋轉等待時間。當一個新文件創(chuàng)建的時候或者當一個已有文件擴大的時候,附加策略用于預分配額外磁盤空間。它有助于保證擴大文件不會導致它直接變?yōu)樗槠P挛募粫苯臃峙湓谝汛嬖谖募暮竺?,這也阻止了已存在文件的碎片化。
除了數(shù)據(jù)在磁盤的具體位置,EXT4使用一些功能策略,例如延遲分配,允許文件系統(tǒng)在分配空間之前先收集到要寫到磁盤的所有數(shù)據(jù)。這可以提高數(shù)據(jù)空間連續(xù)的概率。
之前的EXT文件系統(tǒng),例如EXT2和EXT3,可以掛載EXT4,來提升一些次要性能。不幸的是,它要求關掉一些EXT4的重要的新特性,因此我不建議這種做法。
從Fedora 14開始,EXT4已經是Fedora的默認文件系統(tǒng)。使用在Fedroa文檔描述的過程,一個EXT3文件系統(tǒng)可以升級到EXT4,然而由于剩余的EXT3元數(shù)據(jù)結構,它的性能仍然會受到影響。從EXT3升級到EXT4最好的方法是備份所有的目標文件系統(tǒng)分區(qū)的數(shù)據(jù),使用mkfs命令將一個空的EXT4文件系統(tǒng)寫到分區(qū),然后從備份恢復所有數(shù)據(jù)。
節(jié)點(Inode)
在之前描述過,節(jié)點是一個EXT文件系統(tǒng)的元數(shù)據(jù)的關鍵要素。圖2展示了節(jié)點和存儲在硬盤上的數(shù)據(jù)之間的關系。這個示意圖是目錄和單一文件的節(jié)點,在這種情況下,可能是高度碎片化文件的節(jié)點。EXT文件系統(tǒng)為減少碎片化而積極努力,因此你不會看到有很多間接數(shù)據(jù)塊或者數(shù)據(jù)區(qū)的文件。事實上,就像你將在下面看到的,碎片化在EXT文件系統(tǒng)中非常少見,因此大多節(jié)點會只用一個或者兩個直接數(shù)據(jù)指針而且不使用間接指針。
圖2:節(jié)點存儲了關于每個文件的信息和EXT文件系統(tǒng)對所有屬于它的數(shù)據(jù)的定位。
節(jié)點不包含文件的名稱。通過目錄項(directory entry)來訪問文件,它自己就是文件的名稱而且包含指向此節(jié)點的指針。指針的值是節(jié)點號。每個文件系統(tǒng)中的節(jié)點都有一個唯一的ID號,但是在同一個電腦(甚至同一個硬盤)的其他文件系統(tǒng)中的節(jié)點可以有相同的節(jié)點號。這會對硬連接產生一些后果,這方面內容超出了本文的范圍。
節(jié)點包含了文件的元數(shù)據(jù),包括它的類型和權限以及它的大小。節(jié)點也包含了15個指針的空間,來描述柱面組中數(shù)據(jù)部分中的數(shù)據(jù)塊或數(shù)據(jù)區(qū)的位置和長度。12個指針提供了數(shù)據(jù)區(qū)的直接訪問,而且對處理大部分文件都是足夠的。然而,對于有大量碎片的文件,它可能必須需要一些額外的空間,以間接節(jié)點的形式描述。從技術上來講,它們不是真正的節(jié)點,因此為了方便我使用短語“間接節(jié)點(node)”。
間接節(jié)點是文件系統(tǒng)中一個常規(guī)的數(shù)據(jù)塊,只用于描述數(shù)據(jù)而且不用存儲元數(shù)據(jù),因此可以支持超過15個指針。例如,一個大小為4K的塊可以支持512個4字節(jié)間接節(jié)點,允許一個單一文件包含12(直接)+512(間接)=524個區(qū)。同樣也支持雙重或三重間接節(jié)點,但是我們一般不太可能遇到需要這么多區(qū)的文件。
數(shù)據(jù)碎片
對于許多陳舊的PC文件系統(tǒng)(諸如FAT(及其所有變體)和NTFS),碎片化一直是導致磁盤性能下降的主要問題。碎片整理本身就成為一個行業(yè),囊括不同品牌的碎片整理軟件,其作用從非常有效到表現(xiàn)平平。
Linux擴展文件系統(tǒng)使用的數(shù)據(jù)分配策略,有助于最大限度地減少硬盤驅動器上文件的碎片,并在碎片發(fā)生時減少碎片效應。你可以在EXT文件系統(tǒng)上使用fsck命令來檢查整個文件系統(tǒng)的碎片。以下示例檢查我的主工作站的主目錄,該目錄僅有1.5%碎片化。請務必使用-n參數(shù),因為它可以防止fsck對所掃描的文件系統(tǒng)執(zhí)行任何操作。
fsck -fn /dev/mapper/vg_01-home
我曾經進行過一些理論上的計算,以確定磁盤碎片整理是否會導致性能顯著提高。雖然我確實做了一些假定,但我使用的磁盤性能數(shù)據(jù)來自新的300GB,Western Digital硬盤,具有2.0ms的磁軌間尋址時間。本例中的文件數(shù)量是我在計算當天存在于該文件系統(tǒng)中的實際數(shù)量。我確實假定每天都會觸發(fā)相當多的碎片文件(20%)。
表1: 碎片化對磁盤性能的理論上的影響
我已經做了兩次測算,每天總的附加尋址時間,一次是基于磁軌間尋址時間,這是由于EXT文件分配策略而導致大多數(shù)文件更可能出現(xiàn)的情況,另一種是平均尋址時間,我假定這會觸發(fā)相當于最壞的情形。
從表1可以看出,對于具有相當性能的硬盤驅動器的現(xiàn)代EXT文件系統(tǒng)來說,碎片化影響最小;對絕大多數(shù)應用程序來說可以忽略不計。你可以將實際環(huán)境中的數(shù)據(jù)插入到你自己的類似電子表格中,以得到你對性能影響的預期。這種計算方式很可能不會代表實際性能,但它可以提供對碎片話及其對系統(tǒng)的理論上的影響的一些洞察力。
我的大部分分區(qū)大約1.5%或1.6%碎片化;我確實有一個3.3%碎片化的分區(qū),但這是一個大的,128GB的文件系統(tǒng),擁有少于100個非常大的ISO映像文件;多年來,我不得不多次擴展此分區(qū),因為它太滿了。
這并不是說某些應用程序環(huán)境不需要更少的碎片文件的保證。EXT文件系統(tǒng)可以由知識淵博的管理員進行調整,他們可以調整參數(shù)以補償特定的工作負載類型。這可以在文件系統(tǒng)被創(chuàng)建時或之后使用tune2fs命令來完成。應對每次調優(yōu)改動的結果進行測試,細致地記錄并進行分析,以確保對目標環(huán)境達到最佳性能。在最差的情況下,如果性能無法提升到所需的水平,則可能有更適合特定工作負載的其他文件系統(tǒng)類型。請記住,在單個主機系統(tǒng)上混用文件系統(tǒng)類型以匹配每個文件系統(tǒng)上的負載是很常見的。
由于在大多數(shù)EXT文件系統(tǒng)中碎片數(shù)量很少,因此不需要進行碎片整理。無論如何,EXT文件系統(tǒng)都沒有安全的碎片整理工具。目前有幾個工具可以讓你檢查單個文件的碎片狀況或文件系統(tǒng)中剩余空閑空間的碎片化狀態(tài)。有一個工具,e4defrag,它將在可用空間允許的前提下對文件、目錄或文件系統(tǒng)進行盡可能地碎片化整理。顧名思義,它只適用于EXT4文件系統(tǒng)中的文件,并且存在一些局限性。
如果有必要對EXT文件系統(tǒng)執(zhí)行完全的碎片整理,則僅有一種方法可以可靠地工作。你必須移動文件系統(tǒng)中的所有文件以進行碎片整理,以確保在將文件安全復制到其他位置后將其刪除。如果可能的話,你可以增加文件系統(tǒng)的大小來輔助減少將來的碎片產生。然后將文件復制回目標文件系統(tǒng)。即使這樣做并不能保證所有的文件都會被完全去碎片化。
結論
20多年來,EXT文件系統(tǒng)一直是許多Linux發(fā)行版的默認文件系統(tǒng)。它們需要少量的維護就能提供穩(wěn)定性、高容量、可靠性和性能。我嘗試過其他文件系統(tǒng),但總是回到EXT。毫無疑問,EXT4文件系統(tǒng)應該用于大多數(shù)Linux系統(tǒng),除非有令人信服的理由去使用另一個文件系統(tǒng)。
評論
查看更多