<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux的日志文件系統(tǒng)簡(jiǎn)要剖析

          Linux的日志文件系統(tǒng)簡(jiǎn)要剖析

          作者: 時(shí)間:2010-05-31 來(lái)源:網(wǎng)絡(luò) 收藏

          在近代歷史上,被認(rèn)為十分奇特,主要是處于研究階段。而如今,(ext3)已經(jīng)成為 的缺省文件系統(tǒng)。本文向大家揭示了背后的一些思想,以及在電源故障或系統(tǒng)崩潰時(shí),如何提供更好的完整性。此外本文還介紹了現(xiàn)行的幾種日志文件 系統(tǒng)和下一代日志文件系統(tǒng)。

            定義日志文件系統(tǒng)的方法有很多種,但是讓我們抓住要點(diǎn)。日志文件系統(tǒng)就是專為那些厭倦了一直盯著啟動(dòng)時(shí) fsck(即文件系統(tǒng)一致性檢查)的人而設(shè)計(jì)的(日志文件系統(tǒng)同樣適用于希望文件系統(tǒng)具有故障恢復(fù)能力的群體)。如果系統(tǒng)采用傳統(tǒng)的未提供日志功能的文件系統(tǒng),那么操作系統(tǒng)在檢測(cè)到系統(tǒng)為非正常關(guān)機(jī)時(shí),會(huì)使用 fsck 應(yīng)用程序執(zhí)行一致性檢驗(yàn)。該應(yīng)用程序會(huì)掃描文件系統(tǒng)(這要花費(fèi)很長(zhǎng)的時(shí)間),并修復(fù)任何可安全修復(fù)的問(wèn)題。而在某些情況下,當(dāng)文件系統(tǒng)損壞嚴(yán)重時(shí),操作系統(tǒng)會(huì)啟動(dòng)到單用戶模式,由用戶進(jìn)行進(jìn)一步的修復(fù)。

          本文引用地址:http://www.ex-cimer.com/article/257955.htm

            那么現(xiàn)在您應(yīng)該清楚日志文件系統(tǒng)針對(duì)的是哪類人群了,但是他們是如何取締 fsck 的呢?籠統(tǒng)地說(shuō),日志文件系統(tǒng)就是通過(guò)維護(hù)一份日志來(lái)防止文件系統(tǒng)崩潰。所謂日志就是一種特殊的文件,它會(huì)在一個(gè)循環(huán)的緩沖區(qū)內(nèi)記錄文件系統(tǒng)的修改,然后 將其定期提交到文件系統(tǒng)。一旦系統(tǒng)發(fā)生崩潰,日志文件就會(huì)起到一個(gè)檢查點(diǎn)的作用,用于恢復(fù)未保存的信息,防止損壞文件系統(tǒng)元數(shù)據(jù)。

            總之,日志文件系統(tǒng)就是一種具有故障恢復(fù)能力的文件系統(tǒng),它利用日志來(lái)記錄尚未提交到文件系統(tǒng)的修改,以防止元數(shù)據(jù)破壞(請(qǐng)參見(jiàn)圖 1)。但是如眾多其他 解決方案一樣,日志文件系統(tǒng)有多種方案供您選擇。下面就讓我們一起簡(jiǎn)短回顧一下日志文件系統(tǒng)的歷史,然后再看一看現(xiàn)行的幾種文件系統(tǒng),看看它們之間有什么 區(qū)別。//本文轉(zhuǎn)自www.45it.com電腦軟硬件應(yīng)用網(wǎng)


          圖 1. 典型的日志文件系統(tǒng)

            
          日志文件系統(tǒng)的歷史

            最早的日志文件系統(tǒng)是 IBM-Journaled File System(JFS)。JFS 于 1990 年首次發(fā)行,而當(dāng)前 Linux 支持的版本是后期開(kāi)發(fā)的 JFS2。1994 年,Silicon Graphics 為 IRIX 操作系統(tǒng)引進(jìn)了高性能的 XFS。XFS 于 2001 年被植入 Linux 系統(tǒng)中。1998 年開(kāi)發(fā)的智能文件系統(tǒng)(SFS)起初是為 Amiga 開(kāi)發(fā)的,但之后卻在 GNU Lesser General Public License(LGPL)下發(fā)行,并于 2005 年獲得了 Linux 的支持。最常用的日志文件系統(tǒng) (third extended file system)是 ext2 的擴(kuò)展,它增加了記錄日志的功能。從 2001 年起,Linux 系統(tǒng)中就開(kāi)始支持 。最終,ReiserFS 日志文件系統(tǒng)在其被引入之后,力壓群雄,被廣泛使用。但由于其原開(kāi)發(fā)者的一些法律糾紛,ReiserFS 日志文件系統(tǒng)未能得到進(jìn)一步的發(fā)展。

            
          日志的幾種變體

            日志文件系統(tǒng)是使用日志來(lái)緩沖文件系統(tǒng)的修改(同時(shí)也可以應(yīng)用于緊急故障恢復(fù))的,但可以根據(jù)記錄的時(shí)間與內(nèi)容采取不同的策略。其中,三種常見(jiàn)的策略為:回寫(writeback)、預(yù)定(ordered)和數(shù)據(jù)(data)。

            在回寫模式 中,僅有元數(shù)據(jù)被記錄到日志,數(shù)據(jù)塊則被直接寫入到磁盤位置上。這樣可以保存文件系統(tǒng)結(jié)構(gòu),防止崩潰,但卻有可能發(fā)生數(shù)據(jù)崩潰(比如:在元數(shù)據(jù)記錄到日志后,數(shù)據(jù)塊寫入磁盤前,系統(tǒng)崩潰)。要想解決這個(gè)問(wèn)題,您可以使用預(yù)定模式。預(yù)定模式 只將元數(shù)據(jù)記錄到日志,但是在此之前將數(shù)據(jù)寫入到磁盤。這樣就可以保證系統(tǒng)恢復(fù)后數(shù)據(jù)和文件系統(tǒng)的一致性。最后一種模式將數(shù)據(jù)也記錄到了日志中。在數(shù)據(jù)模式 中,元數(shù)據(jù)和數(shù)據(jù)都被記錄到日志中。這種模式可以最大限度地防止文件系統(tǒng)崩潰與數(shù)據(jù)丟失,但由于全部數(shù)據(jù)都寫入了兩次(先寫入日志,再寫入磁盤),系統(tǒng)性能可能會(huì)降低。

            日志的提交也有很多種不同的策略。比如,是在日志將滿時(shí),還是在超時(shí)后?

            
          日志文件系統(tǒng)的現(xiàn)狀

            如今,有幾種日志文件系統(tǒng)應(yīng)用非常廣泛。每一種都有其自己的優(yōu)缺點(diǎn)。下面介紹現(xiàn)存最普遍的四種日志文件系統(tǒng)。

            JFS2

            JFS2(又稱 enhanced journaled file system)是最早期的日志文件系統(tǒng),在植入 Linux 之前已被應(yīng)用于 IBM AIX? 操作系統(tǒng)多年。它是 64 位的文件系統(tǒng),雖然它是在原來(lái)的 JFS 的基礎(chǔ)上開(kāi)發(fā)的,但卻較之有所改進(jìn),即:JFS2 具有更優(yōu)的擴(kuò)展性能,而且支持多處理器架構(gòu)。

            JFS2 支持預(yù)定的日志記錄方式,可以提高較高的性能,并實(shí)現(xiàn)亞秒級(jí)文件系統(tǒng)恢復(fù)。JFS2 同時(shí)為提高性能提供了基于分區(qū)的文件分配(Extent-based allocation)?;诜謪^(qū)的分配 是指對(duì)一組連續(xù)的塊而非單一的塊進(jìn)行分配。由于這些塊在磁盤上是連續(xù)的,其讀取和寫入的性能就會(huì)更好。這種分配的另外一個(gè)優(yōu)勢(shì)就是可以將元數(shù)據(jù)管理最小化。按塊分配磁盤空間就意味著要逐塊更新元數(shù)據(jù)。而使用分區(qū),元數(shù)據(jù)則僅需按照分區(qū)(可以代表多個(gè)塊)更新。

            JFS2 還使用了 B+ 樹(shù),以便更快地查找目錄和管理分區(qū)描述符。JFS2 沒(méi)有內(nèi)部日志提交策略,而是在 kupdate 守護(hù)進(jìn)程超時(shí)時(shí)提交。

            XFS

            XFS 是 Silicon Graphicsis 于 1995 年為 IRIX 操作系統(tǒng)開(kāi)發(fā)的其他早期日志文件系統(tǒng)之一。它于 2001 年就已經(jīng)被植入 Linux,因此,它已經(jīng)成熟而且可靠。

            XFS 支持 64 位全地址尋址,并以 B+ 樹(shù)為目錄和文件分配提供高性能。XFS 同樣使用了基于分區(qū)的分配,支持可變的塊大?。◤?512 字節(jié)到 64KB )。除分區(qū)外,XFS 還采用延時(shí)分配,即等到塊將被寫入磁盤時(shí),再為其分配磁盤空間。這樣所需磁盤空間總數(shù)就一目了然,因此這個(gè)功能提高了分配連續(xù)磁盤塊的可能性。

            XFS 還有一些其他的有趣特性,它可以保證 rate 輸入輸出(I/O — 通過(guò)為文件系統(tǒng)用戶保留帶寬)和直接 I/O。其中,數(shù)據(jù)是直接在磁盤和用戶空間緩沖區(qū)間拷貝的(而不是從多個(gè)緩沖區(qū)進(jìn)入)。XFS 采用回寫日志策略。

            第三擴(kuò)展文件系統(tǒng)(

            第三擴(kuò)展文件系統(tǒng)(third extended file system,ext3fs)是最流行的日志文件系統(tǒng),是由 ext2 文件系統(tǒng)演化而來(lái)。實(shí)際上,Ext3fs 可以與 ext2fs 兼容,這是因?yàn)?ext3fs 使用的結(jié)構(gòu)與 ext2fs 相同,僅僅多了一個(gè)日志而已。我們甚至可以把 ext3fs 的一部分當(dāng)作 ext2 文件系統(tǒng)掛載,或者將 ext2 文件系統(tǒng)轉(zhuǎn)換成 ext3 文件系統(tǒng)(使用 tune2fs 實(shí)用程序)。

            Ext3fs 允許用三種方式記錄日志(回寫,預(yù)定和數(shù)據(jù)),但預(yù)定模式為默認(rèn)模式。日志提交策略也是可配置的,但是默認(rèn)在日志填滿 1/4 時(shí)或其中一個(gè)提交計(jì)時(shí)器超時(shí)時(shí),提交日志。

            ext3fs 主要的弊端之一就是它最初不是作為日志文件系統(tǒng)而設(shè)計(jì)的。它是在 ext2fs 的基礎(chǔ)上開(kāi)發(fā)的,因此缺少一些其他日志文件系統(tǒng)所具備的高級(jí)特性(例如分區(qū))。它在性能方面較之 ReiserFS、JFS 以及 XFS 也尤為遜色,但它所需要的 CPU 和內(nèi)存要比同類解決方案少。

            ReiserFS

            ReiserFS 是從一開(kāi)始就按照記錄日志的意圖而開(kāi)發(fā)的日志文件系統(tǒng)。ReiserFS 于 2001 年被引進(jìn)到主流 2.4 內(nèi)核(Linux 采用的第一個(gè)日志文件系統(tǒng))。其默認(rèn)的日志記錄方法為預(yù)定,且支持以在線調(diào)整大小的方式擴(kuò)展文件系統(tǒng)。ReiserFS 同時(shí)還具有 tail packing 功能,顯著減少了磁盤碎片。在處理較小文件方面,ReiserFS 的速度要比 ext3f 快(當(dāng) tail packing 可用時(shí))。

            ReiserFS(又稱 ReiserFS v3)具有很多先進(jìn)的功能,如 B+ 樹(shù)。該文件系統(tǒng)的基礎(chǔ)格式建立在單一的 B+ 樹(shù)的基礎(chǔ)之上,這使得搜索的效率和可伸縮性增強(qiáng)。提交策略則取決于日志的大小,但是要以待提交的塊的數(shù)量為基礎(chǔ)。

            ReiserFS 也遇到了幾個(gè)問(wèn)題 — 大多是最近出現(xiàn)的,這與其開(kāi)發(fā)者遇到了一些法律糾紛有直接原因。

            
          日志文件系統(tǒng)的未來(lái)

            現(xiàn)在您已經(jīng)了解了現(xiàn)行的(和過(guò)去的)日志文件系統(tǒng),下面就讓我們看一看它的發(fā)展趨勢(shì)。

            Reiser4

            在成功地將 ReiserFS 合并到 Linux 內(nèi)核,并被很多的 Linux 發(fā)行版采用之后,Namesys(開(kāi)發(fā) ReiserFS 的公司)便開(kāi)始致力于新的日志文件系統(tǒng)的開(kāi)發(fā)。Reiser4 被設(shè)計(jì)成為全新的日志文件系統(tǒng),它擁有很多先進(jìn)的功能。

            Resier4 擬定通過(guò) wandering 日志和延遲分配塊直至日志提交(像在 XFS 中一樣)的方式來(lái)實(shí)現(xiàn)更優(yōu)秀的日志記錄。Reiser4 還設(shè)計(jì)有靈活的插件架構(gòu)(以支持諸如壓縮和加密之類的功能),但是被 Linux 社區(qū)拒絕了,因?yàn)檫@些在虛擬文件系統(tǒng)(virtual file system,VFS)被當(dāng)作是最好的功能。

            由于 Namesys 的所有者的堅(jiān)持,所有關(guān)于 Reiser4 的商業(yè)活動(dòng)都停止了。

            第四擴(kuò)展文件系統(tǒng)

            第四擴(kuò)展日志文件系統(tǒng)(fourth extended journaling file system,ext4fs)是由 ext3fs 演化而來(lái)。Ext4 文件系統(tǒng)被設(shè)計(jì)為具有向前和向后兼容性,但它具有許多新的高級(jí)特性(其中的一些特性破壞了兼容性)。這就意味著您可以將 ext4fs 的一部分作為 ext3fs 掛載,反之亦然。

            首先,ext4fs 是 64 位文件系統(tǒng),并被設(shè)計(jì)為可以支持很大的容量(1 exabyte)。它還可以使用分區(qū),但是這樣做將失去與 ext3fs 的兼容性。像 XFS 和 Reiser4 一樣,ext4fs 還支持在必要時(shí)采取延時(shí)分配方式分配塊(這樣可以減少磁盤碎片)。日志的內(nèi)容也已經(jīng)執(zhí)行過(guò)檢查和(checksum),使日志更加可靠。ext4fs 并沒(méi)有采用標(biāo)準(zhǔn)的 B+ 或者 B* 樹(shù),取而代之的是 B 樹(shù)的一種變體,叫做 H 樹(shù),它支持更大的子目錄(ext3 的上限為 32KB )。

            雖然延時(shí)分配的方法可以減少磁盤碎片,但時(shí)間久了,一個(gè)大的文件系統(tǒng)可能會(huì)成為碎片。為解決這個(gè)問(wèn)題,開(kāi)發(fā)了在線磁盤碎片整理工具(e4defrag)。您可以使用這個(gè)工具來(lái)整理單個(gè)的文件或者整個(gè)文件系統(tǒng)。

            ext3fs 與 ext4fs 間的另一個(gè)有趣的區(qū)別就在于文件的日期分辨率。在 ext3 中,時(shí)間戳的最小分辨率為 1 秒。而 Ext4fs 是面向未來(lái)的:那時(shí)處理器和接口的速度會(huì)持續(xù)加快,需要更高的分辨率。因此,ext4 中時(shí)間戳的最小分辨率為 1 納秒。

            Ext4fs 已被合并到自 2.6.19 以后的 Linux 內(nèi)核中,但它還是不夠穩(wěn)定。下一代系統(tǒng)的開(kāi)發(fā)將繼續(xù)致力于此;輔之以上一代的優(yōu)勢(shì), 它就會(huì)是下一代的 Linux 日志文件系統(tǒng)。

            
          結(jié)束語(yǔ)

            日志文件系統(tǒng)在系統(tǒng)崩潰或斷電時(shí)提供了可靠性,并防止系統(tǒng)崩潰。另外,與較傳統(tǒng)的文件系統(tǒng)方法(比如那些依賴于 fsck 的系統(tǒng))相比,日志文件系統(tǒng)大大地縮短了系統(tǒng)崩潰的恢復(fù)時(shí)間。新的日志記錄功能的開(kāi)發(fā)要指望將來(lái)的新算法與結(jié)構(gòu),也要仰仗以前的算法與結(jié)構(gòu),將 JFS 和 XFS 的功能結(jié)合起來(lái)。將來(lái)日志文件系統(tǒng)到底會(huì)如何發(fā)展還不得而知,但可以確定的是它們會(huì)更具實(shí)用性,并會(huì)成為新的日志文件系統(tǒng)標(biāo)準(zhǔn)

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();