Linux 內核的每次發行都伴隨一些驚喜,今年 12 月份發行的 2.6.28 也不例外。這個發行版是首個穩定的 ext4 文件系統(它還包含其他出色的特性,比如正在開發的 Btrfs)。這個下一代擴展文件系統提供更好的伸縮性、可靠性和許多新功能。ext4 的伸縮性如此之大,以致最大的文件系統所用的磁盤空間將達到 100 萬 TB。
第一個受 Linux 支持的文件系統是 Minix 文件系統。這個文件系統有嚴重的性能問題,因此出現了另一個針對 Linux 的文件系統,即擴展文件系統。第 1 個擴展文件系統(ext1)由 Remy Card 設計,並於 1992 年 4 月引入到 Linux 中。ext1 文件系統是第一個使用虛擬文件系統(VFS)交換的文件系統。虛擬文件系統交換是在 0.96c 內核中實現的,支持的最大文件系統爲 2 GB。
第 2 個擴展文件系統(ext2)也是由 Remy Card 實現的,並於 1993 年 1 月引入到 Linux 中。它借鑑了當時文件系統(比如 Berkeley Fast File System [FFS])的先進想法。ext2 支持的最大文件系統爲 2TB,但是 2.6 內核將該文件系統支持的最大容量提升到 32TB。
第 3 個擴展文件系統(ext3)是 Linux 文件系統的重大改進,儘管它在性能方面遜色於某些競爭對手。ext3 文件系統引入了日誌 概念,以在系統突然停止時提高文件系統的可靠性。雖然某些文件系統的性能更好(比如 Silicon Graphics 的 XFS 和 IBM® Journaled File System [JFS]),但 ext3 支持從使用 ext2 的系統進行就地(in-place)升級。ext3 由 Stephen Tweedie 實現,並於 2001 年 11 月引入。
今天,我們已經擁有第 4 個擴展文件系統(ext4)。ext4 在性能、伸縮性和可靠性方面進行了大量改進。最值得一提的是,ext4 支持 1 EB 的文件系統。ext4 是由 Theodore Tso(ext3 的維護者)領導的開發團隊實現的,並引入到 2.6.19 內核中。目前,它在 2.6.28 內核中已經很穩定(到 2008 年 12 月爲止)。
ext4 從競爭對手那裏借鑑了許多有用的概念。例如,在 JFS 中已經實現了使用區段(extent)來管理塊。另一個與塊管理相關的特性(延遲分配)已經在 XFS 和 Sun Microsystems 的 ZFS 中實現。
在 ext4 文件系統中,您可以發現各種改進和創新。這些改進包括新特性(新功能)、伸縮性(打破當前文件系統的限制)和可靠性(應對故障),當然也包括性能的改善。
ext4 引入了大量新功能,但最重要的是與 ext3 的向後和向前兼容性,以及在時間戳上的改進。這些改進立足於提高未來的 Linux 系統的性能。
由於 ext3 是 Linux 上最受歡迎的文件系統之一,因此應該能夠輕鬆遷移到 ext4。爲此,ext4 被設計爲在 extent 方面具有向後和向前兼容性(參見圖 1)。ext4 與 ext3 是向前兼容的,這樣就可以將 ext3 文件系統掛載爲 ext4 文件系統。爲了充分利用 ext4 的優勢,必須實現文件系統的遷移,以轉換和利用新的 ext4 格式。您還可以將 ext4 掛載爲 ext3(向後兼容),但前提是 ext4 文件系統不能使用區段(將在性能小節對其進行討論)。
除了兼容性特性之外,您還可以逐步地將 ext3 文件系統遷移到 ext4。這意味着沒有移動的舊文件可以保留 ext3 格式,但新的文件(或已被複制的舊文件)將採用新的 ext4 數據結構。您可以通過這種方式在線將 ext3 文件系統遷移到 ext4 文件系統。
令人驚訝的是,ext4 之前的擴展文件系統的時間戳都是以秒爲單位的。這已經能夠應付大多數設置,但隨着處理器的速度和集成程度(多核處理器)不斷提升,以及 Linux 開始向其他應用領域發展(比如高性能計算),基於秒的時間戳已經不夠用。ext4 設計時間戳時考慮到未來的發展,它將時間戳的單位提升到納秒。ext4 給時間範圍添加了兩個位,從而讓時間壽命再延長 500 年。
文件系統未來發展的一個重要方面就是伸縮性,即根據需求進行伸縮的能力。ext4 以多種方式現實了強大的伸縮性,它的伸縮性超越了 ext3,並且在文件系統元數據管理方面開闢了新領域。
ext4 的一個明顯差別就是它支持更大的文件系統、文件和子目錄。ext4 支持的最大文件系統爲 1 EB(1000 PB)。雖然根據今天的標準這個文件系統已經非常巨大,但存儲空間的消費會不斷增長,因此 ext4 必須考慮到未來的發展。ext4 支持最大 16 TB 的文件(假設由 4KB 的塊組成),這個容量是 ext3 的 8 倍。
最後,ext4 也擴展了子目錄的容量,將其從 32KB 擴展到無窮大。這是極端情況,我們還需要考慮文件系統的層次結構,因爲它的最大存儲容量爲 1 EB。此外,目錄索引也優化爲類似於散列 B 樹結構,因此儘管限制更加多,但 ext4 支持更快的查找。
ext3 分配空間的方式是其主要缺點之一。ext3 使用空閒空間位映射來分配文件,這種方式不是很快,並且伸縮性不強。ext3 的格式對小文件而言是很高效的,但對於大文件則恰恰相反。ext4 使用區段取代 ext3 的機制,從而改善了空間的分配,並且支持更加高效的存儲結構。區段 是一種表示一組相鄰塊的方式。使用區段減少了元數據,因爲區段維護關於一組相鄰塊的存儲位置的信息(從而減少了總體元數據存儲),而不是一個塊的存儲位置的信息。
ext4 的區段採用分層的方法高效地表示小文件,並且使用區段樹高效地表示大文件。例如,單個 ext4 inode 有足夠的空間來引用 4 個區段(每個區段表示一組相鄰的塊)。對於大文件(包括片段文件),一個 inode 能夠引用一個索引節點,而每個索引節點能夠引用一個葉節點(引用多個區段)。這種持續的區段樹爲大文件(尤其是分散的文件)提供豐富的表示方式。這些節點還包含自主檢查機制,以阻止文件系統損壞帶來威脅。
衡量一個新文件系統的最重要指標就是它的根本性能。這常常是最難實現的指標,因爲當文件系統變得龐大並且要求實現高可靠性時,將會以損害性能爲代價。但是,ext4 不僅解決了伸縮性和可靠性,它還提供各種改善性能的方法。
某些應用程序,比如數據庫或內容流,要求將文件存儲在相鄰的塊上(利用相鄰塊的讀優化和最大化讀的命令-塊比率)。儘管區段能夠將相鄰塊劃分爲片段,但另一種更強大的方法是按照所需的大小預分配比較大的相鄰塊(XFS 以前就是採用這種方法)。ext4 通過一個新的系統調用來實現這個目的,這個調用將按照特定的大小預分配並初始化文件。然後,您就可以寫入必要的數據,併爲數據提供不錯的讀性能。
另一個基於文件大小的優化是延遲分配。這種性能優化延遲磁盤上的物理塊的分配,直到塊被刷入到磁盤時才進行分配。這種優化的關鍵是延遲物理塊的分配,直到需要在磁盤上寫這些物理塊時纔對其進行分配並寫到相鄰的塊。這類似於持久化預分配,惟一的區別是文件系統會自動執行這項任務。不過如果預先知道文件的大小時,持久化預分配是更好的選擇。
這是最後一個與相鄰塊相關的優化,即針對 ext4 的塊分配器。在 ext3 中,塊分配器的工作方式是每次分配一個塊。當需要分配多個塊時,非相鄰塊中可能存在相鄰的數據。ext4 使用塊分配器修復了這個問題,它能夠在磁盤上一次分配多個塊。與前面其他優化一樣,這個優化在磁盤上收集相關的數據,以實現相鄰讀優化。
多個塊分配的另一個方面是分配塊時需要的處理量。記住,ext3 一次只分配一個塊。在最簡單的情況下,每個塊的分配都要有一個調用。如果一次分配多個塊,對塊分配器的調用就會大大減少,從而加快分配並減少處理量。
ext4 文件系統可能會擴展得比較大,這將導致可靠性問題。但 ext4 通過許多自主保護和自主修復機制來解決這個問題。
和 ext3 一樣,ext4 也是一個日誌文件系統。日誌記錄 就是通過日記(磁盤上相鄰區域的專門循環記錄)記錄文件系統的變更的過程。因此,根據日誌對物理存儲執行實際變更更加可靠,並且能夠確保一致性,即使在操作期間出現系統崩潰或電源中斷。這樣做可以減少文件系統損壞的機率。
但是即使進行日誌記錄,如果日誌出現錯誤仍然會導致文件系統損壞。爲了解決這個問題,ext4 對日誌執行校驗和,確保有效變更能夠在底層文件系統上正確完成。在 參考資料 小節可以找到其他關於日誌記錄(ext4 的重要部分)的資料。
ext4 支持根據用戶需求採用多種模式的日誌記錄。例如,ext4 支持 Writeback 模式,它僅記錄元數據;或 Ordered 模式,它記錄元數據,但寫爲元數據的數據是從日誌中寫入的;或 Journal 模式(最可靠的模式),它同時記錄元數據和數據。注意,雖然 Journal 模式是確保文件系統一致的最佳選擇,但它也是最慢的,因爲所有數據都要經過日誌。
儘管 ext4 添加一些特性來減少文件系統的碎片(比如將相鄰塊分配爲區段),但隨着系統使用時間的增加,碎片是難以完全避免的。因此出現了在線碎片整理工具,它們可以對文件系統和單個文件執行碎片整理,從而改善性能。在線碎片整理程序是一個簡單的工具,它將文件複製到引用相鄰區段的新 ext4 inode。
在線碎片整理還可以減少檢查文件系統所需的時間(fsck
)。ext4 將未使用的塊組標記到 inode 表中,並讓 fsck
進程忽略它們以加快檢查速度。當操作系統因內部損壞(隨着文件系統變大,這是不可避免的)而檢查文件系統時,ext4 的設計方式將能夠提高總體可靠性。
針對 Linux 的擴展文件系統有着漫長而豐富的歷史 — 從 1992 年首次引入 ext1 到 2008 年引入 ext4。ext4 是首個專門爲 Linux 設計的文件系統,並且事實證明它是高效、穩定、強大的文件系統。ext4 隨着文件系統研究的深入而不斷髮展,並且借鑑其他新文件系統的先進思想(比如 XFS、JFS、Reiser 和 IRON 容錯文件系統技術)。儘管目前預測 ext5 將會是什麼樣子還爲時過早,但有一點是很明確的,它將主導企業級 Liunx 系統。
學習
- 您可以參閱本文在 developerWorks 全球網站上的 英文原文。
- “Ubuntu 9.04 Receives EXT4 Support” 這篇文章在最新的 Ubuntu 發行版中尋找 ext4 的重大性能改進(與 JFS、XFS、ReiserFS 和 Ext3 對比)。
- 查看 ext4 kernel wiki(幫助您在自己的系統上運行 ext4)、Fedora ext4 page、Kernel Newbies ext4 page 和 Wikipedia,瞭解更多關於 ext4 的信息。您還可以通過 Wikipedia 的 Extended file system 頁面瞭解所有擴展文件系統(從 1 到 4),它提供關於文件系統比較和第 2 個擴展文件系統的歷史的鏈接。
- 通過 IBM Linux Technology Center 上的 “Ext4: The Next Generation of Ext2/3 Filesystem” 查看關於 ext4 的優秀介紹。
- 閱讀 Tim 的 “Linux 文件系統剖析”(developerWorks,2007 年 10 月)和 “Linux 日誌文件系統剖析”(developerWorks,2008 年 6 月),瞭解更多關於 Linux 文件系統和日誌文件系統的信息。
- 從 Softpedia 瞭解新發布的內核 2.6.28:2.6.28,從 Heise 在線瞭解 2.6.29:2.6.29。新發布的 2.6.28 和 2.6.29 內核取得了重大的進步。
- 更多地瞭解 ext4 的早期歷史。這篇於 2006 年發表的文章介紹了 Theodore Tso 關於未來 ext4 文件系統的早期建議。
- 從 University of Wisconsin-Madison 的站點上閱讀 Vijayan Prabhakaran's IRON File Systems dissertation。IRON (Internal RObustNess) 技術假設磁盤以獨特的方式失敗,並提供解決辦法。IRON 尤其建議使用日誌記錄進行失敗檢測和恢復。
- 更多地閱讀 Tim 在 developerWorks 上的文章。
- 在 developerWorks Linux 專區 尋找爲 Linux 開發人員(包括 Linux 新手入門)準備的更多參考資料,查閱我們 最受歡迎的文章和教程。
- 在 developerWorks 上查閱所有 Linux 技巧 和 Linux 教程。
- 隨時關注 developerWorks 的 技術活動和網絡廣播。
- http://zauc.wordpress.com/tag/ext4/(ext4-howto中文)