Linux的日志文件系統(tǒng)簡要剖析
在近代歷史上,日志文件系統(tǒng)被認為十分奇特,主要是處于研究階段。而如今,日志文件系統(tǒng)(ext3)已經(jīng)成為 Linux 的缺省文件系統(tǒng)。本文向大家揭示了日志文件系統(tǒng)背后的一些思想,以及在電源故障或系統(tǒng)崩潰時,如何提供更好的完整性。此外本文還介紹了現(xiàn)行的幾種日志文件 系統(tǒng)和下一代日志文件系統(tǒng)。
定義日志文件系統(tǒng)的方法有很多種,但是讓我們抓住要點。日志文件系統(tǒng)就是專為那些厭倦了一直盯著啟動時 fsck(即文件系統(tǒng)一致性檢查)的人而設計的(日志文件系統(tǒng)同樣適用于希望文件系統(tǒng)具有故障恢復能力的群體)。如果系統(tǒng)采用傳統(tǒng)的未提供日志功能的文件系統(tǒng),那么操作系統(tǒng)在檢測到系統(tǒng)為非正常關(guān)機時,會使用 fsck 應用程序執(zhí)行一致性檢驗。該應用程序會掃描文件系統(tǒng)(這要花費很長的時間),并修復任何可安全修復的問題。而在某些情況下,當文件系統(tǒng)損壞嚴重時,操作系統(tǒng)會啟動到單用戶模式,由用戶進行進一步的修復。
那么現(xiàn)在您應該清楚日志文件系統(tǒng)針對的是哪類人群了,但是他們是如何取締 fsck 的呢?籠統(tǒng)地說,日志文件系統(tǒng)就是通過維護一份日志來防止文件系統(tǒng)崩潰。所謂日志就是一種特殊的文件,它會在一個循環(huán)的緩沖區(qū)內(nèi)記錄文件系統(tǒng)的修改,然后 將其定期提交到文件系統(tǒng)。一旦系統(tǒng)發(fā)生崩潰,日志文件就會起到一個檢查點的作用,用于恢復未保存的信息,防止損壞文件系統(tǒng)元數(shù)據(jù)。
總之,日志文件系統(tǒng)就是一種具有故障恢復能力的文件系統(tǒng),它利用日志來記錄尚未提交到文件系統(tǒng)的修改,以防止元數(shù)據(jù)破壞(請參見圖 1)。但是如眾多其他 Linux 解決方案一樣,日志文件系統(tǒng)有多種方案供您選擇。下面就讓我們一起簡短回顧一下日志文件系統(tǒng)的歷史,然后再看一看現(xiàn)行的幾種文件系統(tǒng),看看它們之間有什么 區(qū)別。//本文轉(zhuǎn)自www.45it.com電腦軟硬件應用網(wǎng)
圖 1. 典型的日志文件系統(tǒng)
Linux 日志文件系統(tǒng)的歷史
最早的日志文件系統(tǒng)是 IBM-Journaled File System(JFS)。JFS 于 1990 年首次發(fā)行,而當前 Linux 支持的版本是后期開發(fā)的 JFS2。1994 年,Silicon Graphics 為 IRIX 操作系統(tǒng)引進了高性能的 XFS。XFS 于 2001 年被植入 Linux 系統(tǒng)中。1998 年開發(fā)的智能文件系統(tǒng)(SFS)起初是為 Amiga 開發(fā)的,但之后卻在 GNU Lesser General Public License(LGPL)下發(fā)行,并于 2005 年獲得了 Linux 的支持。最常用的日志文件系統(tǒng) ext3fs (third extended file system)是 ext2 的擴展,它增加了記錄日志的功能。從 2001 年起,Linux 系統(tǒng)中就開始支持 ext3fs。最終,ReiserFS 日志文件系統(tǒng)在其被引入之后,力壓群雄,被廣泛使用。但由于其原開發(fā)者的一些法律糾紛,ReiserFS 日志文件系統(tǒng)未能得到進一步的發(fā)展。
日志的幾種變體
日志文件系統(tǒng)是使用日志來緩沖文件系統(tǒng)的修改(同時也可以應用于緊急故障恢復)的,但可以根據(jù)記錄的時間與內(nèi)容采取不同的策略。其中,三種常見的策略為:回寫(writeback)、預定(ordered)和數(shù)據(jù)(data)。
在回寫模式 中,僅有元數(shù)據(jù)被記錄到日志,數(shù)據(jù)塊則被直接寫入到磁盤位置上。這樣可以保存文件系統(tǒng)結(jié)構(gòu),防止崩潰,但卻有可能發(fā)生數(shù)據(jù)崩潰(比如:在元數(shù)據(jù)記錄到日志后,數(shù)據(jù)塊寫入磁盤前,系統(tǒng)崩潰)。要想解決這個問題,您可以使用預定模式。預定模式 只將元數(shù)據(jù)記錄到日志,但是在此之前將數(shù)據(jù)寫入到磁盤。這樣就可以保證系統(tǒng)恢復后數(shù)據(jù)和文件系統(tǒng)的一致性。最后一種模式將數(shù)據(jù)也記錄到了日志中。在數(shù)據(jù)模式 中,元數(shù)據(jù)和數(shù)據(jù)都被記錄到日志中。這種模式可以最大限度地防止文件系統(tǒng)崩潰與數(shù)據(jù)丟失,但由于全部數(shù)據(jù)都寫入了兩次(先寫入日志,再寫入磁盤),系統(tǒng)性能可能會降低。
日志的提交也有很多種不同的策略。比如,是在日志將滿時,還是在超時后?
日志文件系統(tǒng)的現(xiàn)狀
如今,有幾種日志文件系統(tǒng)應用非常廣泛。每一種都有其自己的優(yōu)缺點。下面介紹現(xiàn)存最普遍的四種日志文件系統(tǒng)。
JFS2
JFS2(又稱 enhanced journaled file system)是最早期的日志文件系統(tǒng),在植入 Linux 之前已被應用于 IBM AIX? 操作系統(tǒng)多年。它是 64 位的文件系統(tǒng),雖然它是在原來的 JFS 的基礎(chǔ)上開發(fā)的,但卻較之有所改進,即:JFS2 具有更優(yōu)的擴展性能,而且支持多處理器架構(gòu)。
JFS2 支持預定的日志記錄方式,可以提高較高的性能,并實現(xiàn)亞秒級文件系統(tǒng)恢復。JFS2 同時為提高性能提供了基于分區(qū)的文件分配(Extent-based allocation)?;诜謪^(qū)的分配 是指對一組連續(xù)的塊而非單一的塊進行分配。由于這些塊在磁盤上是連續(xù)的,其讀取和寫入的性能就會更好。這種分配的另外一個優(yōu)勢就是可以將元數(shù)據(jù)管理最小化。按塊分配磁盤空間就意味著要逐塊更新元數(shù)據(jù)。而使用分區(qū),元數(shù)據(jù)則僅需按照分區(qū)(可以代表多個塊)更新。
JFS2 還使用了 B+ 樹,以便更快地查找目錄和管理分區(qū)描述符。JFS2 沒有內(nèi)部日志提交策略,而是在 kupdate 守護進程超時時提交。
XFS
XFS 是 Silicon Graphicsis 于 1995 年為 IRIX 操作系統(tǒng)開發(fā)的其他早期日志文件系統(tǒng)之一。它于 2001 年就已經(jīng)被植入 Linux,因此,它已經(jīng)成熟而且可靠。
XFS 支持 64 位全地址尋址,并以 B+ 樹為目錄和文件分配提供高性能。XFS 同樣使用了基于分區(qū)的分配,支持可變的塊大小(從 512 字節(jié)到 64KB )。除分區(qū)外,XFS 還采用延時分配,即等到塊將被寫入磁盤時,再為其分配磁盤空間。這樣所需磁盤空間總數(shù)就一目了然,因此這個功能提高了分配連續(xù)磁盤塊的可能性。
XFS 還有一些其他的有趣特性,它可以保證 rate 輸入輸出(I/O — 通過為文件系統(tǒng)用戶保留帶寬)和直接 I/O。其中,數(shù)據(jù)是直接在磁盤和用戶空間緩沖區(qū)間拷貝的(而不是從多個緩沖區(qū)進入)。XFS 采用回寫日志策略。
第三擴展文件系統(tǒng)(ext3fs)
第三擴展文件系統(tǒng)(third extended file system,ext3fs)是最流行的日志文件系統(tǒng),是由 ext2 文件系統(tǒng)演化而來。實際上,Ext3fs 可以與 ext2fs 兼容,這是因為 ext3fs 使用的結(jié)構(gòu)與 ext2fs 相同,僅僅多了一個日志而已。我們甚至可以把 ext3fs 的一部分當作 ext2 文件系統(tǒng)掛載,或者將 ext2 文件系統(tǒng)轉(zhuǎn)換成 ext3 文件系統(tǒng)(使用 tune2fs 實用程序)。
Ext3fs 允許用三種方式記錄日志(回寫,預定和數(shù)據(jù)),但預定模式為默認模式。日志提交策略也是可配置的,但是默認在日志填滿 1/4 時或其中一個提交計時器超時時,提交日志。
ext3fs 主要的弊端之一就是它最初不是作為日志文件系統(tǒng)而設計的。它是在 ext2fs 的基礎(chǔ)上開發(fā)的,因此缺少一些其他日志文件系統(tǒng)所具備的高級特性(例如分區(qū))。它在性能方面較之 ReiserFS、JFS 以及 XFS 也尤為遜色,但它所需要的 CPU 和內(nèi)存要比同類解決方案少。
ReiserFS
ReiserFS 是從一開始就按照記錄日志的意圖而開發(fā)的日志文件系統(tǒng)。ReiserFS 于 2001 年被引進到主流 2.4 內(nèi)核(Linux 采用的第一個日志文件系統(tǒng))。其默認的日志記錄方法為預定,且支持以在線調(diào)整大小的方式擴展文件系統(tǒng)。ReiserFS 同時還具有 tail packing 功能,顯著減少了磁盤碎片。在處理較小文件方面,ReiserFS 的速度要比 ext3f 快(當 tail packing 可用時)。
ReiserFS(又稱 ReiserFS v3)具有很多先進的功能,如 B+ 樹。該文件系統(tǒng)的基礎(chǔ)格式建立在單一的 B+ 樹的基礎(chǔ)之上,這使得搜索的效率和可伸縮性增強。提交策略則取決于日志的大小,但是要以待提交的塊的數(shù)量為基礎(chǔ)。
ReiserFS 也遇到了幾個問題 — 大多是最近出現(xiàn)的,這與其開發(fā)者遇到了一些法律糾紛有直接原因。
日志文件系統(tǒng)的未來
現(xiàn)在您已經(jīng)了解了現(xiàn)行的(和過去的)日志文件系統(tǒng),下面就讓我們看一看它的發(fā)展趨勢。
Reiser4
在成功地將 ReiserFS 合并到 Linux 內(nèi)核,并被很多的 Linux 發(fā)行版采用之后,Namesys(開發(fā) ReiserFS 的公司)便開始致力于新的日志文件系統(tǒng)的開發(fā)。Reiser4 被設計成為全新的日志文件系統(tǒng),它擁有很多先進的功能。
Resier4 擬定通過 wandering 日志和延遲分配塊直至日志提交(像在 XFS 中一樣)的方式來實現(xiàn)更優(yōu)秀的日志記錄。Reiser4 還設計有靈活的插件架構(gòu)(以支持諸如壓縮和加密之類的功能),但是被 Linux 社區(qū)拒絕了,因為這些在虛擬文件系統(tǒng)(virtual file system,VFS)被當作是最好的功能。
由于 Namesys 的所有者的堅持,所有關(guān)于 Reiser4 的商業(yè)活動都停止了。
第四擴展文件系統(tǒng)
第四擴展日志文件系統(tǒng)(fourth extended journaling file system,ext4fs)是由 ext3fs 演化而來。Ext4 文件系統(tǒng)被設計為具有向前和向后兼容性,但它具有許多新的高級特性(其中的一些特性破壞了兼容性)。這就意味著您可以將 ext4fs 的一部分作為 ext3fs 掛載,反之亦然。
首先,ext4fs 是 64 位文件系統(tǒng),并被設計為可以支持很大的容量(1 exabyte)。它還可以使用分區(qū),但是這樣做將失去與 ext3fs 的兼容性。像 XFS 和 Reiser4 一樣,ext4fs 還支持在必要時采取延時分配方式分配塊(這樣可以減少磁盤碎片)。日志的內(nèi)容也已經(jīng)執(zhí)行過檢查和(checksum),使日志更加可靠。ext4fs 并沒有采用標準的 B+ 或者 B* 樹,取而代之的是 B 樹的一種變體,叫做 H 樹,它支持更大的子目錄(ext3 的上限為 32KB )。
雖然延時分配的方法可以減少磁盤碎片,但時間久了,一個大的文件系統(tǒng)可能會成為碎片。為解決這個問題,開發(fā)了在線磁盤碎片整理工具(e4defrag)。您可以使用這個工具來整理單個的文件或者整個文件系統(tǒng)。
ext3fs 與 ext4fs 間的另一個有趣的區(qū)別就在于文件的日期分辨率。在 ext3 中,時間戳的最小分辨率為 1 秒。而 Ext4fs 是面向未來的:那時處理器和接口的速度會持續(xù)加快,需要更高的分辨率。因此,ext4 中時間戳的最小分辨率為 1 納秒。
Ext4fs 已被合并到自 2.6.19 以后的 Linux 內(nèi)核中,但它還是不夠穩(wěn)定。下一代系統(tǒng)的開發(fā)將繼續(xù)致力于此;輔之以上一代的優(yōu)勢, 它就會是下一代的 Linux 日志文件系統(tǒng)。
結(jié)束語
日志文件系統(tǒng)在系統(tǒng)崩潰或斷電時提供了可靠性,并防止系統(tǒng)崩潰。另外,與較傳統(tǒng)的文件系統(tǒng)方法(比如那些依賴于 fsck 的系統(tǒng))相比,日志文件系統(tǒng)大大地縮短了系統(tǒng)崩潰的恢復時間。新的日志記錄功能的開發(fā)要指望將來的新算法與結(jié)構(gòu),也要仰仗以前的算法與結(jié)構(gòu),將 JFS 和 XFS 的功能結(jié)合起來。將來日志文件系統(tǒng)到底會如何發(fā)展還不得而知,但可以確定的是它們會更具實用性,并會成為新的日志文件系統(tǒng)標準
評論