1. 程式人生 > >tmpfs 檔案系統介紹

tmpfs 檔案系統介紹

 如果我必須一下子說清楚 tmpfs,我會說 tmpfs 就象虛擬磁碟(ramdisk),但不一樣。象虛擬磁碟一樣,tmpfs 可以使用您的 RAM,但它也可以使用您的交換分割槽來儲存。而且傳統的虛擬磁碟是個塊裝置,並需要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個檔案系統,而不是塊裝置;您只是安裝它,它就可以使用了。總而言之,這讓 tmpfs 成為我有機會遇到的最好的基於 RAM 的檔案系統。

一、介紹
1、tmpfs 和VM
讓我們來看看 tmpfs 更有趣的一些特性吧。正如我前面提到的一樣,tmpfs 既可以使用 RAM, 也可以使用交換分割槽。剛開始這看起來可能有點武斷,但請記住 tmpfs 也是我們知道的“虛擬記憶體檔案系統”。而且,您可能也知道,Linux 核心的虛擬記憶體資源同時來源於您的 RAM 和交換分割槽。核心中的 VM 子系統將這些資源分配到系統中的其它部分,並負責在後臺管理這些資源,通常是透明地將 RAM 頁移動到交換分割槽或從交換分割槽到 RAM 頁。

tmpfs 檔案系統需要 VM 子系統的頁面來儲存檔案。tmpfs 自己並不知道這些頁面是在交換分割槽還是在 RAM 中;做這種決定是 VM 子系統的工作。tmpfs 檔案系統所知道的就是它正在使用某種形式的虛擬記憶體。

2、不是塊裝置
這裡是 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 的優勢
1、動態檔案系統的大小
您可能想知道我們前面在 /mnt/tmpfs 安裝的 tmpfs 檔案系統有多大。這個問題的答案有點意外,特別是在和基於磁碟的檔案系統比較的時候。/mnt/tmpfs 最初會只有很小的空間,但隨著檔案的複製和建立,tmpfs 檔案系統驅動程式會分配更多的 VM,並按照需求動態地增加檔案系統的空間。而且,當 /mnt/tmpfs 中的檔案被刪除時,tmpfs 檔案系統驅動程式會動態地減小檔案系統並釋放 VM 資源,這樣做可以將 VM 返回到迴圈當中以供系統中其它部分按需要使用。因為 VM 是寶貴的資源,所以您一定不希望任何東西浪費超出它實際所需的 VM,tmpfs 的好處之一就在於這些都是自動處理的。 請參閱 
參考資料

2、速度
tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 檔案系統會完全駐留在 RAM 中,讀寫幾乎可以是瞬間的。即使用了一些交換分割槽,效能仍然是卓越的,當更多空閒的 VM 資源可以使用時,這部分 tmpfs 檔案系統會被移動到 RAM 中去。讓 VM 子系統自動地移動部分 tmpfs 檔案系統到交換分割槽實際上對效能上是好的,因為這樣做可以讓 VM 子系統為需要 RAM 的程序釋放空間。這一點連同它動態調整大小的能力,比選擇使用傳統的 RAM 磁碟可以讓作業系統有好得多的整體效能和靈活性。

3、沒有永續性
這看起來可能不象是個積極因素,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 共享的記憶體現在使用得不太多,但這種情況可能會隨著時間而改變。 

1、避免低 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)卻沒有被解決。unhappy

2、低 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 檔案。 
正如您所見,繫結安裝非常強大,讓您可以輕易地修改檔案系統設計,絲毫不必忙亂。

六、參考資料
您可以參閱本文在 developerWorks 全球站點上的 英文原文

閱讀 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 之間元資料差異的很深入的講解和其它一些內容。 

閱讀 developerWorks上 Steve Best 的 JFS 概觀。 

參加 developerWorks上 Daniel 的免費的 JFS 基礎教程。 

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

瀏覽 developerWorks上 更多開放原始碼資源

七、關聯文章
巧用tmpfs加速你的linux伺服器