电竞比分网-中国电竞赛事及体育赛事平台

分享

高級文件系統(tǒng)實(shí)現(xiàn)者指南

 xiaochong 2007-02-14
 高級文件系統(tǒng)實(shí)現(xiàn)者指南 (linux gentoo)

你能在 http://www-900.ibm.com/developerWorks/cn/ 找到更多的資料

 

日志和 ReiserFS

Daniel Robbins (drobbins@)
總裁/CEO,Gentoo Technologies, Inc
2001 年 6 月

伴 隨著 Linux 2.4 版本的發(fā)行,出現(xiàn)了大量的文件系統(tǒng)可能性,其中包括 ReiserFS、XFS、GFS 和其它文件系統(tǒng)。這些文件系統(tǒng)聽起來的確都很酷,但是它們真正能做些什么呢,擅長在哪些方面,以及在 Linux 產(chǎn)品環(huán)境下如何才能安全地使用它們呢?在高級文件系統(tǒng)實(shí)現(xiàn)者指南中,Daniel Robbins 通過向您展示如何在 Linux 2.4 的環(huán)境下建立這些新的高級文件系統(tǒng)來回答以上的問題。遵從這個方法,他提供了在實(shí)際實(shí)現(xiàn)過程中的有價值的建議,性能信息和重要的技術(shù)性注意要點(diǎn),以便于您 在新的文件系統(tǒng)中能有令人愉快的經(jīng)歷。在這里,也就是這個系列的第一篇文章中,他解說了日志和 ReiserFS 的優(yōu)點(diǎn)。

準(zhǔn)備好的內(nèi)容
這 一系列文章的目的是向您詳實(shí)地介紹 Linux 的各種新的文件系統(tǒng),包括 ReiserFS、XFS、JFS、GFS、ext3 和其它的文件系統(tǒng)。我要讓您知道一些必要的實(shí)用知識,有了這些知識您才能開始使用這些文件系統(tǒng)。我的目標(biāo)是幫助您盡可能地避免潛在的隱患;這就是說,我們 將仔細(xì)地了解一下文件系統(tǒng)的穩(wěn)定性、性能問題(或好或差)、您應(yīng)該知道的任何的負(fù)面應(yīng)用程序交互作用、內(nèi)核與補(bǔ)丁的最佳搭配以及更多內(nèi)容。您可以把這一系 列的文章看成是這些下一代文件系統(tǒng)的“內(nèi)幕指南”。

這就是準(zhǔn)備好的內(nèi)容。但是要開始這一系列工作,我還有一篇文章要脫離這個主題,用來為接 下來的行程做準(zhǔn)備。我將會涉及兩個對于 Linux 開發(fā)社區(qū)非常重要的主題 — 日志和 ReiserFS 后的設(shè)計理念。日志是非常重要的,因為它是我們長期以來一直期待的技術(shù),而現(xiàn)在終于出現(xiàn)了。在 ReiserFS、XFS、JFS、ext3 和 GFS 中都用到它。確切地理解日志是做什么的和為什么 Linux 需要它是非常重要的。即使您對日志已有所掌握,我還是希望我有關(guān)日志的介紹可以成為一個好的模型,以用來向其他人解釋這項技術(shù),或者作為一項慣例,以利于 全世界的部門和組織開始向這些新的日志文件系統(tǒng)進(jìn)行轉(zhuǎn)變。這個過程通常是由“Linux guy/gal”開始的,就像您自己也會說服其他人應(yīng)該這么做。

在 這篇文章的后半部分,我們將看看 ReiserFS 后的設(shè)計理念。通過這么做,我們能夠很好地掌握一個事實(shí),那就是這些新的文件系統(tǒng)并不只是為了做同樣的事比老的系統(tǒng)快一點(diǎn)。它們還允許我們用以前完全不可 能的方法來處理事情。開發(fā)人員在閱讀這一系列文章時應(yīng)該牢記這一點(diǎn)。這些新的文件系統(tǒng)的能力很可能對您今后的 Linux 軟件開發(fā)工程的代碼編寫產(chǎn)生影響。

理解日志:元數(shù)據(jù)
正如您所了解的那樣,文件系統(tǒng)的存在允許您儲存、檢索和操作數(shù)據(jù)。為了實(shí)現(xiàn)這一目的,文件系統(tǒng)需要保持一個內(nèi)在的數(shù)據(jù)結(jié)構(gòu)使得您的數(shù)據(jù)有組織并且便于訪問。這一內(nèi)部的數(shù)據(jù)結(jié)構(gòu)(確切地說就是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”)被稱為 元數(shù)據(jù)。就是這個元數(shù)據(jù)的結(jié)構(gòu)為文件系統(tǒng)提供了其特定的身份和性能特征。

通 常,我們并不直接和文件系統(tǒng)的元數(shù)據(jù)打交道。而是一個特別的 Linux 文件系統(tǒng)驅(qū)動程序為我們作相應(yīng)的工作。Linux 文件系統(tǒng)驅(qū)動程序是專門用來操作復(fù)雜的元數(shù)據(jù)的。然而,為了使得文件系統(tǒng)驅(qū)動程序正常工作,有一個很重要的必要條件;它需要在某種合理的、一致的和沒有干 擾的狀態(tài)下找到元數(shù)據(jù)。否則,文件系統(tǒng)驅(qū)動程序就不能理解和操作元數(shù)據(jù),那么您也就不能存取文件了。

理解日志:fsck
這 就引出了 fsck。當(dāng) Linux 系統(tǒng)啟動時,fsck 啟動并掃描系統(tǒng)的 /etc/fstab 文件中列出的所有本地文件系統(tǒng)。fsck 的工作就是確保要裝載的文件系統(tǒng)的元數(shù)據(jù)是處于可使用的狀態(tài)。大多數(shù)的時候是可使用的。當(dāng) Linux 關(guān)閉時,它仔細(xì)地把所有的緩沖區(qū)數(shù)據(jù)轉(zhuǎn)送到磁盤,并確保文件系統(tǒng)被徹底卸載,以保證系統(tǒng)再次啟動時能夠使用。典型的就是,fsck 掃描那些將被裝載的文件系統(tǒng),確定它們已被徹底卸載,并做出合理的假設(shè) — 所有的元數(shù)據(jù)都沒有問題。

然而,我們都知道不時地會有一些意外發(fā) 生,例如意想不到的電源故障或者系統(tǒng)掛起。當(dāng)出現(xiàn)這些不幸的情況時,Linux 沒有機(jī)會徹底卸載文件系統(tǒng)。當(dāng)系統(tǒng)重新啟動,fsck 開始掃描時,它會檢測到這些沒有徹底卸載的文件系統(tǒng),并做出合理的假設(shè) — 文件系統(tǒng)可能沒有為 Linux 文件系統(tǒng)驅(qū)動程序準(zhǔn)備好。這就很有可能導(dǎo)致元數(shù)據(jù)在某種情況下陷入困境。

所以,為了彌補(bǔ)這種情況,fsck 將開始徹底的掃描并且全面地檢查元數(shù)據(jù),修正這一過程中找到的任何錯誤。一旦 fsck 完成這樣的工作,文件系統(tǒng)就可以使用了。盡管意想不到的電源故障或者系統(tǒng)掛起可能造成最近修改的數(shù)據(jù)丟失,但是由于元數(shù)據(jù)現(xiàn)在是一致的,文件系統(tǒng)就可以被 裝載和投入使用了。

fsck 的問題
迄今為止,為確保文件系統(tǒng)的一致性,這種方法可能聽起來并不是個壞主意,但是卻不是最佳的解決方案。問題出自于這樣一個事實(shí) — fsck 必須掃描文件系統(tǒng)全部的元數(shù)據(jù),以確保文件系統(tǒng)的一致性。對所有的元數(shù)據(jù)做徹底的一致性檢查是一項極為費(fèi)時的工作。通常至少要花上好幾分鐘才能完成。更糟糕的是,文件系統(tǒng)越大,完成這個徹底的掃描所花費(fèi)的時間就 越長。 這就是個大問題,因為當(dāng) fsck 做它自己事情的時候,您的 Linux 系統(tǒng)實(shí)際上就是被切斷的,并且如果您有一個龐大數(shù)量的文件系統(tǒng)存儲,您的系統(tǒng)可能就會花上半個小時或者更長的時間來執(zhí)行 fsck。當(dāng)然,在任務(wù)緊要的數(shù)據(jù)中心的環(huán)境里,也就是在系統(tǒng)正常運(yùn)行極為重要的環(huán)境下,標(biāo)準(zhǔn)的 fsck 工作可能會造成破壞性的結(jié)果。幸運(yùn)的是,有更好的解決方案。

日志
日 志文件系統(tǒng)通過增加一個叫做日志的新的數(shù)據(jù)結(jié)構(gòu)來解決這個 fsck 問題。這個日志是位于磁盤上的結(jié)構(gòu)。在對元數(shù)據(jù)做任何改變以前,文件系統(tǒng)驅(qū)動程序會向日志中寫入一個條目,這個條目描述了它將要做些什么。然后,它繼續(xù)并 修改元數(shù)據(jù)。通過這種方法,日志文件系統(tǒng)就擁有了近期元數(shù)據(jù)被修改的歷史記錄,當(dāng)檢查到?jīng)]有徹底卸載的文件系統(tǒng)的一致性問題時,這個記錄就唾手可得了。

可以這樣來看待日志文件系統(tǒng) — 除了存儲數(shù)據(jù)(您的素材)和元數(shù)據(jù)(關(guān)于素材的數(shù)據(jù))以外,它們還有一個日志。您可以稱它們?yōu)樵獢?shù)據(jù)(關(guān)于素材數(shù)據(jù)的數(shù)據(jù))。

運(yùn)作中的日志
那 么,fsck 如何處理日志文件系統(tǒng)呢?實(shí)際上,通常它什么都不做。它只是忽略文件系統(tǒng)并允許它被裝載。在快速地恢復(fù)文件系統(tǒng)到達(dá)一致性狀態(tài)的背后,真正起作用的在于 Linux 文件系統(tǒng)驅(qū)動程序中。當(dāng)文件系統(tǒng)被裝載時,Linux 文件系統(tǒng)驅(qū)動程序查看文件系統(tǒng)是否完好。如果由于某些原因出了問題,那么就需要對元數(shù)據(jù)進(jìn)行修復(fù),但不是執(zhí)行對元數(shù)據(jù)的徹底掃描(就像 fsck 那樣),而是查看日志。由于日志中包含了按時間順序排列的近期的元數(shù)據(jù)修改記錄,它就簡單地查看 最近被修改的那部分元數(shù)據(jù)。因而,它能夠在幾秒鐘時間內(nèi)將文件系統(tǒng)恢復(fù)到一致性狀態(tài)。并且與 fsck 所采用的傳統(tǒng)方法不同,這個日志重放過程在大型的文件系統(tǒng)上并不需要花更多的時間。多虧了日志,數(shù)百 G 的文件系統(tǒng)元數(shù)據(jù)幾乎能在瞬間恢復(fù)到一致性的狀態(tài)。

ReiserFS
現(xiàn)在,我們來談一談 ReiserFS,它是我們將要研究的幾個日志文件系統(tǒng)中的第一個。ReiserFS 3.6.x(作為 Linux 2.4 一部分的版本)是由 Hans Reiser 和他的在 Namesys 的開發(fā)組共同開發(fā)設(shè)計的。Hans 和他的組員們相信最好的文件系統(tǒng)是那些能夠有助于創(chuàng)建獨(dú)立的共享環(huán)境或者命名空間的文件系統(tǒng),應(yīng)用程序可以在其中更直接、有效和有力地相互作用。為了實(shí)現(xiàn) 這一目標(biāo),文件系統(tǒng)就應(yīng)該滿足其使用者對性能和功能方面的需要。那樣,使用者就能夠繼續(xù)直接地使用文件系統(tǒng),而不必建造運(yùn)行在文件系統(tǒng)之上(如數(shù)據(jù)庫之 類)的特殊目的層。

小文件的性能
那 么,如何能使文件系統(tǒng)更加適應(yīng)環(huán)境呢?Namesys 已經(jīng)決定著眼于文件系統(tǒng)的一個方面,至少最初是 — 小文件的性能。通常,像 ext2 和 ufs 這樣的文件系統(tǒng)在這一方面做的并不是很好,經(jīng)常迫使開發(fā)人員轉(zhuǎn)向數(shù)據(jù)庫或者特別組織的處理來獲取他們所需要的某種性能。隨著時間的推移,這種“圍繞問題進(jìn) 行編碼”的方法慫恿了代碼的膨脹和許多不兼容的特殊目的 API,這并不是好事情。

這兒有一個 ext2 如何鼓勵這種編程的例子。ext2 很擅長存儲大量大小在 20k 以上的文件,但是對于存儲 2,000 個 50 字節(jié)的文件來說,它就不是一種很理想的技術(shù)了。當(dāng) ext2 必須處理非常小的文件時,不只是性能顯著地下降,而且存儲效率也同樣下降,因為 ext2 是按 1k 或者 4k 的塊來分配空間的(可在文件系統(tǒng)創(chuàng)建時設(shè)定)。

現(xiàn)在,常規(guī)的明智做法會提示您不應(yīng)該在文件系統(tǒng)上儲 存這么多小的文件。而是應(yīng)該存儲在某種運(yùn)行在文件系統(tǒng)之上的數(shù)據(jù)庫里。作為對這種說法的回應(yīng),Hans Reiser 指出無論何時您需要在文件系統(tǒng)的頂上建立一層,那就意味著文件系統(tǒng)不滿足您的需要。如果文件系統(tǒng)滿足您的需要,那么您首先就要避免使用特殊目的的解決方 案。這樣就可以節(jié)省開發(fā)的時間,并消除代碼膨脹。這些代碼可能是在您手動處理自己的個人存儲器或者緩沖機(jī)制時,或者與數(shù)據(jù)庫的某個庫交互作用過程時所產(chǎn)生 的。

理論上是這樣。但是在實(shí)際運(yùn)用中,ReiserFS 的小文件性能會是如何的好呢?好得讓人吃驚。實(shí)際上,當(dāng)處理小于 1k 的文件時,ReiserFS 大概要比 ext2 快 8 到 15 倍!更妙的是,這些性能提高并不以其它文件類型的性能損失為代價。通常,ReiserFS 幾乎在各個方面都優(yōu)于 ext2,但是在處理小文件時才真正體現(xiàn)出了其閃光點(diǎn)。

ReiserFS 技術(shù)
那 么 ReiserFS 是怎樣提供如此出色的小文件性能的呢?ReiserFS 使用了特殊的優(yōu)化 b* 平衡樹(每個文件系統(tǒng)一個)來組織所有的文件系統(tǒng)數(shù)據(jù)。這為其自身提供了非常不錯的性能改進(jìn),也能夠減輕文件系統(tǒng)設(shè)計上的人為約束。例如,現(xiàn)在一個目錄下 可以容納 100,000 個子目錄。另一個使用 b* 樹的好處就是 ReiserFS 能夠像大多其它的下一代文件系統(tǒng)一樣,根據(jù)需要動態(tài)地分配索引節(jié),而不必在文件系統(tǒng)創(chuàng)建時建立固定的索引節(jié)。這有助于文件系統(tǒng)更靈活地適應(yīng)其面臨的各種存 儲需要,同時提供附加的空間有效率。

ReiserFS 有許多特征是特別針對提高小文件的性能的。和 ext2 不同,ReiserFS 并不固定地以 1k 或者 4k 的塊分配存儲空間,而是分配所需要的精確尺寸。而且 ReiserFS 也包括了以尾文件為中心的特殊優(yōu)化 — 尾文件是指那些比文件系統(tǒng)塊小的文件及文件結(jié)尾部分。為了提高性能,ReiserFS 能夠在 b* 樹的葉子節(jié)點(diǎn)存儲文件,而不是把數(shù)據(jù)存儲在磁盤的其它地方再指向它。

這做了兩件事。第一,它顯著地提高了小文件的性能。由于文件數(shù)據(jù)和 stat_data(索引節(jié))信息是緊挨著存儲的,它們通常能被同一次磁盤 IO 操作所讀取。第二,ReiserFS 能夠壓縮尾文件,節(jié)省大量磁盤空間。實(shí)際上,帶有尾文件壓縮功能(默認(rèn))的 ReiserFS 文件系統(tǒng)可以比同等的 ext2 文件系統(tǒng)多存儲 6 個百分點(diǎn)的數(shù)據(jù),這就其自身來說是令人驚嘆的。

然而,由于在文件被修改時,尾文件壓縮迫使 ReiserFS 重裝數(shù)據(jù),這就導(dǎo)致了性能上的輕微折損。鑒于這個原因,ReiserFS 尾文件壓縮可以被關(guān)掉,允許系統(tǒng)管理員在速度與空間有效率上做出選擇,或者犧牲一些存儲能力來換取更高的速度。

ReiserFS 確實(shí)是一個非常出色的文件系統(tǒng)。在我的下一篇文章中,我將會指導(dǎo)您在 Linux 2.4 下完成 ReiserFS 安裝的全過程。我們還將仔細(xì)地看一看性能調(diào)整,應(yīng)用程序交互作用(和怎么圍繞他們工作)以及使用的最佳內(nèi)核等等。

隨 著 Linux 2.4 的發(fā)行,出現(xiàn)了使用很多新的文件系統(tǒng)的可能性, 包括 ReiserFS、XFS、GFS 和另外一些文件系統(tǒng)。這些文件系統(tǒng)聽起來很“酷”,但是它們到底能做些什么呢,它們擅長什么,還有您究竟怎樣才能在一個產(chǎn)品 Linux 環(huán)境中安全地使用它們呢?在本系列文章中,Daniel Robbins 通過向您展示怎樣在 Linux 2.4 下安裝這些新的高級文件系統(tǒng),回答了這些問題。在他的本系列前面的文章中, Daniel 介紹了日志和 ReiserFS 的好處。在本文中 Daniel 將教您安裝一個非常穩(wěn)定的基于 Linux 2.4 的 ReiserFS 系統(tǒng)。

在 本文中,我會向您展示如何讓 ReiserFS 運(yùn)行在 2.4 系列的內(nèi)核下。我還會和您分享很多關(guān)于不同主題的技術(shù)信息,包括使用 ReiserFS 最好的 2.4 內(nèi)核,性能注意事項等等。因為我首先會談到安裝,所以我建議您先通讀本文,然后再遵循安裝指示。這樣,您開始在自己的系統(tǒng)上運(yùn)行 ReiserFS 的時候,腦子里就會有所有的技術(shù)注解,這樣您就可以在各個步驟作必要的調(diào)整。

尋找好的內(nèi)核
要 在您的系統(tǒng)上使用 ReiserFS,您首先需要找到一個合適的內(nèi)核。如果您已經(jīng)熟悉 2.4 內(nèi)核的發(fā)展,您就會知道這個過程比它聽起來要復(fù)雜。本文完成時,最新的內(nèi)核是 2.4.6-pre2;但是我建議您在自己的 ReiserFS 系統(tǒng)上還是使用 2.4.4(標(biāo)準(zhǔn)的 Linus 內(nèi)核)或者 2.4.4-ac9(稍作改進(jìn)的 Alan Cox 內(nèi)核)。從我的測試看來,2.4.5 似乎很不穩(wěn)定,所以我不推薦將這個內(nèi)核作為產(chǎn)品使用;讓我們希望 2.4.6 會比它好很多吧。

如果 您想在自己的產(chǎn)品 ReiserFS 系統(tǒng)中使用除 2.4.4 或 2.4.4-ac9 以外的其它內(nèi)核, 一定要作必要的檢查以確保 ReiserFS(和內(nèi)核大體上)是穩(wěn)定的。當(dāng)然,如果您是在一個測試服務(wù)器上安裝 ReiserFS,只要不會丟失重要的數(shù)據(jù),您就可以隨意使用任一種內(nèi)核。

總的來說,要注意內(nèi)核穩(wěn)定性問題,特別是 ReiserFS 的穩(wěn)定性問題,這有兩個原因。因為 ReiserFS 是一個“實(shí)驗的”內(nèi)核功能,您不能假定一個使用新內(nèi)核的 ReiserFs 實(shí)現(xiàn)剛剛從 tarball 中解出就能夠很好地運(yùn)行。第二個原因(也許在目前是更重要的問題)在于大部分的 2.4 內(nèi)核發(fā)行版和補(bǔ)丁都有一點(diǎn)不穩(wěn)定,所以目前您行動時還是需要謹(jǐn)慎一點(diǎn)。理論上,所有的 2.4 發(fā)行版都應(yīng)該是準(zhǔn)產(chǎn)品化的,因為 2.4 版本應(yīng)該是一個穩(wěn)定的系列;但是,實(shí)際上它們(還)不是,所以強(qiáng)烈鼓勵您小心使用新的、沒有測試過的內(nèi)核。

這段信息的意思不是要嚇得您不敢使用 ReiserFS 或者 Linux 2.4,而是要給那些更敢于冒險的人一點(diǎn)理性。不要總是在重要的系統(tǒng)上使用各種還處于測試期的內(nèi)核;如果這樣,您吃到苦頭的。當(dāng)您使用一個不可靠的內(nèi)核時,您不僅僅面臨著系統(tǒng)鎖定的危險;您還面臨著丟失數(shù)據(jù)和文件系統(tǒng)崩潰的危險,這是您絕對不希望發(fā)生的。即便 ReiserFS 實(shí)現(xiàn)本身是穩(wěn)定的,內(nèi)核其他部分的主要錯誤也很可能引起文件系統(tǒng)崩潰的產(chǎn)生。

如果您沒有最新的內(nèi)核穩(wěn)定性信息來源,我建議您定期地訪問 Linux 每周新聞(請參閱本文后面的參考資料),及時了解最新的可能出現(xiàn)的內(nèi)核問題(信息每個星期四更新)。希望現(xiàn)在我已經(jīng)說服了更多喜歡冒險的讀者堅持使用 2.4.4 或 2.4.4-ac9 內(nèi)核作為產(chǎn)品 ReiserFS 的配置,讓我們繼續(xù)吧。

標(biāo)準(zhǔn)內(nèi)核
OK, 我們現(xiàn)在可以談?wù)劙惭b和運(yùn)行一個準(zhǔn)產(chǎn)品化的 ReiserFS 系統(tǒng)的三種選擇。第一種選擇是只用標(biāo)準(zhǔn) 2.4.4 Linux 內(nèi)核。第二種選擇是使用 2.4.4 內(nèi)核,同時使用 ReiserFS 大補(bǔ)丁,它包括了一些專門的補(bǔ)丁,使 ReiserFS 達(dá)到配額兼容,并與在本機(jī)運(yùn)行的 NFS 服務(wù)器更加兼容。第三種選擇是,我們可以使用 2.4.4 內(nèi)核和 ac9 補(bǔ)丁(即 2.4.4-ac9),再加上或不加大補(bǔ)丁。通常我推薦使用 2.4.4-ac9 和大補(bǔ)丁,因為大補(bǔ)丁并沒有任何負(fù)作用,而且您可能會需要它,而且 ac9 比標(biāo)準(zhǔn)內(nèi)核執(zhí)行得好多了。但是,如果您不愿意使用 ac 內(nèi)核,標(biāo)準(zhǔn) 2.4.4 也不錯了。我會簡單地向您介紹設(shè)置 2.4.4-ac9 和大補(bǔ)丁的步驟,但是如果因為某些原因您不愿安裝這兩個補(bǔ)丁或其中之一,只要跳過這個步驟即可?,F(xiàn)在,讓我們開始吧。

首先,從 下載 2.4.4 內(nèi)核源碼并進(jìn)入您的 /usr/src 目錄。 移去該處的任何 linux 目錄或者符號連接,如果是目錄就將其改名,如果是符號連接就只需刪除它。然后:

# cd /usr/src# cat /path/to/linx-2.4.4.tar.bz2 | bzip2 -d | tar xvf -


ac9 補(bǔ)丁和大補(bǔ)丁
如果您計劃只用標(biāo)準(zhǔn) 2.4.4 內(nèi)核,您就已經(jīng)擁有全部所需的資源了,可以跳過其余的補(bǔ)丁。然而,我推薦您繼續(xù)使用下面的 ac 補(bǔ)丁和大補(bǔ)丁。

要使用 ac9 補(bǔ)丁,請從 下載 Alan Cox ac9 補(bǔ)丁。然后鍵入:

# cd /usr/src/linux# bzip2 -dc /path/to/patch-2.4.4-ac9.bz2 | patch -p1


一旦標(biāo)準(zhǔn)內(nèi)核安裝完畢,就到 DiCE 去下載 DiCE 的 ReiserFS 大補(bǔ)丁。這個步驟還是可選的,不過也是推薦的,特別是如果您將在此系統(tǒng)上運(yùn)行 NFS 服務(wù)器或者需要配額(如果不是這樣,無論如何這個補(bǔ)丁也不會有什么壞處)。要使用大補(bǔ)丁請遵循以下步驟:

# cd /usr/src/linux# bzip2 -dc /path/to/bigpatch-2.4.4.diff.bz2 | patch -p1


一旦所有可選的修正和大補(bǔ)丁安裝完畢,您就可以為 ReiserFS 配置內(nèi)核了。

注意:如果您需要更多關(guān)于如何編譯 Linux 內(nèi)核的指導(dǎo),可參閱 developerWorks 上的 編譯 Linux 內(nèi)核免費(fèi)教程。下面是一個簡單的摘要。

配 置內(nèi)核非常簡單。首先,鍵入“make menuconfig”。在“Code maturity level options”部分,確保啟用了“Prompt for development and/or incomplete code/drivers”選項。然后到“File systems”部分,啟用“ReiserFS support”選項。 您將 ReiserFS 設(shè)置為直接編譯到內(nèi)核中(而不是作為一種模塊);而且通常啟用“Have reiserFS do extra internal checking”這個選項不是什么好主意。現(xiàn)在,保存您的設(shè)置,編譯您的內(nèi)核(“make dep;make bzImage;make modules;make modules_install”),然后配置您的引導(dǎo)裝載器(boot loader)來裝載新的配置了 ReiserFS 的內(nèi)核。

重點(diǎn):保存當(dāng)前內(nèi)核并配置引導(dǎo)裝載器(boot loader)總是個好主意,這樣萬一您的新內(nèi)核無法工作,您就可以用原來的內(nèi)核啟動。

使用 ReiserFS

安裝工具
在重新啟動之前,我們需要安裝“reiserfsprogs”工具,它包括了“mkreiserfs”、“resize_reiserfs”(對 LVM 用戶很有用),還有“fsck.reiserfs”。您可以從 Namesys.com 下載頁下載最新版本的“reiserfsprogs”(目前是“3.x.0j”)。一旦這些工具下載完畢,您就可以按以下步驟編譯和安裝“reiserfsprogs”了:

# cd /tmp# tar xzvf reiserfsprogs-3.x.0j.tar.gz# cd reiserfsprogs-3.x.0j# ./configure./configure output will appear here# makemake output will appear here# make installmake install output will appear here


既 然工具已經(jīng)安裝完畢,現(xiàn)在您可以按需要創(chuàng)建任何新的分區(qū)(使用“fdisk”或者“cfdisk”)或 LVM 邏輯卷(使用“lvcreate”)并重新啟動您的系統(tǒng)。如果您正在創(chuàng)建標(biāo)準(zhǔn)分區(qū),您可以簡單地將此分區(qū)標(biāo)記為一個“Linux native file system”(83)。

創(chuàng)建和安裝文件系統(tǒng)
重新啟動后,您就可以在一個空的分區(qū)上創(chuàng)建 ReiserFS 文件系統(tǒng),如下所示:

# mkreiserfs /dev/hdxy


在上面的示例中,/dev/hdxy 應(yīng)該是對應(yīng)于一個空閑分區(qū)的設(shè)備節(jié)點(diǎn)。象安裝其它文件系統(tǒng)一樣安裝它:

# mount /dev/hdxy /mnt/reiser


而且,如果您想在自己的 /etc/fstab 文件中添加一個 ReiserFS 文件系統(tǒng),只需將“freq”和“passno”字段設(shè)置為“0”,如下所示:

/dev/hdc1       /home                   reiserfs        defaults       0 0


從這以后,您的 ReiserFS 文件系統(tǒng)應(yīng)該不比它的對手 ext2 遜色了,而且您再也不必?fù)?dān)心長時間的“fsck”,整體性能也會好得多 — 特別是對于小文件來說。

ReiserFS 技術(shù)注解

文件系統(tǒng)穩(wěn)定性
我 已經(jīng)在一個產(chǎn)品環(huán)境下使用了一個多月 2.4.4 版本內(nèi)核的 ReiserFS(在 cvs. 開發(fā)服務(wù)器上),根本沒有什么崩潰問題。2.4.4 和 2.4.4-ac9 已經(jīng)非常穩(wěn)定了。我們的服務(wù)器執(zhí)行大量的磁盤 IO 任務(wù),因為它是我們的 cvs 資料檔案庫、“dev-wiki”、 郵件服務(wù)器、基于郵差的郵件列表,還有很多其他東西的所在之處。

ReiserFS 的局限性
雖 然 ReiserFS 在幾乎每一種類型的應(yīng)用程序上都比 ext2 文件系統(tǒng)表現(xiàn)得好,有些地方 ReiserFS 目前還是有點(diǎn)欠缺。令人欣慰的是,這些問題其實(shí)并不是 ReiserFS 無法克服的局限性,只是 Namesys 開發(fā)人員還沒有來得及編碼或優(yōu)化的地方。

沒有 dump/restore
是 的,這是真的;ReiserFS 沒有“dump”和“restore”實(shí)現(xiàn)。如果您想使用 ReiserFS 又碰巧是個喜歡使用“dump”的人,您就必須尋找備份數(shù)據(jù)的其他方法。實(shí)際上,事實(shí)證明這個根本就不是問題,因為 2.4 系列內(nèi)核從一開始就不兼容“dump”和“restore”命令。要了解關(guān)于 dump 和 2.4 內(nèi)核的不兼容性的更多信息,請閱讀 Linus Torvalds 的帖子(請參閱參考資料),他在帖子中說道“Dump 從一開始就是個愚蠢的程序。不要去碰它。”

性能問題
雖然 ReiserFS 通常搶盡了 ext2 的風(fēng)頭,但它在特定情況下確實(shí)有性能上的不足之處。第一個就是處理稀疏文件的能力。ReiserFS 處理稀疏文件的能力比 ext2 差很多。當(dāng) Namesys 開發(fā)人員一直設(shè)法為 ReiserFS 4 優(yōu)化 ReiserFS 的這一部分時,這一點(diǎn)會有所改觀。在這之前,ext2 是對處理稀疏文件有很高要求的應(yīng)用程序的較好的解決方案。

在對大量文件執(zhí)行多個 stat() 調(diào)用的代碼中,可能也會碰到問題。一個可能觸發(fā)這種性能缺陷的應(yīng)用程序(它只存在于 2.4 系列內(nèi)核的 ReiserFS 實(shí)現(xiàn),在 2.2 內(nèi)核中不存在)就是“mutt”郵件用戶代理(請參閱參考資料), 它在被用于讀取大型 maildir 形式的郵箱時會觸發(fā)性能缺陷。顯然,每個郵件文件 mutt 都要 stat 兩次,這樣就會比平常更加影響性能。ReiserFS 開發(fā)小組已經(jīng)意識到了這個特殊的問題,并已經(jīng)確定了它的起因,如果近期沒有解決方案的話,您應(yīng)該可以在 ReiserFS 4 中看到相應(yīng)的解決方案。

性能調(diào)整
幸 運(yùn)的是,有幾種簡單通用的性能調(diào)整方法可以用來緩解這些問題。第一種是用“noatime”選項(一種對 ReiserFS 和其它文件系統(tǒng)都有用的安裝選項)來安裝您的 ReiserFS 文件系統(tǒng)。您可能知道,UNIX 系統(tǒng)為文件系統(tǒng)上的每一個對象記錄一個 atime,或稱為訪問時間,每次讀取文件時,atime 都會被更新。對于大部分人來說,atime 郵戳功能不是十分有用,而且?guī)缀鯖]有任何應(yīng)用程序(我想不到一個)依靠 atime 處理什么重要的任務(wù)。出于這個原因,通??梢园踩仃P(guān)掉它,這樣可以帶來一個很好的全面性能提升。通常情況下,除非您確實(shí)知道自己需要 atime 支持,您還是應(yīng)該用 noatime 選項來安裝文件系統(tǒng)。使用如下所示的 /etc/fstab 條目:

/dev/hdc1       /home                   reiserfs        noatime       0 0


關(guān)于 ReiserFS 的第一篇文章中, 我曾提到 ReiserFS 有一項特別的功能,稱為“tail packing”。在 ReiserFS 術(shù)語中,“tail”是小于一個系統(tǒng)文件塊(4k)的文件,或不能填滿一個完整的文件系統(tǒng)塊的文件末尾部分。ReiserFS 具有確實(shí)卓越的小文件處理性能是因為它能夠?qū)⑦@些 tail 合并到它的 b*tree(它的主要數(shù)據(jù)組織結(jié)構(gòu))中去,這樣它們就能真正地接近 stat-data(ReiserFS 中等同于索引節(jié)點(diǎn)的單元)。然而,因為這些 tail 不能填滿一個完整的塊,它們會浪費(fèi)很多磁盤空間(當(dāng)然是相對地說)。為了解決這個問題,ReiserFS 使用了它的“tail packing”功能來將這些 tail 壓縮到占用盡可能小的空間。通常,這么做可以讓 ReiserFS 文件系統(tǒng)比大小相等的 ext2 文件系統(tǒng)多容納大約 5% 的數(shù)據(jù)。

更多關(guān)于 notail 的內(nèi)容
然 而,tail packing 也有它的缺點(diǎn)。首先,它的確給性能帶來了一個小卻不可忽視的沖擊。幸運(yùn)的是,ReiserFS 開發(fā)人員已經(jīng)預(yù)計到有些人寧愿犧牲大約 5%的磁盤空間換取一點(diǎn)額外的性能,所以他們創(chuàng)建了“notail”安裝選項。當(dāng)文件系統(tǒng)用這個選項安裝時,tail packing 將被關(guān)閉,使您的存儲容量減小,卻有更快的速度。通常,重視文件系統(tǒng)性能的狂熱分子同時啟用“notail”和“noatime”選項來安裝他們的文件系 統(tǒng),從而帶來顯著的性能提升:

/dev/hdc1       /home                   reiserfs        noatime,notail       0 0


即 便您想節(jié)省一點(diǎn)磁盤空間,有時候暫時用一下“notail”選項安裝文件系統(tǒng)也是件好事。特別是,大多數(shù)引導(dǎo)裝載器(boot loader)裝載一個在啟用 tail packing 的 ReiserFS 文件系統(tǒng)上創(chuàng)建的內(nèi)核時,都會出現(xiàn)問題。如果您正在使用一個比版本 21.6 還低的 LILO,您就會碰到這種問題。在使用最新版本的 GRUB 時也會碰到問題,即不能裝載它的 stage1 和 stage1_5 文件,盡管在裝載實(shí)際內(nèi)核的時候沒有什么問題。如果您已經(jīng)在經(jīng)歷這種問題了,您可以這樣修正此問題-使用“notail”選項安裝文件系統(tǒng),將文件移到另 一個文件系統(tǒng)中,然后再把它們移回來。當(dāng)文件被重新創(chuàng)建時,就不會有 tail 了。另外,記住您還可以很輕易地重新安裝文件系統(tǒng)(用新選項),而不需要卸載它。這個特別的示例使用“notail”選項重新安裝根目錄文件系統(tǒng)。通常情況下,如果您想使用 tail packing,但也需要引導(dǎo)裝載器(boot loader)從根目錄文件系統(tǒng)裝載輔助文件(如內(nèi)核),這條命令就很有用了:

# mount / -o remount,notail


Qmail 注解
如果您正在 ReiserFS 中使用 qmail,您應(yīng)該了解一些重要的參考資料。首先,您應(yīng)該使用 qmail 1.03 源碼的補(bǔ)丁。它修正了 qmail 非同步調(diào)用“link()”和“unlink()”時出現(xiàn)的問題,它不但是 ReiserFS 的問題,恰好也是 ext2 的問題。接下來您應(yīng)該看看 Jedi 的 qmail 調(diào)優(yōu)頁面,它包含了很多關(guān)于怎樣盡可能發(fā)揮 qmail 性能的很好的建議。最后,請務(wù)必查看 Jedi 的 ReiserSMTP 軟件包。ReiserSMTP 包含一個 GPL 插件來代替 qmail 的 SMTP 部分;Jedi 的這種替換是特別為 ReiserFS 調(diào)整的,依賴新的隊列處理例程,它可以給您帶來雙倍的郵件收取性能。

結(jié)論
我 發(fā)現(xiàn) ReiserFS 真是一個不可思議的文件系統(tǒng),它提供了很好的小文件處理性能和非常好的(通常比 ext2 要好)的常規(guī)文件處理性能。因為有了 ReiserFS,我的開發(fā)人員可以在僅僅 15 秒內(nèi)完成 Gentoo Linux “cvs” 更新,而使用 ext2 通常要花大約兩分鐘時間。ReiserFS 使我們開發(fā)人員的生活更加愉快,還使我們的 cvs 服務(wù)器處理大量的并發(fā) IO 而不會引起硬盤狂轉(zhuǎn)和對交互性能的負(fù)面影響。

然而除了所有這些,關(guān)于 ReiserFS 最激動人心的地方是它將來的發(fā)展方向。Hans Reiser 對 ReiserFS 有一個非常激進(jìn)而創(chuàng)新的計劃,包括計劃擴(kuò)展文件系統(tǒng)從而能夠?qū)⑵渥鳛橐粋€發(fā)展成熟的高性能數(shù)據(jù)庫來使用,最后還包括事務(wù)支持和高級查詢功能。這意味 ReiserFS 將不僅僅“只是另一個高性能文件系統(tǒng)”;相反,它將開拓新的可能和道路,使我們能夠用創(chuàng)新方式去解決傳統(tǒng)的存儲問題。有了 Namesys 的合作,Linux 將來的發(fā)展一定會非常激動人心 -這絕對是一件好事情。

伴 隨著 Linux 2.4 版本的發(fā)行,出現(xiàn)了大量的文件系統(tǒng)可能性,其中包括 ReiserFS、XFS、GFS 和其它文件系統(tǒng)。這些文件系統(tǒng)聽起來的確都很酷,但是它們真正能做些什么呢,擅長在哪些方面,以及在 Linux 產(chǎn)品環(huán)境下如何才能安全地使用它們呢?Daniel Robbins 通過向您展示如何在 Linux 2.4 的環(huán)境下建立這些新的高級文件系統(tǒng)來回答以上的問題。在這個部分,Daniel 簡單地介紹了 tmpfs,一個基于 VM 的文件系統(tǒng),還向您介紹了 2.4 版本的“綁定”安裝功能帶來的新的可能。

在本系列我以前的文章中,我介紹了創(chuàng)建日志和使用 ReiserFS 的好處,并展示了如何安裝一個穩(wěn)固的基于 Linux 2.4 的 ReiserFS 系統(tǒng)。 在本文中,我們要談?wù)搸讉€相對次要的主題。首先,我們會簡單地介紹一下 tmpfs,也就是我們知道的虛擬內(nèi)存(virtual memory,VM)文件系統(tǒng)。Tmpfs 可能是現(xiàn)在 Linux 可以使用的最好的類似于 RAM 磁盤的系統(tǒng),而且是 2.4 內(nèi)核的一個新功能。然后,我們將簡單地介紹另一個 2.4 內(nèi)核的新功能,叫做“綁定安裝”,它在安裝(和重新安裝)文件系統(tǒng)的時候帶來了很大的靈活性。在下一篇文章中,我們會把重點(diǎn)集中在 devfs 上,之后,我們會花點(diǎn)時間來進(jìn)一步熟悉新的 ext3 文件系統(tǒng)。

介紹 tmpfs
如果我必須一下子說清楚 tmpfs,我會說 tmpfs 就象虛擬磁盤(ramdisk),但不一樣。象虛擬磁盤一樣,tmpfs 可以使用您的 RAM,但它也可以使用您的交換分區(qū)來存儲。而且傳統(tǒng)的虛擬磁盤是個塊設(shè)備,并需要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個文件系統(tǒng),而不是塊設(shè)備;您只是安裝它,它就可以使用了。總而言之,這讓 tmpfs 成為我有機(jī)會遇到的最好的基于 RAM 的文件系統(tǒng)。

tmpfs 和 VM
讓我們來看看 tmpfs 更有趣的一些特性吧。正如我前面提到的一樣,tmpfs 既可以使用 RAM,可 以使用交換分區(qū)。剛開始這看起來可能有點(diǎn)武斷,但請記住 tmpfs 也是我們知道的“虛擬內(nèi)存文件系統(tǒng)”。而且,您可能也知道,Linux 內(nèi)核的虛擬內(nèi)存資源同時來源于您的 RAM 和交換分區(qū)。內(nèi)核中的 VM 子系統(tǒng)將這些資源分配到系統(tǒng)中的其它部分,并負(fù)責(zé)在后臺管理這些資源,通常是透明地將 RAM 頁移動到交換分區(qū)或從交換分區(qū)到 RAM 頁。

tmpfs 文件系統(tǒng)需要 VM 子系統(tǒng)的頁面來存儲文件。tmpfs 自己并不知道這些頁面是在交換分區(qū)還是在 RAM 中;做這種決定是 VM 子系統(tǒng)的工作。tmpfs 文件系統(tǒng)所知道的就是它正在使用某種形式的虛擬內(nèi)存。

不是塊設(shè)備
這 里是 tmpfs 文件系統(tǒng)另一個有趣的特性。不同于大多數(shù)“標(biāo)準(zhǔn)的”文件系統(tǒng),如 ext3、ext2、XFS、JFS、ReiserFS 和其它一些系統(tǒng),tmpfs 并不是存在于一個底層塊設(shè)備上面。因為 tmpfs 是直接建立在 VM 之上的,您用一個簡單的 mount 命令就可以創(chuàng)建 tmpfs 文件系統(tǒng)了。

# mount tmpfs /mnt/tmpfs -t tmpfs

執(zhí)行這個命令之后,一個新的 tmpfs 文件系統(tǒng)就安裝在 /mnt/tmpfs,隨時可以使用。注意,不需運(yùn)行 mkfs.tmpfs;事實(shí)上,那是不可能的,因為沒有這樣的命令存在。在 mount 命令執(zhí)行之后,文件系統(tǒng)立即就被安裝并且可以使用了,類型是 tmpfs。這和 Linux 虛擬磁盤如何使用大相徑庭;標(biāo)準(zhǔn)的 Linux 虛擬磁盤是塊設(shè)備,所以在使用它們之前必須用您選擇的文件系統(tǒng)將其格式化。相反,tmpfs 一個文件系統(tǒng)。所以,您可以簡單地安裝它就可以使用了。

Tmpfs 的優(yōu)勢

動態(tài)文件系統(tǒng)的大小
您 可能想知道我們前面在 /mnt/tmpfs 安裝的 tmpfs 文件系統(tǒng)有多大。這個問題的答案有點(diǎn)意外,特別是在和基于磁盤的文件系統(tǒng)比較的時候。/mnt/tmpfs 最初會只有很小的空間,但隨著文件的復(fù)制和創(chuàng)建,tmpfs 文件系統(tǒng)驅(qū)動程序會分配更多的 VM,并按照需求動態(tài)地增加文件系統(tǒng)的空間。而且,當(dāng) /mnt/tmpfs 中的文件被刪除時,tmpfs 文件系統(tǒng)驅(qū)動程序會動態(tài)地減小文件系統(tǒng)并釋放 VM 資源,這樣做可以將 VM 返回到循環(huán)當(dāng)中以供系統(tǒng)中其它部分按需要使用。因為 VM 是寶貴的資源,所以您一定不希望任何東西浪費(fèi)超出它實(shí)際所需的 VM,tmpfs 的好處之一就在于這些都是自動處理的。 請參閱參考資料

速度
tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 文件系統(tǒng)會完全駐留在 RAM 中,讀寫幾乎可以是瞬間的。即使用了一些交換分區(qū),性能仍然是卓越的,當(dāng)更多空閑的 VM 資源可以使用時,這部分 tmpfs 文件系統(tǒng)會被移動到 RAM 中去。讓 VM 子系統(tǒng)自動地移動部分 tmpfs 文件系統(tǒng)到交換分區(qū)實(shí)際上對性能上是的,因為這樣做可以讓 VM 子系統(tǒng)為需要 RAM 的進(jìn)程釋放空間。這一點(diǎn)連同它動態(tài)調(diào)整大小的能力,比選擇使用傳統(tǒng)的 RAM 磁盤可以讓操作系統(tǒng)有好得多的整體性能和靈活性。

沒有持久性
這 看起來可能不象是個積極因素,tmpfs 數(shù)據(jù)在重新啟動之后不會保留,因為虛擬內(nèi)存本質(zhì)上就是易失的。我想您可能猜到了 tmpfs 被稱為“tmpfs”的一個原因,不是嗎?然而,這實(shí)際上可以是一件好事。它讓 tmpfs 成為一個保存您不需保留的數(shù)據(jù)(如臨時文件,可以在 /tmp 中找到,還有 /var 文件系統(tǒng)樹的某些部分)的卓越的文件系統(tǒng)。

使用 tmpfs
為 了使用 tmpfs,您所需要的就是啟用了“Virtual memory file system support(以前是 shm fs)”選項的 2.4 系列內(nèi)核;這個選項在內(nèi)核配置選項的“File systems”部分。一旦您有了一個啟用了 tmpfs 的內(nèi)核,您就可以開始安裝 tmpfs 文件系統(tǒng)了。其實(shí),在您所有的 2.4 內(nèi)核中都打開 tmpfs 選項是個好主意,不管您是否計劃使用 tmpfs。這是因為您需要內(nèi)核 tmpfs 支持來使用 POSIX 共享的內(nèi)存。然而,System V 共享的內(nèi)存不需要內(nèi)核中有 tmpfs 就可以工作。注意,您需要為了讓 POSIX 共享的內(nèi)存工作而安裝 tmpfs 文件系統(tǒng);您只需要在內(nèi)核中支持 tmpfs 就可以了。POSIX 共享的內(nèi)存現(xiàn)在使用得不太多,但這種情況可能會隨著時間而改變。

避免低 VM 情況
tmpfs 根據(jù)需要動態(tài)增大或減小的事實(shí)讓人疑惑:如果您的 tmpfs 文件系統(tǒng)增大到它耗盡了所有虛 擬內(nèi)存的程度,而您沒有剩余的 RAM 或交換分區(qū),這時會發(fā)生什么?一般來說,這種情況是有點(diǎn)討厭。如果是 2.4.4 內(nèi)核,內(nèi)核會立即鎖定。如果是 2.4.6 內(nèi)核,VM 子系統(tǒng)已經(jīng)以很多種方式得到了修正,雖然耗盡 VM 并不是一個美好的經(jīng)歷,事情也不會完全地失敗。如果 2.4.6 內(nèi)核到了無法分配更多 VM 的程度,您顯然不愿意不能向 tmpfs 文件系統(tǒng)寫任何新數(shù)據(jù)。另外,可能會發(fā)生其他一些事情。首先,系統(tǒng)的其他一些進(jìn)程會無法分配更多的內(nèi)存;通常,這意味著系統(tǒng)多半會變得極度緩慢而且?guī)缀鯖]有響應(yīng)。這樣,超級用戶要采取必要的步驟來緩解這種低 VM 的情況就會很困難,或異常地耗時。

另 外,內(nèi)核有一個內(nèi)建的最終防線系統(tǒng),用來在沒有可用內(nèi)存的時候釋放內(nèi)存,它會找到占用 VM 資源的進(jìn)程并終止該進(jìn)程。不幸的是,這種“終止進(jìn)程”的解決方案在 tmpfs 的使用增加引起 VM 耗盡的情況下通常會導(dǎo)致不良后果。以下是原因。tmpfs 本身不能(也不應(yīng)該)被終止,因為它是內(nèi)核的一部分而非一個用戶進(jìn)程,而且也沒有容易的方法可以讓內(nèi)核找出是那個進(jìn)程占滿了 tmpfs 文件系統(tǒng)。所以,內(nèi)核會錯誤地攻擊它能找到的最大的占用 VM 的進(jìn)程,通常會是 X 服務(wù)器(X server),如果您碰巧在使用它。所以,您的 X 服務(wù)器會被終止,而引起低 VM 情況的根本原因(tmpfs)卻沒有被解決。Ick.

低 VM:解決方案
幸運(yùn)的是,tmpfs 允許您在安裝或重新安裝文件系統(tǒng)的時候指定文件系統(tǒng)容量的最大值上限。實(shí)際上,從 2.4.6 內(nèi)核到 2.11g 內(nèi)核,這些參數(shù)只能在安裝時 設(shè)置,而不是重新安裝時,但我們可以期望在不久的將來可以在重新安裝時設(shè)置這些參數(shù)。tmpfs 容量最大值的最佳設(shè)置依賴于資源和您特定的 Linux 主機(jī)的使用模式;這個想法是要防止一個完全使用資源的 tmpfs 文件系統(tǒng)耗盡所有虛擬內(nèi)存結(jié)果導(dǎo)致我們前面談到的糟糕的低 VM 情況。尋找好的 tmpfs 上限值的一個好方法是使用 top 來監(jiān)控您系統(tǒng)的交換分區(qū)在高峰使用階段的使用情況。然后,確保指定的 tmpfs 上限稍小于所有這些高峰使用時間內(nèi)空閑交換分區(qū)和空閑 RAM 的總和。

創(chuàng)建有最大容量的 tmpfs 文件系統(tǒng)很容易。要創(chuàng)建一個新的最大 32 MB 的 tmpfs 文件系統(tǒng),請鍵入:

# mount tmpfs /dev/shm -t tmpfs -o size=32m

這次,我們沒有把 tmpfs 文件系統(tǒng)安裝在 /mnt/tmpfs,而是創(chuàng)建在 /dev/shm,這正好是 tmpfs 文件系統(tǒng)的“正式”安裝點(diǎn)。如果您正好在使用 devfs,您會發(fā)現(xiàn)這個目錄已經(jīng)為您創(chuàng)建好了。

還有,如果我們想將文件系統(tǒng)的容量限制在 512 KB 或 1 GB 以內(nèi),我們可以分別指定 size=512ksize=1g。除了限制容量,我們還可以通過指定 nr_inodes=x 參數(shù)限制索引節(jié)點(diǎn)(文件系統(tǒng)對象)。在使用 nr_inodes 時,x 可以是一個簡單的整數(shù),后面還可以跟一個 kmg 指定千、百萬或十億(?。﹤€索引節(jié)點(diǎn)。

而且,如果您想把上面的 mount tmpfs 命令的等價功能添加到 /etc/fstab,應(yīng)該是這樣:

tmpfs	/dev/shm	tmpfs	size=32m	0	0

在現(xiàn)存的安裝點(diǎn)上安裝
在以前使用 2.2 的時候,試圖在已經(jīng)安 裝了東西的安裝點(diǎn)再次安裝任何東西都會引發(fā)錯誤。然而,重寫后的內(nèi)核安裝代碼使多次使用安裝點(diǎn)不再成為問題。這里是一個示例的情況:假設(shè)我們有一個現(xiàn)存的 文件系統(tǒng)安裝在 /tmp。然而,我們決定要開始使用 tmpfs 進(jìn)行 /tmp 的存儲。過去,您唯一的選擇就是卸載 /tmp 并在其位置重新安裝您新的 tmpfs/tmp 文件系統(tǒng),如下所示:

#  umount /tmp#  mount tmpfs /tmp -t tmpfs -o size=64m

可是,這種解決方案也許對您不管用??赡苡泻芏嗾谶\(yùn)行的進(jìn)程在 /tmp 中有打開的文件;如果是這樣,在試圖卸載 /tmp 時,您就會遇到如下的錯誤:

umount: /tmp: device is busy

然而,使用最近的 2.4 內(nèi)核,您可以安裝您新的 /tmp 文件系統(tǒng),而不會遇到“device is busy”錯誤:

# mount tmpfs /tmp -t tmpfs -o size=64m

用一條命令,您新的 tmpfs /tmp 文件系統(tǒng)就被安裝在 /tmp,并安裝在已經(jīng)安裝的不能再被直接訪問的分區(qū)之上。然而,雖然您不能訪問原來的 /tmp,任何在原文件系統(tǒng)上還有打開文件的進(jìn)程都可以繼續(xù)訪問它們。而且,如果您 unmount 基于 tmpfs 的 /tmp,原來安裝的 /tmp 文件系統(tǒng)會重新出現(xiàn)。實(shí)際上,您在相同的安裝點(diǎn)上可以安裝任意數(shù)目的文件系統(tǒng),安裝點(diǎn)就象一個堆棧;卸載當(dāng)前的文件系統(tǒng),上一個最近安裝的文件系統(tǒng)就會重新出現(xiàn)。

#  mount --bind / /home/drobbins/nifty

現(xiàn) 在,如果您觀察 /home/drobbins/nifty 的內(nèi)部,您就會看到您的根文件系統(tǒng)(/home/drobbins/nifty/etc、/home/drobbins/nifty/opt 等)。而且,如果您在根文件系統(tǒng)修改文件,您在 /home/drobbins/nifty 中也可以看到所作的改動。這是因為它們是同一個文件系統(tǒng);內(nèi)核只是簡單地為我們將該文件系統(tǒng)映射到兩個不同的安裝點(diǎn)。注意,當(dāng)您在另一處安裝文件系統(tǒng)時, 任何安裝在綁定安裝文件系統(tǒng)內(nèi)部的安裝點(diǎn)的文件系統(tǒng)都不會隨之移動。換句話說,如果您在單獨(dú)的文件系統(tǒng)上有 /usr,我們前面執(zhí)行的綁定安裝就會讓 /home/drobbins/nifty/usr 為空。您會需要附加的綁定安裝命令來使您能夠瀏覽位于 /home/drobbins/nifty/usr 的 /usr 的內(nèi)容:

#  mount --bind /usr /home/drobbins/nifty/usr

綁定安裝部分文件系統(tǒng)
綁 定安裝讓更妙的事情成為可能。假設(shè)您有一個 tmpfs 文件系統(tǒng)安裝在它的傳統(tǒng)位置 /dev/shm,您決定要開始在當(dāng)前位于根文件系統(tǒng)的 /tmp 使用 tmpfs。雖然可以在 /tmp(這是可能的)安裝一個新的 tmpfs 文件系統(tǒng),您也可以決定讓新的 /tmp 共享當(dāng)前安裝的 /dev/shm 文件系統(tǒng)。然而,雖然您可以在 /tmp 綁定安裝 /dev/shm 就完成了,但您的 /dev/shm 還包含一些您不想在 /tmp 出現(xiàn)的目錄。所以,您怎么做呢?這樣如何:

# mkdir /dev/shm/tmp# chmod 1777 /dev/shm/tmp# mount --bind /dev/shm/tmp /tmp

在這個示例中,我們首先創(chuàng)建了一個 /dev/shm/tmp 目錄,然后給它 1777 權(quán)限,對 /tmp 適當(dāng)?shù)脑S可。既然我們的目錄已經(jīng)準(zhǔn)備好了,我們可以安裝,也只能安裝 /dev/shm/tmp 到 /tmp。所以,雖然 /tmp/foo 會映射到 /dev/shm/tmp/foo,但您沒有辦法從 /tmp 訪問 /dev/shm/bar 文件。

正如您所見,綁定安裝非常強(qiáng)大,讓您可以輕易地修改文件系統(tǒng)設(shè)計,絲毫不必忙亂。下一篇文章,我們會談到 devfs,至于現(xiàn)在,您也許會想看看下面的參考資料。

伴 隨著 Linux 2.4 版本的發(fā)行,出現(xiàn)了大量的文件系統(tǒng)可能性,其中包括 ReiserFS、XFS、GFS 和其它文件系統(tǒng)。這些文件系統(tǒng)聽起來的確都很酷,但是它們真正能做些什么呢,擅長在哪些方面,以及在 Linux 產(chǎn)品環(huán)境下如何才能安全地使用它們呢?Daniel Robbins 通過向您展示如何在 Linux 2.4 的環(huán)境下建立這些新的高級文件系統(tǒng)來回答以上的問題。遵從這個方法,他提供了在實(shí)際實(shí)現(xiàn)過程中的有價值的建議、性能信息和重要的技術(shù)性注意要點(diǎn),以便于您 在新的文件系統(tǒng)中能有盡可能令人愉快的經(jīng)歷。在本文中:Daniel 解釋了使用設(shè)備管理文件系統(tǒng) devfs 的意義和好處,讓您對其有所認(rèn)識以便在下一篇文章中向您展示如何最佳地在系統(tǒng)上安裝 devfs。

介紹 devfs

設(shè)備,到處都是設(shè)備
Devfs, 也叫設(shè)備文件系統(tǒng)(Device Filesystem),設(shè)計它的唯一目的就是提供一個新的(更理性的)方式管理通常位于 /dev 的所有塊設(shè)備和字符設(shè)備。您也許知道,典型的 /dev 樹包含數(shù)百個塊特殊文件和字符特殊文件,它們?nèi)荚诟募到y(tǒng)上。每個特殊文件都可以讓用戶空間進(jìn)程輕松地與內(nèi)核設(shè)備實(shí)現(xiàn)交互。舉例來說,通過對這些特殊 文件執(zhí)行操作,您的 X 服務(wù)器就能夠訪問視頻硬件,fsck 可以執(zhí)行文件系統(tǒng)檢驗,lpd 可以通過并行端口向打印機(jī)發(fā)送數(shù)據(jù)。

實(shí) 際上,通常 Linux 和 Unix 更“酷”的方面是,設(shè)備不是簡單地隱藏在晦澀的 API 之后,而是真正地與普通文件、目錄和符號鏈接一樣存在于文件系統(tǒng)上。因為字符和塊設(shè)備是映射到普通文件系統(tǒng)名稱空間的,我們通??梢杂糜幸饬x的方式來與硬 件交互,可以僅使用標(biāo)準(zhǔn) Unix 命令,如 catdd。除了有趣之外,這還使我們有更強(qiáng)的能力,并提高生產(chǎn)力。

設(shè)備管理問題
然而,雖然設(shè)備特殊文件本身是一件好事情,但典型的 Linux 系統(tǒng)以一種不太理想而且麻煩的方式管理這些特殊文件。 如今,Linux 支持很多不 同種類的硬件。這意味著嚴(yán)格意義上我們中絕大多數(shù)在 /dev 中都有數(shù)百個特殊文件來表示所有這些設(shè)備。還不止這樣,這些特殊文件中大多數(shù)甚至不會映射到系統(tǒng)中存在的設(shè)備上(但需要它們存在,只是考慮到我們最終會在 系統(tǒng)中添加新的硬件/驅(qū)動器),這讓事情變得更令人困惑。

僅從這個方面來看,我們就知道 /dev 需要徹底檢修,而創(chuàng)建 devfs 的明確目的就是讓 /dev 變回原形。為了很好地理解 devfs 是怎樣解決絕大多數(shù) /dev 管理問題的,我們從設(shè)備驅(qū)動程序的角度來看看 devfs。

設(shè)備管理內(nèi)幕
為了很好地理解 devfs ,最好是先理解從設(shè)備驅(qū)動程序的角度來看 devfs 是怎樣改變事物的。傳統(tǒng)地(不使用 devfs),根據(jù)是否注冊在設(shè)備或字符設(shè)備,基于內(nèi)核的設(shè)備驅(qū)動程序通過調(diào)用 register_blkdev()register_chrdev() 向系統(tǒng)的其余部分注冊設(shè)備。

您必須提供一個主設(shè)備號(一個無符號 8 位整數(shù))作為 register_blkdev()register_chrdev() 的參數(shù);然后,在設(shè)備注冊之后,內(nèi)核就會知道這個特定的主設(shè)備號對應(yīng)于執(zhí)行 register_???dev() 調(diào)用的特定設(shè)備驅(qū)動程序。

那么,設(shè)備驅(qū)動程序開發(fā)人員為調(diào)用 register_???dev() 提供的主設(shè)備號應(yīng)該是什么呢?如果開發(fā)人員不打算將設(shè)備驅(qū)動程序與外界共享,那么什么號碼都可以,只要它與當(dāng)前內(nèi)核使用的其它主設(shè)備號都不沖突即可。開發(fā)人員還可以選擇動態(tài)地分配 register_???dev() 調(diào)用的設(shè)備的主設(shè)備號。然而,這樣的解決方案通常只是在驅(qū)動程序不會被其它人使用的情況下可行。

獲取號碼
然 而,如果開發(fā)人員想讓驅(qū)動程序與外界共享(大多數(shù) Linux 開發(fā)人員常常采用這一方法),那么僅僅從“真空”中抽一個主設(shè)備號或者使用動態(tài)的主設(shè)備號分配就不行了。相反,開發(fā)人員必須聯(lián)系 Linux 內(nèi)核開發(fā)人員,這樣他(她)的特定的設(shè)備才能分配一個“正式”主設(shè)備號。那么,在整個 Linux 世界中,這個特定的設(shè)備(也只有這個設(shè)備)才會被關(guān)聯(lián)到那個特定的主設(shè)備號。

有 一個“正式的”主設(shè)備號很重要,因為要與特定的設(shè)備交互,管理員必須在 /dev 創(chuàng)建一個特殊文件。當(dāng)設(shè)備節(jié)點(diǎn)(特殊文件)創(chuàng)建后,它使用的主設(shè)備號必須同內(nèi)核內(nèi)部使用的完全相同。這樣,進(jìn)程對設(shè)備執(zhí)行操作時,內(nèi)核就會知道應(yīng)該引用什 么設(shè)備驅(qū)動程序。讓特殊文件到內(nèi)核驅(qū)動程序的映射成為可能的是主設(shè)備號,而不是真實(shí)的設(shè)備名稱(它和非 devfs 系統(tǒng)無關(guān))。

一旦設(shè)備驅(qū)動程序具備正式主設(shè)備號,設(shè)備就可以被公開使用了,設(shè)備節(jié)點(diǎn)也就可以開始并入不同分發(fā)版的 /dev 樹,還有它們的正式 /dev/MAKEDEV 腳本(用來幫助超級用戶用正確的主從設(shè)備號、權(quán)限和所有權(quán)創(chuàng)建設(shè)備節(jié)點(diǎn)的特殊腳本)中。

傳統(tǒng)的問題
不 幸的是,這種方法有很多可伸縮性問題。不僅設(shè)備驅(qū)動程序開發(fā)人員聯(lián)系內(nèi)核開發(fā)人員來獲取正式主設(shè)備號是一件討厭的事,內(nèi)核開發(fā)人員弄清他們怎樣分配所有這 些主設(shè)備號甚至更加惱人。這種任務(wù)在很多方面很象系統(tǒng)管理員跟蹤公司局域網(wǎng)靜態(tài) IP 地址分配的工作 — 這并不十分有趣。正如系統(tǒng)管理員可以利用 DHCP 來緩解這種管理負(fù)擔(dān),如果設(shè)備注冊有某種類似的方法就好了。

不只是這樣,Linux 還正在耗盡主設(shè)備號和副號碼。雖然這種問題可以通過簡單地擴(kuò)展主設(shè)備號和副號碼使用的位數(shù),首先維護(hù)這些主設(shè)備號映射就很討厭了,所以我們又在考慮有沒有更好的方法來處理這些事情。幸運(yùn)的是,有這樣的方法;進(jìn)入 devfs。

進(jìn)入 devfs

devfs_register()
這 里是對 devfs 如何一下子處理事情和解決這些問題的一個簡單明了的快速綱要。一旦 devfs 被正確配置(包括在內(nèi)核添加 devfs 支持和對啟動腳本進(jìn)行一些稍復(fù)雜的更改),超級用戶重新啟動系統(tǒng)。然后內(nèi)核開始啟動,設(shè)備驅(qū)動程序開始向系統(tǒng)的剩余部分注冊設(shè)備。您會記起在非 devfs 系統(tǒng)上,register_blkdev()register_chrdev() 調(diào)用(連同提供的主設(shè)備號)正是用于這一目的。然而,現(xiàn)在啟用了 devfs,設(shè)備驅(qū)動程序是用一種新的、改進(jìn)了的內(nèi)核調(diào)用來注冊設(shè)備,稱為 devfs_register()。

這里是 devfs_register() 調(diào)用有趣的地方。雖然為了兼容性目的指定主設(shè)備號和副號碼作為參數(shù)是可能的,但不再需要這樣了。相反, devfs_register() 調(diào)用接受設(shè)備路徑(就是它在 /dev 下可能的出現(xiàn)形式)作為參數(shù)。舉例來說,假設(shè) foo 設(shè)備驅(qū)動程序希望使用 devfs 注冊設(shè)備。它會提供一個 foo0 的參數(shù)給 devfs_register(),從而告訴內(nèi)核應(yīng)該在 devfs 名稱空間的根目錄創(chuàng)建一個新的 foo0 設(shè)備。相應(yīng)的,devfs_register() 在 devfs 名稱空間的根目錄添加 foo0 設(shè)備節(jié)點(diǎn),并記錄這個新的 foo0 節(jié)點(diǎn)應(yīng)該映射到內(nèi)核中的 foo 設(shè)備驅(qū)動程序。

運(yùn)行的 Devfs
一旦所有設(shè)備驅(qū)動程序啟動并向內(nèi)核注冊適當(dāng)?shù)脑O(shè)備,內(nèi)核就啟動 /sbin/init 和系統(tǒng)初始化腳本開始執(zhí)行。在啟動過程初期(在文件系統(tǒng)檢查前),rc 腳本將 devfs 文件系統(tǒng)安裝在 /dev 中,/dev 包含了 devfs 名稱空間的表達(dá)。這意味著在安裝 /dev 后,所有注冊的設(shè)備(如上面的 /dev/foo0)都可以訪問,就象在非 devfs 上一樣。當(dāng)它們被訪問時,內(nèi)核通過 devfs 設(shè)備名稱映射到合適的設(shè)備驅(qū)動程序,而不是通過主設(shè)備號。

這種系統(tǒng)的優(yōu)點(diǎn)是,所有需要的設(shè)備節(jié)點(diǎn)(沒有別的了)都由內(nèi)核自動創(chuàng)建。這不僅僅意味著不再需要 MAKEDEV(因 為所有注冊的設(shè)備都只“出現(xiàn)”在 /dev 中),還意味著 /dev 不再被成百個“無用的”設(shè)備節(jié)點(diǎn)所充斥。實(shí)際上,使用 devfs,您可以只要查看 /dev 就知道系統(tǒng)上有什么設(shè)備。所以,如果您有一臺支持熱插拔的膝上型電腦,這意味著您甚至可以在您從系統(tǒng)中插入和拔出 PC 卡時魔術(shù)般地讓設(shè)備從 /dev 中出現(xiàn)和消失。這讓 devfs 成為對以前笨拙局面的一個非常徹底和實(shí)用的解決方案。

devfs 的優(yōu)點(diǎn)
Devfs 讓很多事變得容易許多。請考慮一下創(chuàng)建一張 Linux 可引導(dǎo)光盤的問題,它包括一個位于 CD 上的引導(dǎo)裝載器、一個 initrd、一個內(nèi)核和一個回送文件系統(tǒng)。當(dāng) CD 引導(dǎo)時,引導(dǎo)裝載器裝載內(nèi)核和 initrd,然后內(nèi)核執(zhí)行 initrd 上的 /linuxrc 腳本。/linuxrc 的主要任務(wù)是安裝 CD,從而使回送文件系統(tǒng)本身也可以被安裝和訪問。

沒有 devfs,linuxrc 就需要“查看” /dev 中的很多特殊文件,它們可能有也可能沒有表示連接到系統(tǒng)的真實(shí)硬件。例如, linuxrc 會需要檢測 /dev/hdc、/dev/scd0、/dev/hdb 和其它的設(shè)備以檢測“活動的”光盤驅(qū)動器設(shè)備。在檢測進(jìn)程中,很可能命中幾個“無用的”設(shè)備節(jié)點(diǎn)。

然而,使用 devfs,linuxrc 只在 /dev/cdroms 中尋找,它包含了系統(tǒng)中所有和活動的光 盤驅(qū)動器相關(guān)聯(lián)的特殊文件,不管是 IDE 的還是 SCSI 的。由于這種便捷的新式 devfs 約定,再不需要猜測了;只有活動的設(shè)備才會列出,而且設(shè)備檢測代碼甚至不必?fù)?dān)心底層的光盤驅(qū)動器的細(xì)節(jié),比如說它使用什么 IDE 通道或者什么 SCSI ID。實(shí)際上,這是 devfs 的另一個主要好處;在我下一篇文章中,我們會看到 devfs 下 /dev 中的設(shè)備有全新的缺省位置。

實(shí)際上,如果您想訪問一個特定的塊設(shè)備(如磁盤、分區(qū)、光盤驅(qū)動器等等),事實(shí)上有 幾個不同的特殊文件可以引用。例如,我的服務(wù)器只有一個 SCSI 光盤驅(qū)動器;如果啟用了 devfs,我就可以通過安裝 /dev/cdroms/cdrom0 /dev/scsi/host0/bus0/target4/lun0/cd 訪問它。兩種都引用同一個設(shè)備,我可以引用我認(rèn)為最方便的特殊文件。如果愿意,我還可以使用一種老式的設(shè)備名稱(/dev/sr0)訪問光盤驅(qū)動器,這都是因為有一個非常便捷的叫 devfsd 的小程序。 devfsd 是一個有功能很多的程序,它負(fù)責(zé)創(chuàng)建老式的“兼容性”特殊文件,還允許您以很多種方式自定義 /dev。在我的下一篇文章中,我們會詳細(xì)討論 devfsd,到時我會一直引導(dǎo)您啟動 devfs 并在您自己的系統(tǒng)上運(yùn)行它。在那之前,請參考下面的參考資料以了解更多關(guān)于 devfs 的信息。

參考資料

  • Namesys Web 頁是能更好地了解 ReiserFS 的地方。

  • 注意訪問 DiCE 下載頁,留意最新的 ReiserFS 大補(bǔ)丁。

  • ReiserFS 郵件列表是能獲得當(dāng)前的,更多深入的 ReiserFS 信息的極好的信息來源。請務(wù)必還要查看 ReiserFS 郵件列表檔案。

  • Linux 每周新聞是我們及時了解最新的內(nèi)核發(fā)展的很好的參考資料。

  • 您可以在 Linux Gazette 上 Juan I. Santos Florido 的日志文件系統(tǒng)回顧中找到一些有關(guān) UFS、ext2、ReiserFS 之間元數(shù)據(jù)的差異,以及其它內(nèi)容的非常詳細(xì)的信息。

  • Jedi 的 ReiserFS/Qmail 調(diào)整頁面包含許多對 qmail 用戶很有用的信息。請務(wù)必還要查看 ReiserSMTP - Jedi 收集的眾多 qmail 組件,它們顯著提升了 qmail 的性能。

  • 看看 mutt 電子郵件客戶,它可以用來讀取大的 maildir 形式的郵箱。

  • 閱讀 Linus Torvalds 最近關(guān)于 dump 和 restore 的評論。

  • 參加 developerWorks 編譯 Linux 內(nèi)核的免費(fèi)教程。

  • 瀏覽 developerWorks更多 Linux 參考資料。

  • 瀏覽 developerWorks 更多開放源代碼參考資料。
  • O‘Reilly 的 Linux Device Drivers,2nd Edition 通常對那些想大體上學(xué)習(xí)更多關(guān)于設(shè)備注冊和 Linux 設(shè)備驅(qū)動程序編程的人來說,的確是本很好的書和參考資料。
  • 一定要閱讀 Richard Gooch(Linux devfs 的創(chuàng)始人)的 Linux Devfs FAQ。它完全、詳細(xì)并最新。您還能要求什么?
  • 有一個 devfs 郵件列表可以使用。如果要訂閱,請發(fā)電子郵件到 majordomo@oss.,并在消息正文部分注明 subscribe。Devfs 清單檔案可以在 http://oss./projects/devfs/archive/獲得。
  • 您可能還想訪問 Richard Gooch 的主頁;它包含 devfs 和其它一些好東西。
  • Linux Weekly News 是與最新的內(nèi)核發(fā)展保持同步的很好的參考資料。
  • 關(guān)于作者
    作者Daniel Robbins 是 Gentoo Technologies,Inc. 的總裁/首席執(zhí)行官,住在新墨西哥州的 Albuquerque,他是
    Gentoo Linux(一種 PC 機(jī)上的高級 Linux)和 Portage 系統(tǒng)(Linux 的下一代移植系統(tǒng))的創(chuàng)建者。他還是 Macmillan 的書籍 - Caldera OpenLinux UnleashedSuSE Linux UnleashedSamba Unleashed - 的特約作者。Daniel 從他二年級時接觸到 Logo 編程語言和 Pac Man 游戲的潛在危險魔力后就被這股熱流卷進(jìn)了計算機(jī)中。這或許可以解釋他為什么曾經(jīng)是 SONY 電子出版/游戲公司的首席圖形設(shè)計師了。Daniel 喜歡花時間和他的妻子 Mary 還有他剛出生的寶貝女兒 Hadassah 在一起。您可以通過 drobbins@ 聯(lián)系他。


      本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多