高級(jí)文件系統(tǒng)實(shí)現(xiàn)者指南 (linux gentoo)
你能在 http://www-900.ibm.com/developerWorks/cn/ 找到更多的資料
日志和 ReiserFS Daniel Robbins (drobbins@) 伴 隨著 Linux 2.4 版本的發(fā)行,出現(xiàn)了大量的文件系統(tǒng)可能性,其中包括 ReiserFS、XFS、GFS 和其它文件系統(tǒng)。這些文件系統(tǒng)聽(tīng)起來(lái)的確都很酷,但是它們真正能做些什么呢,擅長(zhǎng)在哪些方面,以及在 Linux 產(chǎn)品環(huán)境下如何才能安全地使用它們呢?在高級(jí)文件系統(tǒng)實(shí)現(xiàn)者指南中,Daniel Robbins 通過(guò)向您展示如何在 Linux 2.4 的環(huán)境下建立這些新的高級(jí)文件系統(tǒng)來(lái)回答以上的問(wèn)題。遵從這個(gè)方法,他提供了在實(shí)際實(shí)現(xiàn)過(guò)程中的有價(jià)值的建議,性能信息和重要的技術(shù)性注意要點(diǎn),以便于您 在新的文件系統(tǒng)中能有令人愉快的經(jīng)歷。在這里,也就是這個(gè)系列的第一篇文章中,他解說(shuō)了日志和 ReiserFS 的優(yōu)點(diǎn)。 準(zhǔn)備好的內(nèi)容 這就是準(zhǔn)備好的內(nèi)容。但是要開(kāi)始這一系列工作,我還有一篇文章要脫離這個(gè)主題,用來(lái)為接 下來(lái)的行程做準(zhǔn)備。我將會(huì)涉及兩個(gè)對(duì)于 Linux 開(kāi)發(fā)社區(qū)非常重要的主題 — 日志和 ReiserFS 后的設(shè)計(jì)理念。日志是非常重要的,因?yàn)樗俏覀冮L(zhǎng)期以來(lái)一直期待的技術(shù),而現(xiàn)在終于出現(xiàn)了。在 ReiserFS、XFS、JFS、ext3 和 GFS 中都用到它。確切地理解日志是做什么的和為什么 Linux 需要它是非常重要的。即使您對(duì)日志已有所掌握,我還是希望我有關(guān)日志的介紹可以成為一個(gè)好的模型,以用來(lái)向其他人解釋這項(xiàng)技術(shù),或者作為一項(xiàng)慣例,以利于 全世界的部門(mén)和組織開(kāi)始向這些新的日志文件系統(tǒng)進(jìn)行轉(zhuǎn)變。這個(gè)過(guò)程通常是由“Linux guy/gal”開(kāi)始的,就像您自己也會(huì)說(shuō)服其他人應(yīng)該這么做。 在 這篇文章的后半部分,我們將看看 ReiserFS 后的設(shè)計(jì)理念。通過(guò)這么做,我們能夠很好地掌握一個(gè)事實(shí),那就是這些新的文件系統(tǒng)并不只是為了做同樣的事比老的系統(tǒng)快一點(diǎn)。它們還允許我們用以前完全不可 能的方法來(lái)處理事情。開(kāi)發(fā)人員在閱讀這一系列文章時(shí)應(yīng)該牢記這一點(diǎn)。這些新的文件系統(tǒng)的能力 將很可能對(duì)您今后的 Linux 軟件開(kāi)發(fā)工程的代碼編寫(xiě)產(chǎn)生影響。 理解日志:元數(shù)據(jù) 通 常,我們并不直接和文件系統(tǒng)的元數(shù)據(jù)打交道。而是一個(gè)特別的 Linux 文件系統(tǒng)驅(qū)動(dòng)程序?yàn)槲覀冏飨鄳?yīng)的工作。Linux 文件系統(tǒng)驅(qū)動(dòng)程序是專門(mén)用來(lái)操作復(fù)雜的元數(shù)據(jù)的。然而,為了使得文件系統(tǒng)驅(qū)動(dòng)程序正常工作,有一個(gè)很重要的必要條件;它需要在某種合理的、一致的和沒(méi)有干 擾的狀態(tài)下找到元數(shù)據(jù)。否則,文件系統(tǒng)驅(qū)動(dòng)程序就不能理解和操作元數(shù)據(jù),那么您也就不能存取文件了。 理解日志:fsck 然而,我們都知道不時(shí)地會(huì)有一些意外發(fā) 生,例如意想不到的電源故障或者系統(tǒng)掛起。當(dāng)出現(xiàn)這些不幸的情況時(shí),Linux 沒(méi)有機(jī)會(huì)徹底卸載文件系統(tǒng)。當(dāng)系統(tǒng)重新啟動(dòng),fsck 開(kāi)始掃描時(shí),它會(huì)檢測(cè)到這些沒(méi)有徹底卸載的文件系統(tǒng),并做出合理的假設(shè) — 文件系統(tǒng)可能沒(méi)有為 Linux 文件系統(tǒng)驅(qū)動(dòng)程序準(zhǔn)備好。這就很有可能導(dǎo)致元數(shù)據(jù)在某種情況下陷入困境。 所以,為了彌補(bǔ)這種情況,fsck 將開(kāi)始徹底的掃描并且全面地檢查元數(shù)據(jù),修正這一過(guò)程中找到的任何錯(cuò)誤。一旦 fsck 完成這樣的工作,文件系統(tǒng)就可以使用了。盡管意想不到的電源故障或者系統(tǒng)掛起可能造成最近修改的數(shù)據(jù)丟失,但是由于元數(shù)據(jù)現(xiàn)在是一致的,文件系統(tǒng)就可以被 裝載和投入使用了。 fsck 的問(wèn)題 日志 可以這樣來(lái)看待日志文件系統(tǒng) — 除了存儲(chǔ)數(shù)據(jù)(您的素材)和元數(shù)據(jù)(關(guān)于素材的數(shù)據(jù))以外,它們還有一個(gè)日志。您可以稱它們?yōu)樵獢?shù)據(jù)(關(guān)于素材數(shù)據(jù)的數(shù)據(jù))。 運(yùn)作中的日志 ReiserFS 小文件的性能 這兒有一個(gè) ext2 如何鼓勵(lì)這種編程的例子。ext2 很擅長(zhǎng)存儲(chǔ)大量大小在 20k 以上的文件,但是對(duì)于存儲(chǔ) 2,000 個(gè) 50 字節(jié)的文件來(lái)說(shuō),它就不是一種很理想的技術(shù)了。當(dāng) ext2 必須處理非常小的文件時(shí),不只是性能顯著地下降,而且存儲(chǔ)效率也同樣下降,因?yàn)?ext2 是按 1k 或者 4k 的塊來(lái)分配空間的(可在文件系統(tǒng)創(chuàng)建時(shí)設(shè)定)。 現(xiàn)在,常規(guī)的明智做法會(huì)提示您不應(yīng)該在文件系統(tǒng)上儲(chǔ) 存這么多小的文件。而是應(yīng)該存儲(chǔ)在某種運(yùn)行在文件系統(tǒng)之上的數(shù)據(jù)庫(kù)里。作為對(duì)這種說(shuō)法的回應(yīng),Hans Reiser 指出無(wú)論何時(shí)您需要在文件系統(tǒng)的頂上建立一層,那就意味著文件系統(tǒng)不滿足您的需要。如果文件系統(tǒng)滿足您的需要,那么您首先就要避免使用特殊目的的解決方 案。這樣就可以節(jié)省開(kāi)發(fā)的時(shí)間,并消除代碼膨脹。這些代碼可能是在您手動(dòng)處理自己的個(gè)人存儲(chǔ)器或者緩沖機(jī)制時(shí),或者與數(shù)據(jù)庫(kù)的某個(gè)庫(kù)交互作用過(guò)程時(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 有許多特征是特別針對(duì)提高小文件的性能的。和 ext2 不同,ReiserFS 并不固定地以 1k 或者 4k 的塊分配存儲(chǔ)空間,而是分配所需要的精確尺寸。而且 ReiserFS 也包括了以尾文件為中心的特殊優(yōu)化 — 尾文件是指那些比文件系統(tǒng)塊小的文件及文件結(jié)尾部分。為了提高性能,ReiserFS 能夠在 b* 樹(shù)的葉子節(jié)點(diǎn)存儲(chǔ)文件,而不是把數(shù)據(jù)存儲(chǔ)在磁盤(pán)的其它地方再指向它。 這做了兩件事。第一,它顯著地提高了小文件的性能。由于文件數(shù)據(jù)和 stat_data(索引節(jié))信息是緊挨著存儲(chǔ)的,它們通常能被同一次磁盤(pán) IO 操作所讀取。第二,ReiserFS 能夠壓縮尾文件,節(jié)省大量磁盤(pán)空間。實(shí)際上,帶有尾文件壓縮功能(默認(rèn))的 ReiserFS 文件系統(tǒng)可以比同等的 ext2 文件系統(tǒng)多存儲(chǔ) 6 個(gè)百分點(diǎn)的數(shù)據(jù),這就其自身來(lái)說(shuō)是令人驚嘆的。 然而,由于在文件被修改時(shí),尾文件壓縮迫使 ReiserFS 重裝數(shù)據(jù),這就導(dǎo)致了性能上的輕微折損。鑒于這個(gè)原因,ReiserFS 尾文件壓縮可以被關(guān)掉,允許系統(tǒng)管理員在速度與空間有效率上做出選擇,或者犧牲一些存儲(chǔ)能力來(lái)?yè)Q取更高的速度。 ReiserFS 確實(shí)是一個(gè)非常出色的文件系統(tǒng)。在我的下一篇文章中,我將會(huì)指導(dǎo)您在 Linux 2.4 下完成 ReiserFS 安裝的全過(guò)程。我們還將仔細(xì)地看一看性能調(diào)整,應(yīng)用程序交互作用(和怎么圍繞他們工作)以及使用的最佳內(nèi)核等等。 隨 著 Linux 2.4 的發(fā)行,出現(xiàn)了使用很多新的文件系統(tǒng)的可能性, 包括 ReiserFS、XFS、GFS 和另外一些文件系統(tǒng)。這些文件系統(tǒng)聽(tīng)起來(lái)很“酷”,但是它們到底能做些什么呢,它們擅長(zhǎng)什么,還有您究竟怎樣才能在一個(gè)產(chǎn)品 Linux 環(huán)境中安全地使用它們呢?在本系列文章中,Daniel Robbins 通過(guò)向您展示怎樣在 Linux 2.4 下安裝這些新的高級(jí)文件系統(tǒng),回答了這些問(wèn)題。在他的本系列前面的文章中, 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ì)談到安裝,所以我建議您先通讀本文,然后再遵循安裝指示。這樣,您開(kāi)始在自己的系統(tǒng)上運(yùn)行 ReiserFS 的時(shí)候,腦子里就會(huì)有所有的技術(shù)注解,這樣您就可以在各個(gè)步驟作必要的調(diào)整。 尋找好的內(nèi)核 如果 您想在自己的產(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)核。 總的來(lái)說(shuō),要注意內(nèi)核穩(wěn)定性問(wèn)題,特別是 ReiserFS 的穩(wěn)定性問(wèn)題,這有兩個(gè)原因。因?yàn)?ReiserFS 是一個(gè)“實(shí)驗(yàn)的”內(nèi)核功能,您不能假定一個(gè)使用新內(nèi)核的 ReiserFs 實(shí)現(xiàn)剛剛從 tarball 中解出就能夠很好地運(yùn)行。第二個(gè)原因(也許在目前是更重要的問(wèn)題)在于大部分的 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ì)您小心使用新的、沒(méi)有測(cè)試過(guò)的內(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)生。 如果您沒(méi)有最新的內(nèi)核穩(wěn)定性信息來(lái)源,我建議您定期地訪問(wèn) Linux 每周新聞(請(qǐng)參閱本文后面的參考資料),及時(shí)了解最新的可能出現(xiàn)的內(nèi)核問(wèn)題(信息每個(gè)星期四更新)。希望現(xiàn)在我已經(jīng)說(shuō)服了更多喜歡冒險(xiǎn)的讀者堅(jiān)持使用 2.4.4 或 2.4.4-ac9 內(nèi)核作為產(chǎn)品 ReiserFS 的配置,讓我們繼續(xù)吧。 標(biāo)準(zhǔn)內(nèi)核 首先,從 下載 2.4.4 內(nèi)核源碼并進(jìn)入您的 /usr/src 目錄。 移去該處的任何 linux 目錄或者符號(hào)連接,如果是目錄就將其改名,如果是符號(hào)連接就只需刪除它。然后:
ac9 補(bǔ)丁和大補(bǔ)丁 要使用 ac9 補(bǔ)丁,請(qǐng)從 下載 Alan Cox ac9 補(bǔ)丁。然后鍵入:
一旦標(biāo)準(zhǔn)內(nèi)核安裝完畢,就到 DiCE 去下載 DiCE 的 ReiserFS 大補(bǔ)丁。這個(gè)步驟還是可選的,不過(guò)也是推薦的,特別是如果您將在此系統(tǒng)上運(yùn)行 NFS 服務(wù)器或者需要配額(如果不是這樣,無(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 level options”部分,確保啟用了“Prompt for development and/or incomplete code/drivers”選項(xiàng)。然后到“File systems”部分,啟用“ReiserFS support”選項(xiàng)。 您將 ReiserFS 設(shè)置為直接編譯到內(nèi)核中(而不是作為一種模塊);而且通常啟用“Have reiserFS do extra internal checking”這個(gè)選項(xiàng)不是什么好主意?,F(xiàn)在,保存您的設(shè)置,編譯您的內(nèi)核(“make dep;make bzImage;make modules;make modules_install”),然后配置您的引導(dǎo)裝載器(boot loader)來(lái)裝載新的配置了 ReiserFS 的內(nèi)核。 重點(diǎn):保存當(dāng)前內(nèi)核并配置引導(dǎo)裝載器(boot loader)總是個(gè)好主意,這樣萬(wàn)一您的新內(nèi)核無(wú)法工作,您就可以用原來(lái)的內(nèi)核啟動(dòng)。 安裝工具
既 然工具已經(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 native file system”(83)。 創(chuàng)建和安裝文件系統(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ì)于小文件來(lái)說(shuō)。 文件系統(tǒng)穩(wěn)定性 ReiserFS 的局限性 沒(méi)有 dump/restore 性能問(wèn)題 在對(duì)大量文件執(zhí)行多個(gè) stat() 調(diào)用的代碼中,可能也會(huì)碰到問(wèn)題。一個(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 開(kāi)發(fā)小組已經(jīng)意識(shí)到了這個(gè)特殊的問(wèn)題,并已經(jīng)確定了它的起因,如果近期沒(méi)有解決方案的話,您應(yīng)該可以在 ReiserFS 4 中看到相應(yīng)的解決方案。 性能調(diào)整
在關(guān)于 ReiserFS 的第一篇文章中, 我曾提到 ReiserFS 有一項(xiàng)特別的功能,稱為“tail packing”。在 ReiserFS 術(shù)語(yǔ)中,“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)很多磁盤(pán)空間(當(dāng)然是相對(duì)地說(shuō))。為了解決這個(gè)問(wèn)題,ReiserFS 使用了它的“tail packing”功能來(lái)將這些 tail 壓縮到占用盡可能小的空間。通常,這么做可以讓 ReiserFS 文件系統(tǒng)比大小相等的 ext2 文件系統(tǒng)多容納大約 5% 的數(shù)據(jù)。 更多關(guān)于 notail 的內(nèi)容
即 便您想節(jié)省一點(diǎn)磁盤(pán)空間,有時(shí)候暫時(shí)用一下“notail”選項(xiàng)安裝文件系統(tǒng)也是件好事。特別是,大多數(shù)引導(dǎo)裝載器(boot loader)裝載一個(gè)在啟用 tail packing 的 ReiserFS 文件系統(tǒng)上創(chuàng)建的內(nèi)核時(shí),都會(huì)出現(xiàn)問(wèn)題。如果您正在使用一個(gè)比版本 21.6 還低的 LILO,您就會(huì)碰到這種問(wèn)題。在使用最新版本的 GRUB 時(shí)也會(huì)碰到問(wèn)題,即不能裝載它的 stage1 和 stage1_5 文件,盡管在裝載實(shí)際內(nèi)核的時(shí)候沒(méi)有什么問(wèn)題。如果您已經(jīng)在經(jīng)歷這種問(wèn)題了,您可以這樣修正此問(wèn)題-使用“notail”選項(xiàng)安裝文件系統(tǒng),將文件移到另 一個(gè)文件系統(tǒng)中,然后再把它們移回來(lái)。當(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 注解 結(jié)論 然而除了所有這些,關(guān)于 ReiserFS 最激動(dòng)人心的地方是它將來(lái)的發(fā)展方向。Hans Reiser 對(duì) ReiserFS 有一個(gè)非常激進(jìn)而創(chuàng)新的計(jì)劃,包括計(jì)劃擴(kuò)展文件系統(tǒng)從而能夠?qū)⑵渥鳛橐粋€(gè)發(fā)展成熟的高性能數(shù)據(jù)庫(kù)來(lái)使用,最后還包括事務(wù)支持和高級(jí)查詢功能。這意味 ReiserFS 將不僅僅“只是另一個(gè)高性能文件系統(tǒng)”;相反,它將開(kāi)拓新的可能和道路,使我們能夠用創(chuàng)新方式去解決傳統(tǒng)的存儲(chǔ)問(wèn)題。有了 Namesys 的合作,Linux 將來(lái)的發(fā)展一定會(huì)非常激動(dòng)人心 -這絕對(duì)是一件好事情。 伴 隨著 Linux 2.4 版本的發(fā)行,出現(xiàn)了大量的文件系統(tǒng)可能性,其中包括 ReiserFS、XFS、GFS 和其它文件系統(tǒng)。這些文件系統(tǒng)聽(tīng)起來(lái)的確都很酷,但是它們真正能做些什么呢,擅長(zhǎng)在哪些方面,以及在 Linux 產(chǎn)品環(huán)境下如何才能安全地使用它們呢?Daniel Robbins 通過(guò)向您展示如何在 Linux 2.4 的環(huán)境下建立這些新的高級(jí)文件系統(tǒng)來(lái)回答以上的問(wèn)題。在這個(gè)部分,Daniel 簡(jiǎn)單地介紹了 tmpfs,一個(gè)基于 VM 的文件系統(tǒng),還向您介紹了 2.4 版本的“綁定”安裝功能帶來(lái)的新的可能。 在本系列我以前的文章中,我介紹了創(chuàng)建日志和使用 ReiserFS 的好處,并展示了如何安裝一個(gè)穩(wěn)固的基于 Linux 2.4 的 ReiserFS 系統(tǒng)。 在本文中,我們要談?wù)搸讉€(gè)相對(duì)次要的主題。首先,我們會(huì)簡(jiǎn)單地介紹一下 tmpfs,也就是我們知道的虛擬內(nèi)存(virtual memory,VM)文件系統(tǒng)。Tmpfs 可能是現(xiàn)在 Linux 可以使用的最好的類似于 RAM 磁盤(pán)的系統(tǒng),而且是 2.4 內(nèi)核的一個(gè)新功能。然后,我們將簡(jiǎn)單地介紹另一個(gè) 2.4 內(nèi)核的新功能,叫做“綁定安裝”,它在安裝(和重新安裝)文件系統(tǒng)的時(shí)候帶來(lái)了很大的靈活性。在下一篇文章中,我們會(huì)把重點(diǎn)集中在 devfs 上,之后,我們會(huì)花點(diǎn)時(shí)間來(lái)進(jìn)一步熟悉新的 ext3 文件系統(tǒng)。 介紹 tmpfs tmpfs 和 VM tmpfs 文件系統(tǒng)需要 VM 子系統(tǒng)的頁(yè)面來(lái)存儲(chǔ)文件。tmpfs 自己并不知道這些頁(yè)面是在交換分區(qū)還是在 RAM 中;做這種決定是 VM 子系統(tǒng)的工作。tmpfs 文件系統(tǒng)所知道的就是它正在使用某種形式的虛擬內(nèi)存。 不是塊設(shè)備
執(zhí)行這個(gè)命令之后,一個(gè)新的 tmpfs 文件系統(tǒng)就安裝在 /mnt/tmpfs,隨時(shí)可以使用。注意,不需運(yùn)行 動(dòng)態(tài)文件系統(tǒng)的大小 速度 沒(méi)有持久性 使用 tmpfs 避免低 VM 情況 另 外,內(nèi)核有一個(gè)內(nèi)建的最終防線系統(tǒng),用來(lái)在沒(méi)有可用內(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)程,而且也沒(méi)有容易的方法可以讓內(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)卻沒(méi)有被解決。Ick. 低 VM:解決方案 創(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 這次,我們沒(méi)有把 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),我們可以分別指定 而且,如果您想把上面的
在現(xiàn)存的安裝點(diǎn)上安裝
可是,這種解決方案也許對(duì)您不管用??赡苡泻芏嗾谶\(yùn)行的進(jìn)程在 /tmp 中有打開(kāi)的文件;如果是這樣,在試圖卸載 /tmp 時(shí),您就會(huì)遇到如下的錯(cuò)誤:
然而,使用最近的 2.4 內(nèi)核,您可以安裝您新的 /tmp 文件系統(tǒng),而不會(huì)遇到“device is busy”錯(cuò)誤:
用一條命令,您新的 tmpfs /tmp 文件系統(tǒng)就被安裝在 /tmp,并安裝在已經(jīng)安裝的不能再被直接訪問(wèn)的分區(qū)之上。然而,雖然您不能訪問(wèn)原來(lái)的 /tmp,任何在原文件系統(tǒng)上還有打開(kāi)文件的進(jìn)程都可以繼續(xù)訪問(wè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)。換句話說(shuō),如果您在單獨(dú)的文件系統(tǒng)上有 /usr,我們前面執(zhí)行的綁定安裝就會(huì)讓 /home/drobbins/nifty/usr 為空。您會(huì)需要附加的綁定安裝命令來(lái)使您能夠?yàn)g覽位于 /home/drobbins/nifty/usr 的 /usr 的內(nèi)容:
綁定安裝部分文件系統(tǒng)
在這個(gè)示例中,我們首先創(chuàng)建了一個(gè) /dev/shm/tmp 目錄,然后給它 正如您所見(jiàn),綁定安裝非常強(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)聽(tīng)起來(lái)的確都很酷,但是它們真正能做些什么呢,擅長(zhǎng)在哪些方面,以及在 Linux 產(chǎn)品環(huán)境下如何才能安全地使用它們呢?Daniel Robbins 通過(guò)向您展示如何在 Linux 2.4 的環(huán)境下建立這些新的高級(jí)文件系統(tǒng)來(lái)回答以上的問(wèn)題。遵從這個(gè)方法,他提供了在實(shí)際實(shí)現(xiàn)過(guò)程中的有價(jià)值的建議、性能信息和重要的技術(shù)性注意要點(diǎn),以便于您 在新的文件系統(tǒng)中能有盡可能令人愉快的經(jīng)歷。在本文中:Daniel 解釋了使用設(shè)備管理文件系統(tǒng) devfs 的意義和好處,讓您對(duì)其有所認(rèn)識(shí)以便在下一篇文章中向您展示如何最佳地在系統(tǒng)上安裝 devfs。 設(shè)備,到處都是設(shè)備 實(shí) 際上,通常 Linux 和 Unix 更“酷”的方面是,設(shè)備不是簡(jiǎn)單地隱藏在晦澀的 API 之后,而是真正地與普通文件、目錄和符號(hào)鏈接一樣存在于文件系統(tǒng)上。因?yàn)樽址蛪K設(shè)備是映射到普通文件系統(tǒng)名稱空間的,我們通??梢杂糜幸饬x的方式來(lái)與硬 件交互,可以僅使用標(biāo)準(zhǔn) Unix 命令,如 cat 和 dd。除了有趣之外,這還使我們有更強(qiáng)的能力,并提高生產(chǎn)力。 設(shè)備管理問(wèn)題 僅從這個(gè)方面來(lái)看,我們就知道 /dev 需要徹底檢修,而創(chuàng)建 devfs 的明確目的就是讓 /dev 變回原形。為了很好地理解 devfs 是怎樣解決絕大多數(shù) /dev 管理問(wèn)題的,我們從設(shè)備驅(qū)動(dòng)程序的角度來(lái)看看 devfs。 設(shè)備管理內(nèi)幕 您必須提供一個(gè)主設(shè)備號(hào)(一個(gè)無(wú)符號(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)程序開(kāi)發(fā)人員為調(diào)用 register_???dev() 提供的主設(shè)備號(hào)應(yīng)該是什么呢?如果開(kāi)發(fā)人員不打算將設(shè)備驅(qū)動(dòng)程序與外界共享,那么什么號(hào)碼都可以,只要它與當(dāng)前內(nèi)核使用的其它主設(shè)備號(hào)都不沖突即可。開(kāi)發(fā)人員還可以選擇動(dòng)態(tài)地分配 register_???dev() 調(diào)用的設(shè)備的主設(shè)備號(hào)。然而,這樣的解決方案通常只是在驅(qū)動(dòng)程序不會(huì)被其它人使用的情況下可行。 獲取號(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)無(wú)關(guān))。 一旦設(shè)備驅(qū)動(dòng)程序具備正式主設(shè)備號(hào),設(shè)備就可以被公開(kāi)使用了,設(shè)備節(jié)點(diǎn)也就可以開(kāi)始并入不同分發(fā)版的 /dev 樹(shù),還有它們的正式 /dev/MAKEDEV 腳本(用來(lái)幫助超級(jí)用戶用正確的主從設(shè)備號(hào)、權(quán)限和所有權(quán)創(chuàng)建設(shè)備節(jié)點(diǎn)的特殊腳本)中。 傳統(tǒng)的問(wèn)題 不只是這樣,Linux 還正在耗盡主設(shè)備號(hào)和副號(hào)碼。雖然這種問(wèn)題可以通過(guò)簡(jiǎn)單地?cái)U(kuò)展主設(shè)備號(hào)和副號(hào)碼使用的位數(shù),首先維護(hù)這些主設(shè)備號(hào)映射就很討厭了,所以我們又在考慮有沒(méi)有更好的方法來(lái)處理這些事情。幸運(yùn)的是,有這樣的方法;進(jìn)入 devfs。 devfs_register() 這里是 devfs_register() 調(diào)用有趣的地方。雖然為了兼容性目的指定主設(shè)備號(hào)和副號(hào)碼作為參數(shù)是可能的,但不再需要這樣了。相反, devfs_register() 調(diào)用接受設(shè)備路徑(就是它在 /dev 下可能的出現(xiàn)形式)作為參數(shù)。舉例來(lái)說(shuō),假設(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 這種系統(tǒng)的優(yōu)點(diǎn)是,所有需要的設(shè)備節(jié)點(diǎn)(沒(méi)有別的了)都由內(nèi)核自動(dòng)創(chuàng)建。這不僅僅意味著不再需要 MAKEDEV(因 為所有注冊(cè)的設(shè)備都只“出現(xiàn)”在 /dev 中),還意味著 /dev 不再被成百個(gè)“無(wú)用的”設(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) 沒(méi)有 devfs,linuxrc 就需要“查看” /dev 中的很多特殊文件,它們可能有也可能沒(méi)有表示連接到系統(tǒng)的真實(shí)硬件。例如, linuxrc 會(huì)需要檢測(cè) /dev/hdc、/dev/scd0、/dev/hdb 和其它的設(shè)備以檢測(cè)“活動(dòng)的”光盤(pán)驅(qū)動(dòng)器設(shè)備。在檢測(cè)進(jìn)程中,很可能命中幾個(gè)“無(wú)用的”設(shè)備節(jié)點(diǎn)。 然而,使用 devfs,linuxrc 只在 /dev/cdroms 中尋找,它包含了系統(tǒng)中所有和活動(dòng)的光 盤(pán)驅(qū)動(dòng)器相關(guān)聯(lián)的特殊文件,不管是 IDE 的還是 SCSI 的。由于這種便捷的新式 devfs 約定,再不需要猜測(cè)了;只有活動(dòng)的設(shè)備才會(huì)列出,而且設(shè)備檢測(cè)代碼甚至不必?fù)?dān)心底層的光盤(pán)驅(qū)動(dòng)器的細(xì)節(jié),比如說(shuō)它使用什么 IDE 通道或者什么 SCSI ID。實(shí)際上,這是 devfs 的另一個(gè)主要好處;在我下一篇文章中,我們會(huì)看到 devfs 下 /dev 中的設(shè)備有全新的缺省位置。 實(shí)際上,如果您想訪問(wèn)一個(gè)特定的塊設(shè)備(如磁盤(pán)、分區(qū)、光盤(pán)驅(qū)動(dòng)器等等),事實(shí)上有 幾個(gè)不同的特殊文件可以引用。例如,我的服務(wù)器只有一個(gè) SCSI 光盤(pán)驅(qū)動(dòng)器;如果啟用了 devfs,我就可以通過(guò)安裝 /dev/cdroms/cdrom0 或 /dev/scsi/host0/bus0/target4/lun0/cd 訪問(wèn)它。兩種都引用同一個(gè)設(shè)備,我可以引用我認(rèn)為最方便的特殊文件。如果愿意,我還可以使用一種老式的設(shè)備名稱(/dev/sr0)訪問(wèn)光盤(pán)驅(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 的信息。
|
|