歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 使用虛擬內存(virtual memory,VM)文件系統和綁定安裝

使用虛擬內存(virtual memory,VM)文件系統和綁定安裝

日期:2017/2/27 9:21:53   编辑:更多Linux
  Daniel Robbins([email protected]) 總裁/首席執行官,Gentoo Technologies,Inc. 2001 年 9 月 伴隨著 Linux 2.4 版本的發行,出現了大量的文件系統可能性,其中包括 ReiserFS、XFS、GFS 和其它文件系統。這些文件系統聽起來的確都很酷,但是它們真正能做些什麼呢,擅長在哪些方面,以及在 Linux 產品環境下如何才能安全地使用它們呢?Daniel Robbins 通過向您展示如何在 Linux 2.4 的環境下建立這些新的高級文件系統來回答以上的問題。在這個部分,Daniel 簡單地介紹了 tmpfs,一個基於 VM 的文件系統,還向您介紹了 2.4 版本的“綁定”安裝功能帶來的新的可能。 在本系列我以前的文章中,我介紹了創建日志和使用 ReiserFS 的好處,並展示了如何安裝一個穩固的基於 Linux 2.4 的 ReiserFS 系統。在本文中,我們要談論幾個相對次要的主題。首先,我們會簡單地介紹一下 tmpfs,也就是我們知道的虛擬內存(virtual memory,VM)文件系統。Tmpfs 可能是現在 Linux 可以使用的最好的類似於 RAM 磁盤的系統,而且是 2.4 內核的一個新功能。然後,我們將簡單地介紹另一個 2.4 內核的新功能,叫做“綁定安裝”,它在安裝(和重新安裝)文件系統的時候帶來了很大的靈活性。在下一篇文章中,我們會把重點集中在 devfs 上,之後,我們會花點時間來進一步熟悉新的 ext3 文件系統。 介紹 tmpfs 如果我必須一下子說清楚 tmpfs,我會說 tmpfs 就象虛擬磁盤(ramdisk),但不一樣。象虛擬磁盤一樣,tmpfs 可以使用您的 RAM,但它也可以使用您的交換分區來存儲。而且傳統的虛擬磁盤是個塊設備,並需要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個文件系統,而不是塊設備;您只是安裝它,它就可以使用了。總而言之,這讓 tmpfs 成為我有機會遇到的最好的基於 RAM 的文件系統。 tmpfs 和 VM 讓我們來看看 tmpfs 更有趣的一些特性吧。正如我前面提到的一樣,tmpfs 既可以使用 RAM,也可以使用交換分區。剛開始這看起來可能有點武斷,但請記住 tmpfs 也是我們知道的“虛擬內存文件系統”。而且,您可能也知道,Linux 內核的虛擬內存資源同時來源於您的 RAM 和交換分區。內核中的 VM 子系統將這些資源分配到系統中的其它部分,並負責在後台管理這些資源,通常是透明地將 RAM 頁移動到交換分區或從交換分區到 RAM 頁。 tmpfs 文件系統需要 VM 子系統的頁面來存儲文件。tmpfs 自己並不知道這些頁面是在交換分區還是在 RAM 中;做這種決定是 VM 子系統的工作。tmpfs 文件系統所知道的就是它正在使用某種形式的虛擬內存。 不是塊設備 這裡是 tmpfs 文件系統另一個有趣的特性。不同於大多數“標准的”文件系統,如 ext3、ext2、XFS、JFS、ReiserFS 和其它一些系統,tmpfs 並不是存在於一個底層塊設備上面。因為 tmpfs 是直接建立在 VM 之上的,您用一個簡單的 mount 命令就可以創建 tmpfs 文件系統了。 # mount tmpfs /mnt/tmpfs -t tmpfs 執行這個命令之後,一個新的 tmpfs 文件系統就安裝在 /mnt/tmpfs,隨時可以使用。注意,不需運行 mkfs.tmpfs;事實上,那是不可能的,因為沒有這樣的命令存在。在 mount 命令執行之後,文件系統立即就被安裝並且可以使用了,類型是 tmpfs。這和 Linux 虛擬磁盤如何使用大相徑庭;標准的 Linux 虛擬磁盤是塊設備,所以在使用它們之前必須用您選擇的文件系統將其格式化。相反,tmpfs 是一個文件系統。所以,您可以簡單地安裝它就可以使用了。 Tmpfs 的優勢 動態文件系統的大小 您可能想知道我們前面在 /mnt/tmpfs 安裝的 tmpfs 文件系統有多大。這個問題的答案有點意外,特別是在和基於磁盤的文件系統比較的時候。/mnt/tmpfs 最初會只有很小的空間,但隨著文件的復制和創建,tmpfs 文件系統驅動程序會分配更多的 VM,並按照需求動態地增加文件系統的空間。而且,當 /mnt/tmpfs 中的文件被刪除時,tmpfs 文件系統驅動程序會動態地減小文件系統並釋放 VM 資源,這樣做可以將 VM 返回到循環當中以供系統中其它部分按需要使用。因為 VM 是寶貴的資源,所以您一定不希望任何東西浪費超出它實際所需的 VM,tmpfs 的好處之一就在於這些都是自動處理的。 請參閱參考資料。 速度 tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 文件系統會完全駐留在 RAM 中,讀寫幾乎可以是瞬間的。即使用了一些交換分區,性能仍然是卓越的,當更多空閒的 VM 資源可以使用時,這部分 tmpfs 文件系統會被移動到 RAM 中去。讓 VM 子系統自動地移動部分 tmpfs 文件系統到交換分區實際上對性能上是好的,因為這樣做可以讓 VM 子系統為需要 RAM 的進程釋放空間。這一點連同它動態調整大小的能力,比選擇使用傳統的 RAM 磁盤可以讓操作系統有好得多的整體性能和靈活性。 沒有持久性


這看起來可能不象是個積極因素,tmpfs 數據在重新啟動之後不會保留,因為虛擬內存本質上就是易失的。我想您可能猜到了 tmpfs 被稱為“tmpfs”的一個原因,不是嗎?然而,這實際上可以是一件好事。它讓 tmpfs 成為一個保存您不需保留的數據(如臨時文件,可以在 /tmp 中找到,還有 /var 文件系統樹的某些部分)的卓越的文件系統。 使用 tmpfs 為了使用 tmpfs,您所需要的就是啟用了“Virtual memory file system support(以前是 shm fs)”選項的 2.4 系列內核;這個選項在內核配置選項的“File systems”部分。一旦您有了一個啟用了 tmpfs 的內核,您就可以開始安裝 tmpfs 文件系統了。其實,在您所有的 2.4 內核中都打開 tmpfs 選項是個好主意,不管您是否計劃使用 tmpfs。這是因為您需要內核 tmpfs 支持來使用 POSIX 共享的內存。然而,System V 共享的內存不需要內核中有 tmpfs 就可以工作。注意,您不需要為了讓 POSIX 共享的內存工作而安裝 tmpfs 文件系統;您只需要在內核中支持 tmpfs 就可以了。POSIX 共享的內存現在使用得不太多,但這種情況可能會隨著時間而改變。 避免低 VM 情況 tmpfs 根據需要動態增大或減小的事實讓人疑惑:如果您的 tmpfs 文件系統增大到它耗盡了所有虛擬內存的程度,而您沒有剩余的 RAM 或交換分區,這時會發生什麼?一般來說,這種情況是有點討厭。如果是 2.4.4 內核,內核會立即鎖定。如果是 2.4.6 內核,VM 子系統已經以很多種方式得到了修正,雖然耗盡 VM 並不是一個美好的經歷,事情也不會完全地失敗。如果 2.4.6 內核到了無法分配更多 VM 的程度,您顯然不願意不能向 tmpfs 文件系統寫任何新數據。另外,可能會發生其他一些事情。首先,系統的其他一些進程會無法分配更多的內存;通常,這意味著系統多半會變得極度緩慢而且幾乎沒有響應。這樣,超級用戶要采取必要的步驟來緩解這種低 VM 的情況就會很困難,或異常地耗時。 另外,內核有一個內建的最終防線系統,用來在沒有可用內存的時候釋放內存,它會找到占用 VM 資源的進程並終止該進程。不幸的是,這種“終止進程”的解決方案在 tmpfs 的使用增加引起 VM 耗盡的情況下通常會導致不良後果。以下是原因。tmpfs 本身不能(也不應該)被終止,因為它是內核的一部分而非一個用戶進程,而且也沒有容易的方法可以讓內核找出是那個進程占滿了 tmpfs 文件系統。所以,內核會錯誤地攻擊它能找到的最大的占用 VM 的進程,通常會是 X 服務器(X server),如果您碰巧在使用它。所以,您的 X 服務器會被終止,而引起低 VM 情況的根本原因(tmpfs)卻沒有被解決。Ick. 低 VM:解決方案 幸運的是,tmpfs 允許您在安裝或重新安裝文件系統的時候指定文件系統容量的最大值上限。實際上,從 2.4.6 內核到 2.11g 內核,這些參數只能在安裝時設置,而不是重新安裝時,但我們可以期望在不久的將來可以在重新安裝時設置這些參數。tmpfs 容量最大值的最佳設置依賴於資源和您特定的 Linux 主機的使用模式;這個想法是要防止一個完全使用資源的 tmpfs 文件系統耗盡所有虛擬內存結果導致我們前面談到的糟糕的低 VM 情況。尋找好的 tmpfs 上限值的一個好方法是使用 top 來監控您系統的交換分區在高峰使用階段的使用情況。然後,確保指定的 tmpfs 上限稍小於所有這些高峰使用時間內空閒交換分區和空閒 RAM 的總和。 創建有最大容量的 tmpfs 文件系統很容易。要創建一個新的最大 32 MB 的 tmpfs 文件系統,請鍵入: # mount tmpfs /dev/shm -t tmpfs -o size=32m 這次,我們沒有把 tmpfs 文件系統安裝在 /mnt/tmpfs,而是創建在 /dev/shm,這正好是 tmpfs 文件系統的“正式”安裝點。如果您正好在使用 devfs,您會發現這個目錄已經為您創建好了。 還有,如果我們想將文件系統的容量限制在 512 KB 或 1 GB 以內,我們可以分別指定 size=512k 和 size=1g。除了限制容量,我們還可以通過指定 nr_inodes=x 參數限制索引節點(文件系統對象)。在使用 nr_inodes 時,x 可以是一個簡單的整數,後面還可以跟一個 k、m 或 g 指定千、百萬或十億(!)個索引節點。 而且,如果您想把上面的 mount tmpfs 命令的等價功能添加到 /etc/fstab,應該是這樣: tmpfs /dev/shm tmpfs size=32m 0 0 在現存的安裝點上安裝 在以前使用 2.2 的時候,試圖在已經安裝了東西的安裝點再次安裝任何東西都會引發錯誤。然而,重寫後的內核安裝代碼使多次使用安裝點不再成為問題。這裡是一個示例的情況:假設我們有一個現存的文件系統安裝在 /tmp。然而,我們決定要開始使用 tmpfs 進行 /tmp 的存儲。過去,您唯一的選擇就是卸載 /tmp 並在其位置重新安裝您新的 tmpfs/tmp 文件系統,如下所示: # umount /tmp # mount tmpfs /tmp -t tmpfs -o size=64m 可是,這種解決方案也許對您不管用。可能有很多正在運行的進程在 /tmp 中有打開的文件;如果是這樣,在試圖卸載 /tmp 時,您就會遇到如下的錯誤: umount: /tmp: device is busy 然而,使用最近的 2.4 內核,您可以安裝您新的 /tmp 文件系統,而不會遇到“device is busy”錯誤: # mount tmpfs /tmp -t tmpfs -o size=64m

用一條命令,您新的 tmpfs /tmp 文件系統就被安裝在 /tmp,並安裝在已經安裝的不能再被直接訪問的分區之上。然而,雖然您不能訪問原來的 /tmp,任何在原文件系統上還有打開文件的進程都可以繼續訪問它們。而且,如果您 unmount 基於 tmpfs 的 /tmp,原來安裝的 /tmp 文件系統會重新出現。實際上,您在相同的安裝點上可以安裝任意數目的文件系統,安裝點就象一個堆棧;卸載當前的文件系統,上一個最近安裝的文件系統就會重新出現。 綁定安裝 使用綁定安裝,我們可以將所有甚至部分已經安裝的文件系統安裝到另一個位置,而在兩個安裝點可以同時訪問該文件系統。例如,您可以使用綁定安裝來安裝您現存的根文件系統到 /home/drobbins/nifty,如下所示: # mount --bind / /home/drobbins/nifty 現在,如果您觀察 /home/drobbins/nifty 的內部,您就會看到您的根文件系統(/home/drobbins/nifty/etc、/home/drobbins/nifty/opt 等)。而且,如果您在根文件系統修改文件,您在 /home/drobbins/nifty 中也可以看到所作的改動。這是因為它們是同一個文件系統;內核只是簡單地為我們將該文件系統映射到兩個不同的安裝點。注意,當您在另一處安裝文件系統時,任何安裝在綁定安裝文件系統內部的安裝點的文件系統都不會隨之移動。換句話說,如果您在單獨的文件系統上有 /usr,我們前面執行的綁定安裝就會讓 /home/drobbins/nifty/usr 為空。您會需要附加的綁定安裝命令來使您能夠浏覽位於 /home/drobbins/nifty/usr 的 /usr 的內容: # mount --bind /usr /home/drobbins/nifty/usr 綁定安裝部分文件系統 綁定安裝讓更妙的事情成為可能。假設您有一個 tmpfs 文件系統安裝在它的傳統位置 /dev/shm,您決定要開始在當前位於根文件系統的 /tmp 使用 tmpfs。雖然可以在 /tmp(這是可能的)安裝一個新的 tmpfs 文件系統,您也可以決定讓新的 /tmp 共享當前安裝的 /dev/shm 文件系統。然而,雖然您可以在 /tmp 綁定安裝 /dev/shm 就完成了,但您的 /dev/shm 還包含一些您不想在 /tmp 出現的目錄。所以,您怎麼做呢?這樣如何: # mkdir /dev/shm/tmp # chmod 1777 /dev/shm/tmp # mount --bind /dev/shm/tmp /tmp 在這個示例中,我們首先創建了一個 /dev/shm/tmp 目錄,然後給它 1777 權限,對 /tmp 適當的許可。既然我們的目錄已經准備好了,我們可以安裝,也只能安裝 /dev/shm/tmp 到 /tmp。所以,雖然 /tmp/foo 會映射到 /dev/shm/tmp/foo,但您沒有辦法從 /tmp 訪問 /dev/shm/bar 文件。 正如您所見,綁定安裝非常強大,讓您可以輕易地修改文件系統設計,絲毫不必忙亂。下一篇文章,我們會談到 devfs,至於現在,您也許會想看看下面的參考資料。 參考資料 * 閱讀 Daniel 本系列以前的文章,他在那裡介紹了創建日志和使用 ReiserFS 的好處,並展示了如何安裝一個穩固的基於 Linux 2.4 的 ReiserFS 系統。 * Linux Weekly News 是與最新的內核開發保持同步的很好的參考資料。 * util-linux(最新鏈接)收集了各種重要的 Linux 應用程序,包括 mount 和 unmount。您也許希望升級到最新的可用版本,這樣您就可以使用 mount --bind 語法(而不是使用 mount -o bind)。 * 因為 tmpfs 和綁定安裝相對來說比較新,大部分都是沒有文檔說明的內核新特性,學習它們的最好方法就是學習 Linux 內核源代碼的相關部分。 * Namesys 頁面就是學習更多關於 ReiserFS 的地方。 * ReiserFS 郵件清單是更深入了解當前ReiserFS 信息的很好的資源。一定還要看看 ReiserFS 郵件清單歸檔。 * 在 Juan I. Santos Florido 的 Linux Gazette Journal File Systems 回顧中,您可以找到 UFS、ext2 和 ReiserFS 之間元數據差異的很深入的講解和其它一些內容。 * Jedi 的 ReiserFS/Qmail 調優頁面包含很多對 qmail 用戶很有用的信息。一定還要看看 ReiserSMTP,Jedi 在這裡收集了很多提供強大 qmail 性能的 qmail 組件。 * 閱讀 developerWorks 上 Steve Best 的 JFS 概觀。 * 參加 developerWorks 上 Daniel 的免費的 JFS 基礎教程。 * 浏覽 developerWorks 上更多 Linux 參考資料。 * 浏覽 developerWorks 上更多開放源代碼資源。 關於作者 Daniel Robbins 是 Gentoo Technologies,Inc. 的總裁/首席執行官,住在新墨西哥州的 Albuquerque,他是 Gentoo Linux(一種 PC 機上的高級 Linux)和 Portage 系統(Linux 的下一代移植系統)的創建者。他還是 Macmillan 的書籍 Caldera OpenLinux Unleashed、SuSE Linux Unleashed 和 Samba Unleashed 的特約作者。Daniel 從他二年級時接觸到 Logo 編程語言和 Pac Man 游戲的潛在危險魔力後就被這股熱流卷進了計算機中。這或許可以解釋他為什麼曾經是 SONY 電子出版/游戲公司的首席圖形設計師了。Daniel 喜歡花時間和他的妻子 Mary 還有他剛出生的寶貝女兒 Hadassah 在一起。您可以通過 [email protected] 聯系他。



* Jedi 的 ReiserFS/Qmail 調優頁面包含很多對 qmail 用戶很有用的信息。一定還要看看 ReiserSMTP,Jedi 在這裡收集了很多提供強大 qmail 性能的 qmail 組件。 * 閱讀 developerWorks 上 Steve Best 的 JFS 概觀。 * 參加 developerWorks 上 Daniel 的免費的 JFS 基礎教程。 * 浏覽 developerWorks 上更多 Linux 參考資料。 * 浏覽 developerWorks 上更多開放源代碼資源。 關於作者 Daniel Robbins 是 Gentoo Technologies,Inc. 的總裁/首席執行官,住在新墨西哥州的 Albuquerque,他是 Gentoo Linux(一種 PC 機上的高級 Linux)和 Portage 系統(Linux 的下一代移植系統)的創建者。他還是 Macmillan 的書籍 Caldera OpenLinux Unleashed、SuSE Linux Unleashed 和 Samba Unleashed 的特約作者。Daniel 從他二年級時接觸到 Logo 編程語言和 Pac Man 游戲的潛在危險魔力後就被這股熱流卷進了計算機中。這或許可以解釋他為什麼曾經是 SONY 電子出版/游戲公司的首席圖形設計師了。Daniel 喜歡花時間和他的妻子 Mary 還有他剛出生的寶貝女兒 Hadassah 在一起。您可以通過 [email protected] 聯系他。



Copyright © Linux教程網 All Rights Reserved