你能在 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)聽起來的確都很酷,但是它們真正能做些什么呢,擅長(zhǎng)在哪些方面,以及在 Linux產(chǎn)品環(huán)境下如何才能安全地使用它們呢?在高級(jí)文件系統(tǒng)實(shí)現(xiàn)者指南中,Daniel Robbins 通過向您展示如何在 Linux 2.4的環(huán)境下建立這些新的高級(jí)文件系統(tǒng)來回答以上的問題。遵從這個(gè)方法,他提供了在實(shí)際實(shí)現(xiàn)過程中的有價(jià)值的建議,性能信息和重要的技術(shù)性注意要點(diǎn),以便于您在新的文件系統(tǒng)中能有令人愉快的經(jīng)歷。在這里,也就是這個(gè)系列的第一篇文章中,他解說了日志和 ReiserFS 的優(yōu)點(diǎn)。
準(zhǔn)備好的內(nèi)容
這一系列文章的目的是向您詳實(shí)地介紹 Linux 的各種新的文件系統(tǒng),包括 ReiserFS、XFS、JFS、GFS、ext3和其它的文件系統(tǒng)。我要讓您知道一些必要的實(shí)用知識(shí),有了這些知識(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)容。但是要開始這一系列工作,我還有一篇文章要脫離這個(gè)主題,用來為接下來的行程做準(zhǔn)備。我將會(huì)涉及兩個(gè)對(duì)于 Linux 開發(fā)社區(qū)非常重要的主題 — 日志和 ReiserFS后的設(shè)計(jì)理念。日志是非常重要的,因?yàn)樗俏覀冮L(zhǎng)期以來一直期待的技術(shù),而現(xiàn)在終于出現(xiàn)了。在 ReiserFS、XFS、JFS、ext3 和GFS 中都用到它。確切地理解日志是做什么的和為什么 Linux需要它是非常重要的。即使您對(duì)日志已有所掌握,我還是希望我有關(guān)日志的介紹可以成為一個(gè)好的模型,以用來向其他人解釋這項(xiàng)技術(shù),或者作為一項(xiàng)慣例,以利于全世界的部門和組織開始向這些新的日志文件系統(tǒng)進(jìn)行轉(zhuǎn)變。這個(gè)過程通常是由“Linux guy/gal”開始的,就像您自己也會(huì)說服其他人應(yīng)該這么做。
在這篇文章的后半部分,我們將看看 ReiserFS后的設(shè)計(jì)理念。通過這么做,我們能夠很好地掌握一個(gè)事實(shí),那就是這些新的文件系統(tǒng)并不只是為了做同樣的事比老的系統(tǒng)快一點(diǎn)。它們還允許我們用以前完全不可能的方法來處理事情。開發(fā)人員在閱讀這一系列文章時(shí)應(yīng)該牢記這一點(diǎn)。這些新的文件系統(tǒng)的能力 將很可能對(duì)您今后的 Linux 軟件開發(fā)工程的代碼編寫產(chǎn)生影響。
理解日志:元數(shù)據(jù)
正如您所了解的那樣,文件系統(tǒng)的存在允許您儲(chǔ)存、檢索和操作數(shù)據(jù)。為了實(shí)現(xiàn)這一目的,文件系統(tǒng)需要保持一個(gè)內(nèi)在的數(shù)據(jù)結(jié)構(gòu)使得您的數(shù)據(jù)有組織并且便于訪問。這一內(nèi)部的數(shù)據(jù)結(jié)構(gòu)(確切地說就是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”)被稱為 元數(shù)據(jù)。就是這個(gè)元數(shù)據(jù)的結(jié)構(gòu)為文件系統(tǒng)提供了其特定的身份和性能特征。
通常,我們并不直接和文件系統(tǒng)的元數(shù)據(jù)打交道。而是一個(gè)特別的 Linux 文件系統(tǒng)驅(qū)動(dòng)程序?yàn)槲覀冏飨鄳?yīng)的工作。Linux文件系統(tǒng)驅(qū)動(dòng)程序是專門用來操作復(fù)雜的元數(shù)據(jù)的。然而,為了使得文件系統(tǒng)驅(qū)動(dòng)程序正常工作,有一個(gè)很重要的必要條件;它需要在某種合理的、一致的和沒有干擾的狀態(tài)下找到元數(shù)據(jù)。否則,文件系統(tǒng)驅(qū)動(dòng)程序就不能理解和操作元數(shù)據(jù),那么您也就不能存取文件了。
理解日志:fsck
這就引出了 fsck。當(dāng) Linux 系統(tǒng)啟動(dòng)時(shí),fsck 啟動(dòng)并掃描系統(tǒng)的 /etc/fstab 文件中列出的所有本地文件系統(tǒng)。fsck的工作就是確保要裝載的文件系統(tǒng)的元數(shù)據(jù)是處于可使用的狀態(tài)。大多數(shù)的時(shí)候是可使用的。當(dāng) Linux關(guān)閉時(shí),它仔細(xì)地把所有的緩沖區(qū)數(shù)據(jù)轉(zhuǎn)送到磁盤,并確保文件系統(tǒng)被徹底卸載,以保證系統(tǒng)再次啟動(dòng)時(shí)能夠使用。典型的就是,fsck掃描那些將被裝載的文件系統(tǒng),確定它們已被徹底卸載,并做出合理的假設(shè) — 所有的元數(shù)據(jù)都沒有問題。
然而,我們都知道不時(shí)地會(huì)有一些意外發(fā)生,例如意想不到的電源故障或者系統(tǒng)掛起。當(dāng)出現(xiàn)這些不幸的情況時(shí),Linux 沒有機(jī)會(huì)徹底卸載文件系統(tǒng)。當(dāng)系統(tǒng)重新啟動(dòng),fsck開始掃描時(shí),它會(huì)檢測(cè)到這些沒有徹底卸載的文件系統(tǒng),并做出合理的假設(shè) — 文件系統(tǒng)可能沒有為 Linux文件系統(tǒng)驅(qū)動(dòng)程序準(zhǔn)備好。這就很有可能導(dǎo)致元數(shù)據(jù)在某種情況下陷入困境。
所以,為了彌補(bǔ)這種情況,fsck將開始徹底的掃描并且全面地檢查元數(shù)據(jù),修正這一過程中找到的任何錯(cuò)誤。一旦 fsck完成這樣的工作,文件系統(tǒng)就可以使用了。盡管意想不到的電源故障或者系統(tǒng)掛起可能造成最近修改的數(shù)據(jù)丟失,但是由于元數(shù)據(jù)現(xiàn)在是一致的,文件系統(tǒng)就可以被裝載和投入使用了。
fsck 的問題
迄今為止,為確保文件系統(tǒng)的一致性,這種方法可能聽起來并不是個(gè)壞主意,但是卻不是最佳的解決方案。問題出自于這樣一個(gè)事實(shí) — fsck 必須掃描文件系統(tǒng)全部的元數(shù)據(jù),以確保文件系統(tǒng)的一致性。對(duì)所有的元數(shù)據(jù)做徹底的一致性檢查是一項(xiàng)極為費(fèi)時(shí)的工作。通常至少要花上好幾分鐘才能完成。更糟糕的是,文件系統(tǒng)越大,完成這個(gè)徹底的掃描所花費(fèi)的時(shí)間就 越長(zhǎng)。這就是個(gè)大問題,因?yàn)楫?dāng) fsck 做它自己事情的時(shí)候,您的 Linux系統(tǒng)實(shí)際上就是被切斷的,并且如果您有一個(gè)龐大數(shù)量的文件系統(tǒng)存儲(chǔ),您的系統(tǒng)可能就會(huì)花上半個(gè)小時(shí)或者更長(zhǎng)的時(shí)間來執(zhí)行fsck。當(dāng)然,在任務(wù)緊要的數(shù)據(jù)中心的環(huán)境里,也就是在系統(tǒng)正常運(yùn)行極為重要的環(huán)境下,標(biāo)準(zhǔn)的 fsck工作可能會(huì)造成破壞性的結(jié)果。幸運(yùn)的是,有更好的解決方案。
日志
日志文件系統(tǒng)通過增加一個(gè)叫做日志的新的數(shù)據(jù)結(jié)構(gòu)來解決這個(gè) fsck問題。這個(gè)日志是位于磁盤上的結(jié)構(gòu)。在對(duì)元數(shù)據(jù)做任何改變以前,文件系統(tǒng)驅(qū)動(dòng)程序會(huì)向日志中寫入一個(gè)條目,這個(gè)條目描述了它將要做些什么。然后,它繼續(xù)并修改元數(shù)據(jù)。通過這種方法,日志文件系統(tǒng)就擁有了近期元數(shù)據(jù)被修改的歷史記錄,當(dāng)檢查到?jīng)]有徹底卸載的文件系統(tǒng)的一致性問題時(shí),這個(gè)記錄就唾手可得了。
可以這樣來看待日志文件系統(tǒng) — 除了存儲(chǔ)數(shù)據(jù)(您的素材)和元數(shù)據(jù)(關(guān)于素材的數(shù)據(jù))以外,它們還有一個(gè)日志。您可以稱它們?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)程序中。當(dāng)文件系統(tǒng)被裝載時(shí),Linux文件系統(tǒng)驅(qū)動(dòng)程序查看文件系統(tǒng)是否完好。如果由于某些原因出了問題,那么就需要對(duì)元數(shù)據(jù)進(jìn)行修復(fù),但不是執(zhí)行對(duì)元數(shù)據(jù)的徹底掃描(就像 fsck那樣),而是查看日志。由于日志中包含了按時(shí)間順序排列的近期的元數(shù)據(jù)修改記錄,它就簡(jiǎn)單地查看 最近被修改的那部分元數(shù)據(jù)。因而,它能夠在幾秒鐘時(shí)間內(nèi)將文件系統(tǒng)恢復(fù)到一致性狀態(tài)。并且與 fsck 所采用的傳統(tǒng)方法不同,這個(gè)日志重放過程在大型的文件系統(tǒng)上并不需要花更多的時(shí)間。多虧了日志,數(shù)百 G 的文件系統(tǒng)元數(shù)據(jù)幾乎能在瞬間恢復(fù)到一致性的狀態(tài)。
ReiserFS
現(xiàn)在,我們來談一談 ReiserFS,它是我們將要研究的幾個(gè)日志文件系統(tǒng)中的第一個(gè)。ReiserFS 3.6.x(作為 Linux 2.4 一部分的版本)是由 Hans Reiser 和他的在 Namesys的開發(fā)組共同開發(fā)設(shè)計(jì)的。Hans和他的組員們相信最好的文件系統(tǒng)是那些能夠有助于創(chuàng)建獨(dú)立的共享環(huán)境或者命名空間的文件系統(tǒng),應(yīng)用程序可以在其中更直接、有效和有力地相互作用。為了實(shí)現(xiàn)這一目標(biāo),文件系統(tǒng)就應(yīng)該滿足其使用者對(duì)性能和功能方面的需要。那樣,使用者就能夠繼續(xù)直接地使用文件系統(tǒng),而不必建造運(yùn)行在文件系統(tǒng)之上(如數(shù)據(jù)庫之類)的特殊目的層。
小文件的性能
那么,如何能使文件系統(tǒng)更加適應(yīng)環(huán)境呢?Namesys 已經(jīng)決定著眼于文件系統(tǒng)的一個(gè)方面,至少最初是 — 小文件的性能。通常,像 ext2 和ufs這樣的文件系統(tǒng)在這一方面做的并不是很好,經(jīng)常迫使開發(fā)人員轉(zhuǎn)向數(shù)據(jù)庫或者特別組織的處理來獲取他們所需要的某種性能。隨著時(shí)間的推移,這種“圍繞問題進(jìn)行編碼”的方法慫恿了代碼的膨脹和許多不兼容的特殊目的 API,這并不是好事情。
這兒有一個(gè) ext2如何鼓勵(lì)這種編程的例子。ext2 很擅長(zhǎng)存儲(chǔ)大量大小在 20k 以上的文件,但是對(duì)于存儲(chǔ) 2,000 個(gè) 50字節(jié)的文件來說,它就不是一種很理想的技術(shù)了。當(dāng) ext2 必須處理非常小的文件時(shí),不只是性能顯著地下降,而且存儲(chǔ)效率也同樣下降,因?yàn)?ext2是按 1k 或者 4k 的塊來分配空間的(可在文件系統(tǒng)創(chuàng)建時(shí)設(shè)定)。
現(xiàn)在,常規(guī)的明智做法會(huì)提示您不應(yīng)該在文件系統(tǒng)上儲(chǔ)存這么多小的文件。而是應(yīng)該存儲(chǔ)在某種運(yùn)行在文件系統(tǒng)之上的數(shù)據(jù)庫里。作為對(duì)這種說法的回應(yīng),Hans Reiser指出無論何時(shí)您需要在文件系統(tǒng)的頂上建立一層,那就意味著文件系統(tǒng)不滿足您的需要。如果文件系統(tǒng)滿足您的需要,那么您首先就要避免使用特殊目的的解決方案。這樣就可以節(jié)省開發(fā)的時(shí)間,并消除代碼膨脹。這些代碼可能是在您手動(dòng)處理自己的個(gè)人存儲(chǔ)器或者緩沖機(jī)制時(shí),或者與數(shù)據(jù)庫的某個(gè)庫交互作用過程時(shí)所產(chǎn)生的。
理論上是這樣。但是在實(shí)際運(yùn)用中,ReiserFS 的小文件性能會(huì)是如何的好呢?好得讓人吃驚。實(shí)際上,當(dāng)處理小于 1k 的文件時(shí),ReiserFS 大概要比 ext2 快 8 到 15 倍!更妙的是,這些性能提高并不以其它文件類型的性能損失為代價(jià)。通常,ReiserFS 幾乎在各個(gè)方面都優(yōu)于 ext2,但是在處理小文件時(shí)才真正體現(xiàn)出了其閃光點(diǎn)。
ReiserFS 技術(shù)
那么 ReiserFS 是怎樣提供如此出色的小文件性能的呢?ReiserFS 使用了特殊的優(yōu)化 b*平衡樹(每個(gè)文件系統(tǒng)一個(gè))來組織所有的文件系統(tǒng)數(shù)據(jù)。這為其自身提供了非常不錯(cuò)的性能改進(jìn),也能夠減輕文件系統(tǒng)設(shè)計(jì)上的人為約束。例如,現(xiàn)在一個(gè)目錄下可以容納 100,000 個(gè)子目錄。另一個(gè)使用 b* 樹的好處就是 ReiserFS能夠像大多其它的下一代文件系統(tǒng)一樣,根據(jù)需要?jiǎng)討B(tài)地分配索引節(jié),而不必在文件系統(tǒng)創(chuàng)建時(shí)建立固定的索引節(jié)。這有助于文件系統(tǒng)更靈活地適應(yīng)其面臨的各種存儲(chǔ)需要,同時(shí)提供附加的空間有效率。
ReiserFS 有許多特征是特別針對(duì)提高小文件的性能的。和 ext2 不同,ReiserFS并不固定地以 1k 或者 4k 的塊分配存儲(chǔ)空間,而是分配所需要的精確尺寸。而且 ReiserFS 也包括了以尾文件為中心的特殊優(yōu)化 —尾文件是指那些比文件系統(tǒng)塊小的文件及文件結(jié)尾部分。為了提高性能,ReiserFS 能夠在 b*樹的葉子節(jié)點(diǎn)存儲(chǔ)文件,而不是把數(shù)據(jù)存儲(chǔ)在磁盤的其它地方再指向它。
這做了兩件事。第一,它顯著地提高了小文件的性能。由于文件數(shù)據(jù)和stat_data(索引節(jié))信息是緊挨著存儲(chǔ)的,它們通常能被同一次磁盤 IO 操作所讀取。第二,ReiserFS能夠壓縮尾文件,節(jié)省大量磁盤空間。實(shí)際上,帶有尾文件壓縮功能(默認(rèn))的 ReiserFS 文件系統(tǒng)可以比同等的 ext2 文件系統(tǒng)多存儲(chǔ) 6個(gè)百分點(diǎn)的數(shù)據(jù),這就其自身來說是令人驚嘆的。
然而,由于在文件被修改時(shí),尾文件壓縮迫使 ReiserFS 重裝數(shù)據(jù),這就導(dǎo)致了性能上的輕微折損。鑒于這個(gè)原因,ReiserFS 尾文件壓縮可以被關(guān)掉,允許系統(tǒng)管理員在速度與空間有效率上做出選擇,或者犧牲一些存儲(chǔ)能力來換取更高的速度。
ReiserFS 確實(shí)是一個(gè)非常出色的文件系統(tǒng)。在我的下一篇文章中,我將會(huì)指導(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)聽起來很“酷”,但是它們到底能做些什么呢,它們擅長(zhǎng)什么,還有您究竟怎樣才能在一個(gè)產(chǎn)品 Linux環(huán)境中安全地使用它們呢?在本系列文章中,Daniel Robbins 通過向您展示怎樣在 Linux 2.4下安裝這些新的高級(jí)文件系統(tǒng),回答了這些問題。在他的本系列前面的文章中, Daniel 介紹了日志和 ReiserFS 的好處。在本文中 Daniel 將教您安裝一個(gè)非常穩(wěn)定的基于 Linux 2.4 的 ReiserFS 系統(tǒng)。
在本文中,我會(huì)向您展示如何讓 ReiserFS 運(yùn)行在 2.4 系列的內(nèi)核下。我還會(huì)和您分享很多關(guān)于不同主題的技術(shù)信息,包括使用ReiserFS 最好的 2.4內(nèi)核,性能注意事項(xiàng)等等。因?yàn)槲沂紫葧?huì)談到安裝,所以我建議您先通讀本文,然后再遵循安裝指示。這樣,您開始在自己的系統(tǒng)上運(yùn)行 ReiserFS的時(shí)候,腦子里就會(huì)有所有的技術(shù)注解,這樣您就可以在各個(gè)步驟作必要的調(diào)整。
尋找好的內(nèi)核
要在您的系統(tǒng)上使用 ReiserFS,您首先需要找到一個(gè)合適的內(nèi)核。如果您已經(jīng)熟悉 2.4內(nèi)核的發(fā)展,您就會(huì)知道這個(gè)過程比它聽起來要復(fù)雜。本文完成時(shí),最新的內(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)核)。從我的測(cè)試看來,2.4.5 似乎很不穩(wěn)定,所以我不推薦將這個(gè)內(nèi)核作為產(chǎn)品使用;讓我們希望 2.4.6 會(huì)比它好很多吧。
如果您想在自己的產(chǎn)品 ReiserFS 系統(tǒng)中使用除 2.4.4 或 2.4.4-ac9 以外的其它內(nèi)核, 一定要作必要的檢查以確保ReiserFS(和內(nèi)核大體上)是穩(wěn)定的。當(dāng)然,如果您是在一個(gè)測(cè)試服務(wù)器上安裝ReiserFS,只要不會(huì)丟失重要的數(shù)據(jù),您就可以隨意使用任一種內(nèi)核。
總的來說,要注意內(nèi)核穩(wěn)定性問題,特別是 ReiserFS的穩(wěn)定性問題,這有兩個(gè)原因。因?yàn)?ReiserFS 是一個(gè)“實(shí)驗(yàn)的”內(nèi)核功能,您不能假定一個(gè)使用新內(nèi)核的 ReiserFs 實(shí)現(xiàn)剛剛從tarball 中解出就能夠很好地運(yùn)行。第二個(gè)原因(也許在目前是更重要的問題)在于大部分的 2.4內(nèi)核發(fā)行版和補(bǔ)丁都有一點(diǎn)不穩(wěn)定,所以目前您行動(dòng)時(shí)還是需要謹(jǐn)慎一點(diǎn)。理論上,所有的 2.4 發(fā)行版都應(yīng)該是準(zhǔn)產(chǎn)品化的,因?yàn)?2.4版本應(yīng)該是一個(gè)穩(wěn)定的系列;但是,實(shí)際上它們(還)不是,所以強(qiáng)烈鼓勵(lì)您小心使用新的、沒有測(cè)試過的內(nèi)核。
這段信息的意思不是要嚇得您不敢使用 ReiserFS 或者 Linux 2.4,而是要給那些更敢于冒險(xiǎn)的人一點(diǎn)理性。不要總是在重要的系統(tǒng)上使用各種還處于測(cè)試期的內(nèi)核;如果這樣,您 會(huì)吃到苦頭的。當(dāng)您使用一個(gè)不可靠的內(nèi)核時(shí),您不僅僅面臨著系統(tǒng)鎖定的危險(xiǎn);您還面臨著丟失數(shù)據(jù)和文件系統(tǒng)崩潰的危險(xiǎn),這是您絕對(duì)不希望發(fā)生的。即便 ReiserFS 實(shí)現(xiàn)本身是穩(wěn)定的,內(nèi)核其他部分的主要錯(cuò)誤也很可能引起文件系統(tǒng)崩潰的產(chǎn)生。
如果您沒有最新的內(nèi)核穩(wěn)定性信息來源,我建議您定期地訪問 Linux 每周新聞(請(qǐng)參閱本文后面的參考資料),及時(shí)了解最新的可能出現(xiàn)的內(nèi)核問題(信息每個(gè)星期四更新)。希望現(xiàn)在我已經(jīng)說服了更多喜歡冒險(xiǎn)的讀者堅(jiān)持使用 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)行一個(gè)準(zhǔn)產(chǎn)品化的 ReiserFS 系統(tǒng)的三種選擇。第一種選擇是只用標(biāo)準(zhǔn) 2.4.4 Linux內(nèi)核。第二種選擇是使用 2.4.4 內(nèi)核,同時(shí)使用 ReiserFS 大補(bǔ)丁,它包括了一些專門的補(bǔ)丁,使 ReiserFS達(dá)到配額兼容,并與在本機(jī)運(yùn)行的 NFS 服務(wù)器更加兼容。第三種選擇是,我們可以使用 2.4.4 內(nèi)核和 ac9 補(bǔ)?。?.4.4-ac9),再加上或不加大補(bǔ)丁。通常我推薦使用 2.4.4-ac9 和大補(bǔ)丁,因?yàn)榇笱a(bǔ)丁并沒有任何負(fù)作用,而且您可能會(huì)需要它,而且ac9 比標(biāo)準(zhǔn)內(nèi)核執(zhí)行得好多了。但是,如果您不愿意使用 ac 內(nèi)核,標(biāo)準(zhǔn) 2.4.4 也不錯(cuò)了。我會(huì)簡(jiǎn)單地向您介紹設(shè)置 2.4.4-ac9和大補(bǔ)丁的步驟,但是如果因?yàn)槟承┰蚰辉赴惭b這兩個(gè)補(bǔ)丁或其中之一,只要跳過這個(gè)步驟即可?,F(xiàn)在,讓我們開始吧。
首先,從 kernel.org 下載 2.4.4 內(nèi)核源碼并進(jìn)入您的 /usr/src 目錄。 移去該處的任何 linux 目錄或者符號(hào)連接,如果是目錄就將其改名,如果是符號(hào)連接就只需刪除它。然后:
|
ac9 補(bǔ)丁和大補(bǔ)丁
如果您計(jì)劃只用標(biāo)準(zhǔn) 2.4.4 內(nèi)核,您就已經(jīng)擁有全部所需的資源了,可以跳過其余的補(bǔ)丁。然而,我推薦您繼續(xù)使用下面的 ac 補(bǔ)丁和大補(bǔ)丁。
要使用 ac9 補(bǔ)丁,請(qǐng)從 kernel.org 下載 Alan Cox ac9 補(bǔ)丁。然后鍵入:
|
一旦標(biāo)準(zhǔn)內(nèi)核安裝完畢,就到 DiCE 去下載 DiCE 的 ReiserFS 大補(bǔ)丁。這個(gè)步驟還是可選的,不過也是推薦的,特別是如果您將在此系統(tǒng)上運(yùn)行 NFS 服務(wù)器或者需要配額(如果不是這樣,無論如何這個(gè)補(bǔ)丁也不會(huì)有什么壞處)。要使用大補(bǔ)丁請(qǐng)遵循以下步驟:
|
一旦所有可選的修正和大補(bǔ)丁安裝完畢,您就可以為 ReiserFS 配置內(nèi)核了。
注意:如果您需要更多關(guān)于如何編譯 Linux 內(nèi)核的指導(dǎo),可參閱 developerWorks 上的 編譯 Linux 內(nèi)核免費(fèi)教程。下面是一個(gè)簡(jiǎn)單的摘要。
配置內(nèi)核非常簡(jiǎn)單。首先,鍵入“make menuconfig”。在“Code maturity leveloptions”部分,確保啟用了“Prompt for development and/or incompletecode/drivers”選項(xiàng)。然后到“File systems”部分,啟用“ReiserFS support”選項(xiàng)。 您將 ReiserFS設(shè)置為直接編譯到內(nèi)核中(而不是作為一種模塊);而且通常啟用“Have reiserFS do extra internalchecking”這個(gè)選項(xiàng)不是什么好主意?,F(xiàn)在,保存您的設(shè)置,編譯您的內(nèi)核(“make dep;make bzImage;makemodules;make modules_install”),然后配置您的引導(dǎo)裝載器(boot loader)來裝載新的配置了ReiserFS 的內(nèi)核。
重點(diǎn):保存當(dāng)前內(nèi)核并配置引導(dǎo)裝載器(boot loader)總是個(gè)好主意,這樣萬一您的新內(nèi)核無法工作,您就可以用原來的內(nèi)核啟動(dòng)。
安裝工具
在重新啟動(dòng)之前,我們需要安裝“reiserfsprogs”工具,它包括了“mkreiserfs”、“resize_reiserfs”(對(duì) LVM 用戶很有用),還有“fsck.reiserfs”。您可以從 Namesys.com 下載頁下載最新版本的“reiserfsprogs”(目前是“3.x.0j”)。一旦這些工具下載完畢,您就可以按以下步驟編譯和安裝“reiserfsprogs”了:
|
既然工具已經(jīng)安裝完畢,現(xiàn)在您可以按需要?jiǎng)?chuàng)建任何新的分區(qū)(使用“fdisk”或者“cfdisk”)或 LVM邏輯卷(使用“lvcreate”)并重新啟動(dòng)您的系統(tǒng)。如果您正在創(chuàng)建標(biāo)準(zhǔn)分區(qū),您可以簡(jiǎn)單地將此分區(qū)標(biāo)記為一個(gè)“Linux nativefile system”(83)。
創(chuàng)建和安裝文件系統(tǒng)
重新啟動(dòng)后,您就可以在一個(gè)空的分區(qū)上創(chuàng)建 ReiserFS 文件系統(tǒng),如下所示:
|
在上面的示例中,/dev/hdxy 應(yīng)該是對(duì)應(yīng)于一個(gè)空閑分區(qū)的設(shè)備節(jié)點(diǎn)。象安裝其它文件系統(tǒng)一樣安裝它:
|
而且,如果您想在自己的 /etc/fstab 文件中添加一個(gè) ReiserFS 文件系統(tǒng),只需將“freq”和“passno”字段設(shè)置為“0”,如下所示:
|
從這以后,您的 ReiserFS 文件系統(tǒng)應(yīng)該不比它的對(duì)手 ext2 遜色了,而且您再也不必?fù)?dān)心長(zhǎng)時(shí)間的“fsck”,整體性能也會(huì)好得多 — 特別是對(duì)于小文件來說。
文件系統(tǒng)穩(wěn)定性
我已經(jīng)在一個(gè)產(chǎn)品環(huán)境下使用了一個(gè)多月 2.4.4 版本內(nèi)核的 ReiserFS(在 cvs.gentoo.org開發(fā)服務(wù)器上),根本沒有什么崩潰問題。2.4.4 和 2.4.4-ac9 已經(jīng)非常穩(wěn)定了。我們的服務(wù)器執(zhí)行大量的磁盤 IO任務(wù),因?yàn)樗俏覀兊?cvs 資料檔案庫、“dev-wiki”、gentoo.org 郵件服務(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又碰巧是個(gè)喜歡使用“dump”的人,您就必須尋找備份數(shù)據(jù)的其他方法。實(shí)際上,事實(shí)證明這個(gè)根本就不是問題,因?yàn)?2.4系列內(nèi)核從一開始就不兼容“dump”和“restore”命令。要了解關(guān)于 dump 和 2.4 內(nèi)核的不兼容性的更多信息,請(qǐng)閱讀 LinusTorvalds 的帖子(請(qǐng)參閱參考資料),他在帖子中說道“Dump 從一開始就是個(gè)愚蠢的程序。不要去碰它。”
性能問題
雖然 ReiserFS 通常搶盡了 ext2 的風(fēng)頭,但它在特定情況下確實(shí)有性能上的不足之處。第一個(gè)就是處理稀疏文件的能力。ReiserFS 處理稀疏文件的能力會(huì)比 ext2 差很多。當(dāng) Namesys 開發(fā)人員一直設(shè)法為 ReiserFS 4 優(yōu)化 ReiserFS 的這一部分時(shí),這一點(diǎn)會(huì)有所改觀。在這之前,ext2 是對(duì)處理稀疏文件有很高要求的應(yīng)用程序的較好的解決方案。
在對(duì)大量文件執(zhí)行多個(gè) stat() 調(diào)用的代碼中,可能也會(huì)碰到問題。一個(gè)可能觸發(fā)這種性能缺陷的應(yīng)用程序(它只存在于 2.4 系列內(nèi)核的 ReiserFS 實(shí)現(xiàn),在 2.2 內(nèi)核中不存在)就是“mutt”郵件用戶代理(請(qǐng)參閱參考資料),它在被用于讀取大型 maildir 形式的郵箱時(shí)會(huì)觸發(fā)性能缺陷。顯然,每個(gè)郵件文件 mutt 都要 stat兩次,這樣就會(huì)比平常更加影響性能。ReiserFS開發(fā)小組已經(jīng)意識(shí)到了這個(gè)特殊的問題,并已經(jīng)確定了它的起因,如果近期沒有解決方案的話,您應(yīng)該可以在 ReiserFS 4 中看到相應(yīng)的解決方案。
性能調(diào)整
幸運(yùn)的是,有幾種簡(jiǎn)單通用的性能調(diào)整方法可以用來緩解這些問題。第一種是用“noatime”選項(xiàng)(一種對(duì) ReiserFS和其它文件系統(tǒng)都有用的安裝選項(xiàng))來安裝您的 ReiserFS 文件系統(tǒng)。您可能知道,UNIX 系統(tǒng)為文件系統(tǒng)上的每一個(gè)對(duì)象記錄一個(gè)atime,或稱為訪問時(shí)間,每次讀取文件時(shí),atime 都會(huì)被更新。對(duì)于大部分人來說,atime郵戳功能不是十分有用,而且?guī)缀鯖]有任何應(yīng)用程序(我想不到一個(gè))依靠 atime處理什么重要的任務(wù)。出于這個(gè)原因,通??梢园踩仃P(guān)掉它,這樣可以帶來一個(gè)很好的全面性能提升。通常情況下,除非您確實(shí)知道自己需要 atime支持,您還是應(yīng)該用 noatime 選項(xiàng)來安裝文件系統(tǒng)。使用如下所示的 /etc/fstab 條目:
|
在關(guān)于 ReiserFS 的第一篇文章中,我曾提到 ReiserFS 有一項(xiàng)特別的功能,稱為“tail packing”。在 ReiserFS術(shù)語中,“tail”是小于一個(gè)系統(tǒng)文件塊(4k)的文件,或不能填滿一個(gè)完整的文件系統(tǒng)塊的文件末尾部分。ReiserFS具有確實(shí)卓越的小文件處理性能是因?yàn)樗軌驅(qū)⑦@些 tail 合并到它的 b*tree(它的主要數(shù)據(jù)組織結(jié)構(gòu))中去,這樣它們就能真正地接近stat-data(ReiserFS 中等同于索引節(jié)點(diǎn)的單元)。然而,因?yàn)檫@些 tail不能填滿一個(gè)完整的塊,它們會(huì)浪費(fèi)很多磁盤空間(當(dāng)然是相對(duì)地說)。為了解決這個(gè)問題,ReiserFS 使用了它的“tailpacking”功能來將這些 tail 壓縮到占用盡可能小的空間。通常,這么做可以讓 ReiserFS 文件系統(tǒng)比大小相等的 ext2文件系統(tǒng)多容納大約 5% 的數(shù)據(jù)。
更多關(guān)于 notail 的內(nèi)容
然而,tail packing 也有它的缺點(diǎn)。首先,它的確給性能帶來了一個(gè)小卻不可忽視的沖擊。幸運(yùn)的是,ReiserFS開發(fā)人員已經(jīng)預(yù)計(jì)到有些人寧愿犧牲大約5%的磁盤空間換取一點(diǎn)額外的性能,所以他們創(chuàng)建了“notail”安裝選項(xiàng)。當(dāng)文件系統(tǒng)用這個(gè)選項(xiàng)安裝時(shí),tail packing將被關(guān)閉,使您的存儲(chǔ)容量減小,卻有更快的速度。通常,重視文件系統(tǒng)性能的狂熱分子同時(shí)啟用“notail”和“noatime”選項(xiàng)來安裝他們的文件系統(tǒng),從而帶來顯著的性能提升:
|
即便您想節(jié)省一點(diǎn)磁盤空間,有時(shí)候暫時(shí)用一下“notail”選項(xiàng)安裝文件系統(tǒng)也是件好事。特別是,大多數(shù)引導(dǎo)裝載器(bootloader)裝載一個(gè)在啟用 tail packing 的 ReiserFS 文件系統(tǒng)上創(chuàng)建的內(nèi)核時(shí),都會(huì)出現(xiàn)問題。如果您正在使用一個(gè)比版本21.6 還低的 LILO,您就會(huì)碰到這種問題。在使用最新版本的 GRUB 時(shí)也會(huì)碰到問題,即不能裝載它的 stage1 和 stage1_5文件,盡管在裝載實(shí)際內(nèi)核的時(shí)候沒有什么問題。如果您已經(jīng)在經(jīng)歷這種問題了,您可以這樣修正此問題-使用“notail”選項(xiàng)安裝文件系統(tǒng),將文件移到另一個(gè)文件系統(tǒng)中,然后再把它們移回來。當(dāng)文件被重新創(chuàng)建時(shí),就不會(huì)有 tail 了。另外,記住您還可以很輕易地重新安裝文件系統(tǒng)(用新選項(xiàng)),而不需要卸載它。這個(gè)特別的示例使用“notail”選項(xiàng)重新安裝根目錄文件系統(tǒng)。通常情況下,如果您想使用 tail packing,但也需要引導(dǎo)裝載器(boot loader)從根目錄文件系統(tǒng)裝載輔助文件(如內(nèi)核),這條命令就很有用了:
|
Qmail 注解
如果您正在 ReiserFS 中使用 qmail,您應(yīng)該了解一些重要的參考資料。首先,您應(yīng)該使用 qmail 1.03 源碼的補(bǔ)丁。它修正了 qmail 非同步調(diào)用“link()”和“unlink()”時(shí)出現(xiàn)的問題,它不但是 ReiserFS 的問題,恰好也是 ext2 的問題。接下來您應(yīng)該看看 Jedi 的 qmail 調(diào)優(yōu)頁面,它包含了很多關(guān)于怎樣盡可能發(fā)揮 qmail 性能的很好的建議。最后,請(qǐng)務(wù)必查看 Jedi 的 ReiserSMTP 軟件包。ReiserSMTP 包含一個(gè) GPL 插件來代替 qmail 的 SMTP 部分;Jedi 的這種替換是特別為 ReiserFS 調(diào)整的,依賴新的隊(duì)列處理例程,它可以給您帶來雙倍的郵件收取性能。
結(jié)論
我發(fā)現(xiàn) ReiserFS 真是一個(gè)不可思議的文件系統(tǒng),它提供了很好的小文件處理性能和非常好的(通常比 ext2要好)的常規(guī)文件處理性能。因?yàn)橛辛?ReiserFS,我的開發(fā)人員可以在僅僅 15 秒內(nèi)完成 Gentoo Linux “cvs”更新,而使用 ext2 通常要花大約兩分鐘時(shí)間。ReiserFS 使我們開發(fā)人員的生活更加愉快,還使我們的 cvs 服務(wù)器處理大量的并發(fā) IO而不會(huì)引起硬盤狂轉(zhuǎn)和對(duì)交互性能的負(fù)面影響。
然而除了所有這些,關(guān)于 ReiserFS 最激動(dòng)人心的地方是它將來的發(fā)展方向。HansReiser 對(duì) ReiserFS有一個(gè)非常激進(jìn)而創(chuàng)新的計(jì)劃,包括計(jì)劃擴(kuò)展文件系統(tǒng)從而能夠?qū)⑵渥鳛橐粋€(gè)發(fā)展成熟的高性能數(shù)據(jù)庫來使用,最后還包括事務(wù)支持和高級(jí)查詢功能。這意味ReiserFS 將不僅僅“只是另一個(gè)高性能文件系統(tǒng)”;相反,它將開拓新的可能和道路,使我們能夠用創(chuàng)新方式去解決傳統(tǒng)的存儲(chǔ)問題。有了Namesys 的合作,Linux 將來的發(fā)展一定會(huì)非常激動(dòng)人心 -這絕對(duì)是一件好事情。
伴隨著 Linux 2.4 版本的發(fā)行,出現(xiàn)了大量的文件系統(tǒng)可能性,其中包括 ReiserFS、XFS、GFS和其它文件系統(tǒng)。這些文件系統(tǒng)聽起來的確都很酷,但是它們真正能做些什么呢,擅長(zhǎng)在哪些方面,以及在 Linux產(chǎn)品環(huán)境下如何才能安全地使用它們呢?Daniel Robbins 通過向您展示如何在 Linux 2.4的環(huán)境下建立這些新的高級(jí)文件系統(tǒng)來回答以上的問題。在這個(gè)部分,Daniel 簡(jiǎn)單地介紹了 tmpfs,一個(gè)基于 VM 的文件系統(tǒng),還向您介紹了2.4 版本的“綁定”安裝功能帶來的新的可能。
在本系列我以前的文章中,我介紹了創(chuàng)建日志和使用 ReiserFS 的好處,并展示了如何安裝一個(gè)穩(wěn)固的基于 Linux 2.4 的 ReiserFS 系統(tǒng)。在本文中,我們要談?wù)搸讉€(gè)相對(duì)次要的主題。首先,我們會(huì)簡(jiǎn)單地介紹一下 tmpfs,也就是我們知道的虛擬內(nèi)存(virtualmemory,VM)文件系統(tǒng)。Tmpfs 可能是現(xiàn)在 Linux 可以使用的最好的類似于 RAM 磁盤的系統(tǒng),而且是 2.4內(nèi)核的一個(gè)新功能。然后,我們將簡(jiǎn)單地介紹另一個(gè) 2.4內(nèi)核的新功能,叫做“綁定安裝”,它在安裝(和重新安裝)文件系統(tǒng)的時(shí)候帶來了很大的靈活性。在下一篇文章中,我們會(huì)把重點(diǎn)集中在 devfs上,之后,我們會(huì)花點(diǎn)時(shí)間來進(jìn)一步熟悉新的 ext3 文件系統(tǒng)。
介紹 tmpfs
如果我必須一下子說清楚 tmpfs,我會(huì)說 tmpfs 就象虛擬磁盤(ramdisk),但不一樣。象虛擬磁盤一樣,tmpfs 可以使用您的 RAM,但它也可以使用您的交換分區(qū)來存儲(chǔ)。而且傳統(tǒng)的虛擬磁盤是個(gè)塊設(shè)備,并需要一個(gè) mkfs
之類的命令才能真正地使用它,tmpfs 是一個(gè)文件系統(tǒng),而不是塊設(shè)備;您只是安裝它,它就可以使用了??偠灾?,這讓 tmpfs 成為我有機(jī)會(huì)遇到的最好的基于 RAM 的文件系統(tǒng)。
tmpfs 和 VM
讓我們來看看 tmpfs 更有趣的一些特性吧。正如我前面提到的一樣,tmpfs 既可以使用 RAM,也可以使用交換分區(qū)。剛開始這看起來可能有點(diǎn)武斷,但請(qǐng)記住 tmpfs 也是我們知道的“虛擬內(nèi)存文件系統(tǒng)”。而且,您可能也知道,Linux內(nèi)核的虛擬內(nèi)存資源同時(shí)來源于您的 RAM 和交換分區(qū)。內(nèi)核中的 VM子系統(tǒng)將這些資源分配到系統(tǒng)中的其它部分,并負(fù)責(zé)在后臺(tái)管理這些資源,通常是透明地將 RAM 頁移動(dòng)到交換分區(qū)或從交換分區(qū)到 RAM 頁。
tmpfs 文件系統(tǒng)需要 VM 子系統(tǒng)的頁面來存儲(chǔ)文件。tmpfs 自己并不知道這些頁面是在交換分區(qū)還是在 RAM 中;做這種決定是 VM 子系統(tǒng)的工作。tmpfs 文件系統(tǒng)所知道的就是它正在使用某種形式的虛擬內(nèi)存。
不是塊設(shè)備
這里是 tmpfs 文件系統(tǒng)另一個(gè)有趣的特性。不同于大多數(shù)“標(biāo)準(zhǔn)的”文件系統(tǒng),如 ext3、ext2、XFS、JFS、ReiserFS和其它一些系統(tǒng),tmpfs 并不是存在于一個(gè)底層塊設(shè)備上面。因?yàn)?tmpfs 是直接建立在 VM 之上的,您用一個(gè)簡(jiǎn)單的 mount命令就可以創(chuàng)建 tmpfs 文件系統(tǒng)了。
|
執(zhí)行這個(gè)命令之后,一個(gè)新的 tmpfs 文件系統(tǒng)就安裝在 /mnt/tmpfs,隨時(shí)可以使用。注意,不需運(yùn)行 mkfs.tmpfs
;事實(shí)上,那是不可能的,因?yàn)闆]有這樣的命令存在。在 mount
命令執(zhí)行之后,文件系統(tǒng)立即就被安裝并且可以使用了,類型是 tmpfs
。這和 Linux 虛擬磁盤如何使用大相徑庭;標(biāo)準(zhǔn)的 Linux 虛擬磁盤是塊設(shè)備,所以在使用它們之前必須用您選擇的文件系統(tǒng)將其格式化。相反,tmpfs 是一個(gè)文件系統(tǒng)。所以,您可以簡(jiǎn)單地安裝它就可以使用了。
動(dòng)態(tài)文件系統(tǒng)的大小
您可能想知道我們前面在 /mnt/tmpfs 安裝的 tmpfs文件系統(tǒng)有多大。這個(gè)問題的答案有點(diǎn)意外,特別是在和基于磁盤的文件系統(tǒng)比較的時(shí)候。/mnt/tmpfs最初會(huì)只有很小的空間,但隨著文件的復(fù)制和創(chuàng)建,tmpfs 文件系統(tǒng)驅(qū)動(dòng)程序會(huì)分配更多的 VM,并按照需求動(dòng)態(tài)地增加文件系統(tǒng)的空間。而且,當(dāng)/mnt/tmpfs 中的文件被刪除時(shí),tmpfs 文件系統(tǒng)驅(qū)動(dòng)程序會(huì)動(dòng)態(tài)地減小文件系統(tǒng)并釋放 VM 資源,這樣做可以將 VM返回到循環(huán)當(dāng)中以供系統(tǒng)中其它部分按需要使用。因?yàn)?VM 是寶貴的資源,所以您一定不希望任何東西浪費(fèi)超出它實(shí)際所需的 VM,tmpfs的好處之一就在于這些都是自動(dòng)處理的。 請(qǐng)參閱參考資料。
速度
tmpfs的另一個(gè)主要的好處是它閃電般的速度。因?yàn)榈湫偷?tmpfs 文件系統(tǒng)會(huì)完全駐留在 RAM中,讀寫幾乎可以是瞬間的。即使用了一些交換分區(qū),性能仍然是卓越的,當(dāng)更多空閑的 VM 資源可以使用時(shí),這部分 tmpfs 文件系統(tǒng)會(huì)被移動(dòng)到RAM 中去。讓 VM 子系統(tǒng)自動(dòng)地移動(dòng)部分 tmpfs 文件系統(tǒng)到交換分區(qū)實(shí)際上對(duì)性能上是好的,因?yàn)檫@樣做可以讓 VM 子系統(tǒng)為需要 RAM 的進(jìn)程釋放空間。這一點(diǎn)連同它動(dòng)態(tài)調(diào)整大小的能力,比選擇使用傳統(tǒng)的 RAM 磁盤可以讓操作系統(tǒng)有好得多的整體性能和靈活性。
沒有持久性
這看起來可能不象是個(gè)積極因素,tmpfs 數(shù)據(jù)在重新啟動(dòng)之后不會(huì)保留,因?yàn)樘摂M內(nèi)存本質(zhì)上就是易失的。我想您可能猜到了 tmpfs被稱為“tmpfs”的一個(gè)原因,不是嗎?然而,這實(shí)際上可以是一件好事。它讓 tmpfs 成為一個(gè)保存您不需保留的數(shù)據(jù)(如臨時(shí)文件,可以在/tmp 中找到,還有 /var 文件系統(tǒng)樹的某些部分)的卓越的文件系統(tǒng)。
使用 tmpfs
為了使用 tmpfs,您所需要的就是啟用了“Virtual memory file system support(以前是 shm fs)”選項(xiàng)的2.4 系列內(nèi)核;這個(gè)選項(xiàng)在內(nèi)核配置選項(xiàng)的“File systems”部分。一旦您有了一個(gè)啟用了 tmpfs 的內(nèi)核,您就可以開始安裝tmpfs 文件系統(tǒng)了。其實(shí),在您所有的 2.4 內(nèi)核中都打開 tmpfs 選項(xiàng)是個(gè)好主意,不管您是否計(jì)劃使用 tmpfs。這是因?yàn)槟枰獌?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)在使用得不太多,但這種情況可能會(huì)隨著時(shí)間而改變。
避免低 VM 情況
tmpfs 根據(jù)需要?jiǎng)討B(tài)增大或減小的事實(shí)讓人疑惑:如果您的 tmpfs 文件系統(tǒng)增大到它耗盡了所有虛擬內(nèi)存的程度,而您沒有剩余的 RAM 或交換分區(qū),這時(shí)會(huì)發(fā)生什么?一般來說,這種情況是有點(diǎn)討厭。如果是 2.4.4內(nèi)核,內(nèi)核會(huì)立即鎖定。如果是 2.4.6 內(nèi)核,VM 子系統(tǒng)已經(jīng)以很多種方式得到了修正,雖然耗盡 VM并不是一個(gè)美好的經(jīng)歷,事情也不會(huì)完全地失敗。如果 2.4.6 內(nèi)核到了無法分配更多 VM 的程度,您顯然不愿意不能向 tmpfs文件系統(tǒng)寫任何新數(shù)據(jù)。另外,可能會(huì)發(fā)生其他一些事情。首先,系統(tǒng)的其他一些進(jìn)程會(huì)無法分配更多的內(nèi)存;通常,這意味著系統(tǒng)多半會(huì)變得極度緩慢而且?guī)缀鯖]有響應(yīng)。這樣,超級(jí)用戶要采取必要的步驟來緩解這種低 VM 的情況就會(huì)很困難,或異常地耗時(shí)。
另外,內(nèi)核有一個(gè)內(nèi)建的最終防線系統(tǒng),用來在沒有可用內(nèi)存的時(shí)候釋放內(nèi)存,它會(huì)找到占用 VM資源的進(jìn)程并終止該進(jìn)程。不幸的是,這種“終止進(jìn)程”的解決方案在 tmpfs 的使用增加引起 VM耗盡的情況下通常會(huì)導(dǎo)致不良后果。以下是原因。tmpfs本身不能(也不應(yīng)該)被終止,因?yàn)樗莾?nèi)核的一部分而非一個(gè)用戶進(jìn)程,而且也沒有容易的方法可以讓內(nèi)核找出是那個(gè)進(jìn)程占滿了 tmpfs文件系統(tǒng)。所以,內(nèi)核會(huì)錯(cuò)誤地攻擊它能找到的最大的占用 VM 的進(jìn)程,通常會(huì)是 X 服務(wù)器(X server),如果您碰巧在使用它。所以,您的X 服務(wù)器會(huì)被終止,而引起低 VM 情況的根本原因(tmpfs)卻沒有被解決。Ick.
低 VM:解決方案
幸運(yùn)的是,tmpfs 允許您在安裝或重新安裝文件系統(tǒng)的時(shí)候指定文件系統(tǒng)容量的最大值上限。實(shí)際上,從 2.4.6 內(nèi)核到 2.11g 內(nèi)核,這些參數(shù)只能在安裝時(shí)設(shè)置,而不是重新安裝時(shí),但我們可以期望在不久的將來可以在重新安裝時(shí)設(shè)置這些參數(shù)。tmpfs 容量最大值的最佳設(shè)置依賴于資源和您特定的Linux 主機(jī)的使用模式;這個(gè)想法是要防止一個(gè)完全使用資源的 tmpfs 文件系統(tǒng)耗盡所有虛擬內(nèi)存結(jié)果導(dǎo)致我們前面談到的糟糕的低 VM情況。尋找好的 tmpfs 上限值的一個(gè)好方法是使用 top
來監(jiān)控您系統(tǒng)的交換分區(qū)在高峰使用階段的使用情況。然后,確保指定的 tmpfs 上限稍小于所有這些高峰使用時(shí)間內(nèi)空閑交換分區(qū)和空閑 RAM 的總和。
創(chuàng)建有最大容量的 tmpfs 文件系統(tǒng)很容易。要?jiǎng)?chuàng)建一個(gè)新的最大 32 MB 的 tmpfs 文件系統(tǒng),請(qǐ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,您會(huì)發(fā)現(xiàn)這個(gè)目錄已經(jīng)為您創(chuàng)建好了。
還有,如果我們想將文件系統(tǒng)的容量限制在 512 KB 或 1 GB 以內(nèi),我們可以分別指定 size=512k
和 size=1g
。除了限制容量,我們還可以通過指定 nr_inodes=x
參數(shù)限制索引節(jié)點(diǎn)(文件系統(tǒng)對(duì)象)。在使用 nr_inodes
時(shí),x
可以是一個(gè)簡(jiǎn)單的整數(shù),后面還可以跟一個(gè) k
、m
或 g
指定千、百萬或十億(!)個(gè)索引節(jié)點(diǎn)。
而且,如果您想把上面的 mount tmpfs
命令的等價(jià)功能添加到 /etc/fstab,應(yīng)該是這樣:
|
在現(xiàn)存的安裝點(diǎn)上安裝
在以前使用 2.2 的時(shí)候,試圖在已經(jīng)安裝了東西的安裝點(diǎn)再次安裝任何東西都會(huì)引發(fā)錯(cuò)誤。然而,重寫后的內(nèi)核安裝代碼使多次使用安裝點(diǎn)不再成為問題。這里是一個(gè)示例的情況:假設(shè)我們有一個(gè)現(xiàn)存的文件系統(tǒng)安裝在 /tmp。然而,我們決定要開始使用 tmpfs 進(jìn)行 /tmp 的存儲(chǔ)。過去,您唯一的選擇就是卸載 /tmp并在其位置重新安裝您新的 tmpfs/tmp 文件系統(tǒng),如下所示:
|
可是,這種解決方案也許對(duì)您不管用??赡苡泻芏嗾谶\(yùn)行的進(jìn)程在 /tmp 中有打開的文件;如果是這樣,在試圖卸載 /tmp 時(shí),您就會(huì)遇到如下的錯(cuò)誤:
|
然而,使用最近的 2.4 內(nèi)核,您可以安裝您新的 /tmp 文件系統(tǒng),而不會(huì)遇到“device is busy”錯(cuò)誤:
|
用一條命令,您新的 tmpfs /tmp 文件系統(tǒng)就被安裝在 /tmp,并安裝在已經(jīng)安裝的不能再被直接訪問的分區(qū)之上。然而,雖然您不能訪問原來的 /tmp,任何在原文件系統(tǒng)上還有打開文件的進(jìn)程都可以繼續(xù)訪問它們。而且,如果您 unmount
基于 tmpfs 的 /tmp,原來安裝的 /tmp 文件系統(tǒng)會(huì)重新出現(xiàn)。實(shí)際上,您在相同的安裝點(diǎn)上可以安裝任意數(shù)目的文件系統(tǒng),安裝點(diǎn)就象一個(gè)堆棧;卸載當(dāng)前的文件系統(tǒng),上一個(gè)最近安裝的文件系統(tǒng)就會(huì)重新出現(xiàn)。
|
現(xiàn)在,如果您觀察 /home/drobbins/nifty的內(nèi)部,您就會(huì)看到您的根文件系統(tǒng)(/home/drobbins/nifty/etc、/home/drobbins/nifty/opt等)。而且,如果您在根文件系統(tǒng)修改文件,您在 /home/drobbins/nifty中也可以看到所作的改動(dòng)。這是因?yàn)樗鼈兪峭粋€(gè)文件系統(tǒng);內(nèi)核只是簡(jiǎn)單地為我們將該文件系統(tǒng)映射到兩個(gè)不同的安裝點(diǎn)。注意,當(dāng)您在另一處安裝文件系統(tǒng)時(shí),任何安裝在綁定安裝文件系統(tǒng)內(nèi)部的安裝點(diǎn)的文件系統(tǒng)都不會(huì)隨之移動(dòng)。換句話說,如果您在單獨(dú)的文件系統(tǒng)上有/usr,我們前面執(zhí)行的綁定安裝就會(huì)讓 /home/drobbins/nifty/usr 為空。您會(huì)需要附加的綁定安裝命令來使您能夠?yàn)g覽位于/home/drobbins/nifty/usr 的 /usr 的內(nèi)容:
|
綁定安裝部分文件系統(tǒng)
綁定安裝讓更妙的事情成為可能。假設(shè)您有一個(gè) tmpfs 文件系統(tǒng)安裝在它的傳統(tǒng)位置 /dev/shm,您決定要開始在當(dāng)前位于根文件系統(tǒng)的/tmp 使用 tmpfs。雖然可以在 /tmp(這是可能的)安裝一個(gè)新的 tmpfs 文件系統(tǒng),您也可以決定讓新的 /tmp 共享當(dāng)前安裝的 /dev/shm 文件系統(tǒng)。然而,雖然您可以在 /tmp 綁定安裝 /dev/shm 就完成了,但您的 /dev/shm 還包含一些您不想在 /tmp 出現(xiàn)的目錄。所以,您怎么做呢?這樣如何:
|
在這個(gè)示例中,我們首先創(chuàng)建了一個(gè) /dev/shm/tmp 目錄,然后給它 1777
權(quán)限,對(duì) /tmp 適當(dāng)?shù)脑S可。既然我們的目錄已經(jīng)準(zhǔn)備好了,我們可以安裝,也只能安裝 /dev/shm/tmp 到 /tmp。所以,雖然/tmp/foo 會(huì)映射到 /dev/shm/tmp/foo,但您沒有辦法從 /tmp 訪問 /dev/shm/bar 文件。
正如您所見,綁定安裝非常強(qiáng)大,讓您可以輕易地修改文件系統(tǒng)設(shè)計(jì),絲毫不必忙亂。下一篇文章,我們會(huì)談到 devfs,至于現(xiàn)在,您也許會(huì)想看看下面的參考資料。
伴隨著 Linux 2.4 版本的發(fā)行,出現(xiàn)了大量的文件系統(tǒng)可能性,其中包括 ReiserFS、XFS、GFS和其它文件系統(tǒng)。這些文件系統(tǒng)聽起來的確都很酷,但是它們真正能做些什么呢,擅長(zhǎng)在哪些方面,以及在 Linux產(chǎn)品環(huán)境下如何才能安全地使用它們呢?Daniel Robbins 通過向您展示如何在 Linux 2.4的環(huán)境下建立這些新的高級(jí)文件系統(tǒng)來回答以上的問題。遵從這個(gè)方法,他提供了在實(shí)際實(shí)現(xiàn)過程中的有價(jià)值的建議、性能信息和重要的技術(shù)性注意要點(diǎn),以便于您在新的文件系統(tǒng)中能有盡可能令人愉快的經(jīng)歷。在本文中:Daniel 解釋了使用設(shè)備管理文件系統(tǒng) devfs的意義和好處,讓您對(duì)其有所認(rèn)識(shí)以便在下一篇文章中向您展示如何最佳地在系統(tǒng)上安裝 devfs。
設(shè)備,到處都是設(shè)備
Devfs,也叫設(shè)備文件系統(tǒng)(Device Filesystem),設(shè)計(jì)它的唯一目的就是提供一個(gè)新的(更理性的)方式管理通常位于 /dev的所有塊設(shè)備和字符設(shè)備。您也許知道,典型的 /dev樹包含數(shù)百個(gè)塊特殊文件和字符特殊文件,它們?nèi)荚诟募到y(tǒng)上。每個(gè)特殊文件都可以讓用戶空間進(jìn)程輕松地與內(nèi)核設(shè)備實(shí)現(xiàn)交互。舉例來說,通過對(duì)這些特殊文件執(zhí)行操作,您的 X 服務(wù)器就能夠訪問視頻硬件,fsck 可以執(zhí)行文件系統(tǒng)檢驗(yàn),lpd 可以通過并行端口向打印機(jī)發(fā)送數(shù)據(jù)。
實(shí)際上,通常 Linux 和 Unix 更“酷”的方面是,設(shè)備不是簡(jiǎn)單地隱藏在晦澀的 API之后,而是真正地與普通文件、目錄和符號(hào)鏈接一樣存在于文件系統(tǒng)上。因?yàn)樽址蛪K設(shè)備是映射到普通文件系統(tǒng)名稱空間的,我們通常可以用有意義的方式來與硬件交互,可以僅使用標(biāo)準(zhǔn) Unix 命令,如 cat 和 dd。除了有趣之外,這還使我們有更強(qiáng)的能力,并提高生產(chǎn)力。
設(shè)備管理問題
然而,雖然設(shè)備特殊文件本身是一件好事情,但典型的 Linux 系統(tǒng)以一種不太理想而且麻煩的方式管理這些特殊文件。 如今,Linux 支持很多不同種類的硬件。這意味著嚴(yán)格意義上我們中絕大多數(shù)在 /dev中都有數(shù)百個(gè)特殊文件來表示所有這些設(shè)備。還不止這樣,這些特殊文件中大多數(shù)甚至不會(huì)映射到系統(tǒng)中存在的設(shè)備上(但需要它們存在,只是考慮到我們最終會(huì)在系統(tǒng)中添加新的硬件/驅(qū)動(dòng)器),這讓事情變得更令人困惑。
僅從這個(gè)方面來看,我們就知道 /dev 需要徹底檢修,而創(chuàng)建 devfs 的明確目的就是讓 /dev 變回原形。為了很好地理解 devfs 是怎樣解決絕大多數(shù) /dev 管理問題的,我們從設(shè)備驅(qū)動(dòng)程序的角度來看看 devfs。
設(shè)備管理內(nèi)幕
為了很好地理解 devfs ,最好是先理解從設(shè)備驅(qū)動(dòng)程序的角度來看 devfs 是怎樣改變事物的。傳統(tǒng)地(不使用 devfs),根據(jù)是否注冊(cè)在塊設(shè)備或字符設(shè)備,基于內(nèi)核的設(shè)備驅(qū)動(dòng)程序通過調(diào)用 register_blkdev() 或 register_chrdev() 向系統(tǒng)的其余部分注冊(cè)設(shè)備。
您必須提供一個(gè)主設(shè)備號(hào)(一個(gè)無符號(hào) 8 位整數(shù))作為 register_blkdev() 或 register_chrdev() 的參數(shù);然后,在設(shè)備注冊(cè)之后,內(nèi)核就會(huì)知道這個(gè)特定的主設(shè)備號(hào)對(duì)應(yīng)于執(zhí)行 register_???dev() 調(diào)用的特定設(shè)備驅(qū)動(dòng)程序。
那么,設(shè)備驅(qū)動(dòng)程序開發(fā)人員為調(diào)用 register_???dev() 提供的主設(shè)備號(hào)應(yīng)該是什么呢?如果開發(fā)人員不打算將設(shè)備驅(qū)動(dòng)程序與外界共享,那么什么號(hào)碼都可以,只要它與當(dāng)前內(nèi)核使用的其它主設(shè)備號(hào)都不沖突即可。開發(fā)人員還可以選擇動(dòng)態(tài)地分配 register_???dev() 調(diào)用的設(shè)備的主設(shè)備號(hào)。然而,這樣的解決方案通常只是在驅(qū)動(dòng)程序不會(huì)被其它人使用的情況下可行。
獲取號(hào)碼
然而,如果開發(fā)人員想讓驅(qū)動(dòng)程序與外界共享(大多數(shù) Linux開發(fā)人員常常采用這一方法),那么僅僅從“真空”中抽一個(gè)主設(shè)備號(hào)或者使用動(dòng)態(tài)的主設(shè)備號(hào)分配就不行了。相反,開發(fā)人員必須聯(lián)系 Linux內(nèi)核開發(fā)人員,這樣他(她)的特定的設(shè)備才能分配一個(gè)“正式”主設(shè)備號(hào)。那么,在整個(gè) Linux 世界中,這個(gè)特定的設(shè)備(也只有這個(gè)設(shè)備)才會(huì)被關(guān)聯(lián)到那個(gè)特定的主設(shè)備號(hào)。
有一個(gè)“正式的”主設(shè)備號(hào)很重要,因?yàn)橐c特定的設(shè)備交互,管理員必須在 /dev創(chuàng)建一個(gè)特殊文件。當(dāng)設(shè)備節(jié)點(diǎn)(特殊文件)創(chuàng)建后,它使用的主設(shè)備號(hào)必須同內(nèi)核內(nèi)部使用的完全相同。這樣,進(jìn)程對(duì)設(shè)備執(zhí)行操作時(shí),內(nèi)核就會(huì)知道應(yīng)該引用什么設(shè)備驅(qū)動(dòng)程序。讓特殊文件到內(nèi)核驅(qū)動(dòng)程序的映射成為可能的是主設(shè)備號(hào),而不是真實(shí)的設(shè)備名稱(它和非 devfs 系統(tǒng)無關(guān))。
一旦設(shè)備驅(qū)動(dòng)程序具備正式主設(shè)備號(hào),設(shè)備就可以被公開使用了,設(shè)備節(jié)點(diǎn)也就可以開始并入不同分發(fā)版的 /dev 樹,還有它們的正式 /dev/MAKEDEV 腳本(用來幫助超級(jí)用戶用正確的主從設(shè)備號(hào)、權(quán)限和所有權(quán)創(chuàng)建設(shè)備節(jié)點(diǎn)的特殊腳本)中。
傳統(tǒng)的問題
不幸的是,這種方法有很多可伸縮性問題。不僅設(shè)備驅(qū)動(dòng)程序開發(fā)人員聯(lián)系內(nèi)核開發(fā)人員來獲取正式主設(shè)備號(hào)是一件討厭的事,內(nèi)核開發(fā)人員弄清他們?cè)鯓臃峙渌羞@些主設(shè)備號(hào)甚至更加惱人。這種任務(wù)在很多方面很象系統(tǒng)管理員跟蹤公司局域網(wǎng)靜態(tài) IP 地址分配的工作 — 這并不十分有趣。正如系統(tǒng)管理員可以利用DHCP 來緩解這種管理負(fù)擔(dān),如果設(shè)備注冊(cè)有某種類似的方法就好了。
不只是這樣,Linux 還正在耗盡主設(shè)備號(hào)和副號(hào)碼。雖然這種問題可以通過簡(jiǎn)單地?cái)U(kuò)展主設(shè)備號(hào)和副號(hào)碼使用的位數(shù),首先維護(hù)這些主設(shè)備號(hào)映射就很討厭了,所以我們又在考慮有沒有更好的方法來處理這些事情。幸運(yùn)的是,有這樣的方法;進(jìn)入 devfs。
devfs_register()
這里是對(duì) devfs 如何一下子處理事情和解決這些問題的一個(gè)簡(jiǎn)單明了的快速綱要。一旦 devfs 被正確配置(包括在內(nèi)核添加 devfs支持和對(duì)啟動(dòng)腳本進(jìn)行一些稍復(fù)雜的更改),超級(jí)用戶重新啟動(dòng)系統(tǒng)。然后內(nèi)核開始啟動(dòng),設(shè)備驅(qū)動(dòng)程序開始向系統(tǒng)的剩余部分注冊(cè)設(shè)備。您會(huì)記起在非devfs 系統(tǒng)上,register_blkdev() 和 register_chrdev() 調(diào)用(連同提供的主設(shè)備號(hào))正是用于這一目的。然而,現(xiàn)在啟用了 devfs,設(shè)備驅(qū)動(dòng)程序是用一種新的、改進(jìn)了的內(nèi)核調(diào)用來注冊(cè)設(shè)備,稱為 devfs_register()。
這里是 devfs_register() 調(diào)用有趣的地方。雖然為了兼容性目的指定主設(shè)備號(hào)和副號(hào)碼作為參數(shù)是可能的,但不再需要這樣了。相反, devfs_register() 調(diào)用接受設(shè)備路徑(就是它在 /dev 下可能的出現(xiàn)形式)作為參數(shù)。舉例來說,假設(shè) foo 設(shè)備驅(qū)動(dòng)程序希望使用 devfs 注冊(cè)設(shè)備。它會(huì)提供一個(gè) foo0 的參數(shù)給 devfs_register(),從而告訴內(nèi)核應(yīng)該在 devfs 名稱空間的根目錄創(chuàng)建一個(gè)新的 foo0 設(shè)備。相應(yīng)的,devfs_register() 在 devfs 名稱空間的根目錄添加 foo0 設(shè)備節(jié)點(diǎn),并記錄這個(gè)新的 foo0 節(jié)點(diǎn)應(yīng)該映射到內(nèi)核中的 foo 設(shè)備驅(qū)動(dòng)程序。
運(yùn)行的 Devfs
一旦所有設(shè)備驅(qū)動(dòng)程序啟動(dòng)并向內(nèi)核注冊(cè)適當(dāng)?shù)脑O(shè)備,內(nèi)核就啟動(dòng) /sbin/init 和系統(tǒng)初始化腳本開始執(zhí)行。在啟動(dòng)過程初期(在文件系統(tǒng)檢查前),rc 腳本將 devfs 文件系統(tǒng)安裝在 /dev 中,/dev 包含了 devfs 名稱空間的表達(dá)。這意味著在安裝 /dev 后,所有注冊(cè)的設(shè)備(如上面的 /dev/foo0)都可以訪問,就象在非 devfs 上一樣。當(dāng)它們被訪問時(shí),內(nèi)核通過 devfs 設(shè)備名稱映射到合適的設(shè)備驅(qū)動(dòng)程序,而不是通過主設(shè)備號(hào)。
這種系統(tǒng)的優(yōu)點(diǎn)是,所有需要的設(shè)備節(jié)點(diǎn)(沒有別的了)都由內(nèi)核自動(dòng)創(chuàng)建。這不僅僅意味著不再需要 MAKEDEV(因?yàn)樗凶?cè)的設(shè)備都只“出現(xiàn)”在 /dev 中),還意味著 /dev 不再被成百個(gè)“無用的”設(shè)備節(jié)點(diǎn)所充斥。實(shí)際上,使用devfs,您可以只要查看 /dev就知道系統(tǒng)上有什么設(shè)備。所以,如果您有一臺(tái)支持熱插拔的膝上型電腦,這意味著您甚至可以在您從系統(tǒng)中插入和拔出 PC 卡時(shí)魔術(shù)般地讓設(shè)備從/dev 中出現(xiàn)和消失。這讓 devfs 成為對(duì)以前笨拙局面的一個(gè)非常徹底和實(shí)用的解決方案。
devfs 的優(yōu)點(diǎn)
Devfs讓很多事變得容易許多。請(qǐng)考慮一下創(chuàng)建一張 Linux 可引導(dǎo)光盤的問題,它包括一個(gè)位于 CD 上的引導(dǎo)裝載器、一個(gè)initrd、一個(gè)內(nèi)核和一個(gè)回送文件系統(tǒng)。當(dāng) CD 引導(dǎo)時(shí),引導(dǎo)裝載器裝載內(nèi)核和 initrd,然后內(nèi)核執(zhí)行 initrd 上的 /linuxrc 腳本。/linuxrc 的主要任務(wù)是安裝 CD,從而使回送文件系統(tǒng)本身也可以被安裝和訪問。
沒有 devfs,linuxrc 就需要“查看” /dev 中的很多特殊文件,它們可能有也可能沒有表示連接到系統(tǒng)的真實(shí)硬件。例如, linuxrc 會(huì)需要檢測(cè) /dev/hdc、/dev/scd0、/dev/hdb 和其它的設(shè)備以檢測(cè)“活動(dòng)的”光盤驅(qū)動(dòng)器設(shè)備。在檢測(cè)進(jìn)程中,很可能命中幾個(gè)“無用的”設(shè)備節(jié)點(diǎn)。
然而,使用 devfs,linuxrc 只在 /dev/cdroms 中尋找,它包含了系統(tǒng)中所有和活動(dòng)的光盤驅(qū)動(dòng)器相關(guān)聯(lián)的特殊文件,不管是 IDE 的還是 SCSI 的。由于這種便捷的新式 devfs約定,再不需要猜測(cè)了;只有活動(dòng)的設(shè)備才會(huì)列出,而且設(shè)備檢測(cè)代碼甚至不必?fù)?dān)心底層的光盤驅(qū)動(dòng)器的細(xì)節(jié),比如說它使用什么 IDE 通道或者什么SCSI ID。實(shí)際上,這是 devfs 的另一個(gè)主要好處;在我下一篇文章中,我們會(huì)看到 devfs 下 /dev 中的設(shè)備有全新的缺省位置。
實(shí)際上,如果您想訪問一個(gè)特定的塊設(shè)備(如磁盤、分區(qū)、光盤驅(qū)動(dòng)器等等),事實(shí)上有 幾個(gè)不同的特殊文件可以引用。例如,我的服務(wù)器只有一個(gè) SCSI 光盤驅(qū)動(dòng)器;如果啟用了 devfs,我就可以通過安裝 /dev/cdroms/cdrom0 或 /dev/scsi/host0/bus0/target4/lun0/cd 訪問它。兩種都引用同一個(gè)設(shè)備,我可以引用我認(rèn)為最方便的特殊文件。如果愿意,我還可以使用一種老式的設(shè)備名稱(/dev/sr0)訪問光盤驅(qū)動(dòng)器,這都是因?yàn)橛幸粋€(gè)非常便捷的叫 devfsd 的小程序。 devfsd 是一個(gè)有功能很多的程序,它負(fù)責(zé)創(chuàng)建老式的“兼容性”特殊文件,還允許您以很多種方式自定義 /dev。在我的下一篇文章中,我們會(huì)詳細(xì)討論 devfsd,到時(shí)我會(huì)一直引導(dǎo)您啟動(dòng) devfs 并在您自己的系統(tǒng)上運(yùn)行它。在那之前,請(qǐng)參考下面的參考資料以了解更多關(guān)于 devfs 的信息。
mount
和 unmount
。您也許希望升級(jí)到最新的可用版本,這樣您就可以使用 mount --bind
語法(而不是使用 mount -o bind
)。 關(guān)于作者![]() |
聯(lián)系客服