国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
高級文件系統(tǒng)實現(xiàn)者指南
 高級文件系統(tǒng)實現(xiàn)者指南 (linux gentoo)

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

 

日志和 ReiserFS

Daniel Robbins (drobbins@gentoo.org)
總裁/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)實現(xiàn)者指南中,Daniel Robbins 通過向您展示如何在 Linux 2.4的環(huán)境下建立這些新的高級文件系統(tǒng)來回答以上的問題。遵從這個方法,他提供了在實際實現(xiàn)過程中的有價值的建議,性能信息和重要的技術性注意要點,以便于您在新的文件系統(tǒng)中能有令人愉快的經(jīng)歷。在這里,也就是這個系列的第一篇文章中,他解說了日志和 ReiserFS 的優(yōu)點。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ReiserFS 確實是一個非常出色的文件系統(tǒng)。在我的下一篇文章中,我將會指導您在 Linux 2.4 下完成 ReiserFS 安裝的全過程。我們還將仔細地看一看性能調(diào)整,應用程序交互作用(和怎么圍繞他們工作)以及使用的最佳內(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 運行在 2.4 系列的內(nèi)核下。我還會和您分享很多關于不同主題的技術信息,包括使用ReiserFS 最好的 2.4內(nèi)核,性能注意事項等等。因為我首先會談到安裝,所以我建議您先通讀本文,然后再遵循安裝指示。這樣,您開始在自己的系統(tǒng)上運行 ReiserFS的時候,腦子里就會有所有的技術注解,這樣您就可以在各個步驟作必要的調(diào)整。

尋找好的內(nèi)核
要在您的系統(tǒng)上使用 ReiserFS,您首先需要找到一個合適的內(nèi)核。如果您已經(jīng)熟悉 2.4內(nèi)核的發(fā)展,您就會知道這個過程比它聽起來要復雜。本文完成時,最新的內(nèi)核是 2.4.6-pre2;但是我建議您在自己的 ReiserFS系統(tǒng)上還是使用 2.4.4(標準的 Linus 內(nèi)核)或者 2.4.4-ac9(稍作改進的 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)定的。當然,如果您是在一個測試服務器上安裝ReiserFS,只要不會丟失重要的數(shù)據(jù),您就可以隨意使用任一種內(nèi)核。

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

這段信息的意思不是要嚇得您不敢使用 ReiserFS 或者 Linux 2.4,而是要給那些更敢于冒險的人一點理性。不要總是在重要的系統(tǒng)上使用各種還處于測試期的內(nèi)核;如果這樣,您吃到苦頭的。當您使用一個不可靠的內(nèi)核時,您不僅僅面臨著系統(tǒng)鎖定的危險;您還面臨著丟失數(shù)據(jù)和文件系統(tǒng)崩潰的危險,這是您絕對不希望發(fā)生的。即便 ReiserFS 實現(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ù)吧。

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

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

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


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

要使用 ac9 補丁,請從 kernel.org 下載 Alan Cox ac9 補丁。然后鍵入:

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


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

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


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

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

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

重點:保存當前內(nèi)核并配置引導裝載器(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)建標準分區(qū),您可以簡單地將此分區(qū)標記為一個“Linux nativefile system”(83)。

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

# mkreiserfs /dev/hdxy


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

# mount /dev/hdxy /mnt/reiser


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

/dev/hdc1       /home                   reiserfs        defaults       0 0


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

ReiserFS 技術注解

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

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

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

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

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

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

/dev/hdc1       /home                   reiserfs        noatime       0 0


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

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

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


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

# mount / -o remount,notail


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

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

然而除了所有這些,關于 ReiserFS 最激動人心的地方是它將來的發(fā)展方向。HansReiser 對 ReiserFS有一個非常激進而創(chuàng)新的計劃,包括計劃擴展文件系統(tǒng)從而能夠?qū)⑵渥鳛橐粋€發(fā)展成熟的高性能數(shù)據(jù)庫來使用,最后還包括事務支持和高級查詢功能。這意味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)。在本文中,我們要談論幾個相對次要的主題。首先,我們會簡單地介紹一下 tmpfs,也就是我們知道的虛擬內(nèi)存(virtualmemory,VM)文件系統(tǒng)。Tmpfs 可能是現(xiàn)在 Linux 可以使用的最好的類似于 RAM 磁盤的系統(tǒng),而且是 2.4內(nèi)核的一個新功能。然后,我們將簡單地介紹另一個 2.4內(nèi)核的新功能,叫做“綁定安裝”,它在安裝(和重新安裝)文件系統(tǒng)的時候帶來了很大的靈活性。在下一篇文章中,我們會把重點集中在 devfs上,之后,我們會花點時間來進一步熟悉新的 ext3 文件系統(tǒng)。

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

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

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

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

# mount tmpfs /mnt/tmpfs -t tmpfs

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

Tmpfs 的優(yōu)勢

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

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

沒有持久性
這看起來可能不象是個積極因素,tmpfs 數(shù)據(jù)在重新啟動之后不會保留,因為虛擬內(nèi)存本質(zhì)上就是易失的。我想您可能猜到了 tmpfs被稱為“tmpfs”的一個原因,不是嗎?然而,這實際上可以是一件好事。它讓 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)了。其實,在您所有的 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)增大或減小的事實讓人疑惑:如果您的 tmpfs 文件系統(tǒng)增大到它耗盡了所有虛擬內(nèi)存的程度,而您沒有剩余的 RAM 或交換分區(qū),這時會發(fā)生什么?一般來說,這種情況是有點討厭。如果是 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)的其他一些進程會無法分配更多的內(nèi)存;通常,這意味著系統(tǒng)多半會變得極度緩慢而且?guī)缀鯖]有響應。這樣,超級用戶要采取必要的步驟來緩解這種低 VM 的情況就會很困難,或異常地耗時。

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

低 VM:解決方案
幸運的是,tmpfs 允許您在安裝或重新安裝文件系統(tǒng)的時候指定文件系統(tǒng)容量的最大值上限。實際上,從 2.4.6 內(nèi)核到 2.11g 內(nèi)核,這些參數(shù)只能在安裝時設置,而不是重新安裝時,但我們可以期望在不久的將來可以在重新安裝時設置這些參數(shù)。tmpfs 容量最大值的最佳設置依賴于資源和您特定的Linux 主機的使用模式;這個想法是要防止一個完全使用資源的 tmpfs 文件系統(tǒng)耗盡所有虛擬內(nèi)存結果導致我們前面談到的糟糕的低 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)的“正式”安裝點。如果您正好在使用 devfs,您會發(fā)現(xiàn)這個目錄已經(jīng)為您創(chuàng)建好了。

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

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

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

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

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

可是,這種解決方案也許對您不管用??赡苡泻芏嗾谶\行的進程在 /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)上還有打開文件的進程都可以繼續(xù)訪問它們。而且,如果您 unmount 基于 tmpfs 的 /tmp,原來安裝的 /tmp 文件系統(tǒng)會重新出現(xiàn)。實際上,您在相同的安裝點上可以安裝任意數(shù)目的文件系統(tǒ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)映射到兩個不同的安裝點。注意,當您在另一處安裝文件系統(tǒng)時,任何安裝在綁定安裝文件系統(tǒng)內(nèi)部的安裝點的文件系統(tǒng)都不會隨之移動。換句話說,如果您在單獨的文件系統(tǒng)上有/usr,我們前面執(zhí)行的綁定安裝就會讓 /home/drobbins/nifty/usr 為空。您會需要附加的綁定安裝命令來使您能夠瀏覽位于/home/drobbins/nifty/usr 的 /usr 的內(nèi)容:

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

綁定安裝部分文件系統(tǒng)
綁定安裝讓更妙的事情成為可能。假設您有一個 tmpfs 文件系統(tǒng)安裝在它的傳統(tǒng)位置 /dev/shm,您決定要開始在當前位于根文件系統(tǒng)的/tmp 使用 tmpfs。雖然可以在 /tmp(這是可能的)安裝一個新的 tmpfs 文件系統(tǒng),您也可以決定讓新的 /tmp 共享當前安裝的 /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權限,對 /tmp 適當?shù)脑S可。既然我們的目錄已經(jīng)準備好了,我們可以安裝,也只能安裝 /dev/shm/tmp 到 /tmp。所以,雖然/tmp/foo 會映射到 /dev/shm/tmp/foo,但您沒有辦法從 /tmp 訪問 /dev/shm/bar 文件。

正如您所見,綁定安裝非常強大,讓您可以輕易地修改文件系統(tǒng)設計,絲毫不必忙亂。下一篇文章,我們會談到 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)來回答以上的問題。遵從這個方法,他提供了在實際實現(xiàn)過程中的有價值的建議、性能信息和重要的技術性注意要點,以便于您在新的文件系統(tǒng)中能有盡可能令人愉快的經(jīng)歷。在本文中:Daniel 解釋了使用設備管理文件系統(tǒng) devfs的意義和好處,讓您對其有所認識以便在下一篇文章中向您展示如何最佳地在系統(tǒng)上安裝 devfs。

介紹 devfs

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

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

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

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

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

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

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

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

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

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

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

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

進入 devfs

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

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

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

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

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

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

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

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

參考資料

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

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

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

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

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

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

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

  • 閱讀 Linus Torvalds 最近關于 dump 和 restore 的評論。

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

  • 瀏覽 developerWorks更多 Linux 參考資料

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


    本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
    打開APP,閱讀全文并永久保存 查看更多類似文章
    猜你喜歡
    類似文章
    Linux環(huán)境下的ReiserFS文件系統(tǒng)
    UC頭條:Linux文件系統(tǒng)(一)文件系統(tǒng)基本概念
    Linux通用系統(tǒng)優(yōu)化
    關于Linux系統(tǒng)性能調(diào)優(yōu)需要了解的幾點
    linux文件系統(tǒng)基礎知識
    mount 中文手冊-掛載設備指南(轉載內(nèi)容較長)
    更多類似文章 >>
    生活服務
    分享 收藏 導長圖 關注 下載文章
    綁定賬號成功
    后續(xù)可登錄賬號暢享VIP特權!
    如果VIP功能使用有故障,
    可點擊這里聯(lián)系客服!

    聯(lián)系客服