內存文件系統使用及示例:ramdisk, ramfs, tmpfs 第一部分 在Linux中可以將一部分內存mount為分區來使用,通常稱之為RamDisk。 RamDisk有三種實現方式: 第一種就是傳統意義上的,可以格式化,然后加載。 這在Linux內核2.0/2.2就已經支持,其不足之處是大小固定,之后不能改變。 為了能夠使用Ramdisk,我們在編譯內核時須將block device中的Ramdisk支持選上,它下面還有兩個選項,一個是設定Ramdisk的大小,默認是4096k;另一個是initrd的支持。 如果對Ramdisk的支持已經編譯進內核,我們就可以使用它了: 查看一下可用的RamDisk,使用ls /dev/ram* 首先創建一個目錄,比如test,運行mkdir /mnt/test; 然后對/dev/ram0 創建文件系統,運行mke2fs /dev/ram0; 最后掛載 /dev/ram0,運行mount /dev/ram /mnt/test,就可以象對普通硬盤一樣對它進行操作了。 更詳細的內容可以參考: http://www.linuxfocus.org/ChineseGB/November1999/article124.html http://www.vanemery.com/Linux/Ramdisk/ramdisk.html 另兩種則是內核2.4才支持的,通過Ramfs或者Tmpfs來實現: 它們不需經過格式化,用起來靈活,其大小隨所需要的空間而增加或減少。 Ramfs顧名思義是內存文件系統,它它處於虛擬文件系統(VFS)層,而不像ramdisk那樣基於虛擬在內存中的其他文件系統(ex2fs)。 因而,它無需格式化,可以創建多個,只要內存足夠,在創建時可以指定其最大能使用的內存大小。 如果你的Linux已經將Ramfs編譯進內核,你就可以很容易地使用Ramfs了。創建一個目錄,加載Ramfs到該目錄即可: # mkdir /testRam # mount -t ramfs none /testRAM 缺省情況下,Ramfs被限制最多可使用內存大小的一半。可以通過maxsize(以kbyte為單位)選項來改變。 # mount -t ramfs none /testRAM -o maxsize=2000 (創建了一個限定最大使用內存為2M的ramdisk) Tmpfs是一個虛擬內存文件系統,它不同於傳統的用塊設備形式來實現的Ramdisk,也不同於針對物理內存的Ramfs。 Tmpfs可以使用物理內存,也可以使用交換分區。在Linux內核中,虛擬內存資源由物理內存(RAM)和交換分區組成,這些資源是由內核中的虛擬內存子系統來負責分配和管理。 Tmpfs向虛擬內存子系統請求頁來存儲文件,它同Linux的其它請求頁的部分一樣,不知道分配給自己的頁是在內存中還是在交換分區中。同Ramfs一樣,其大小也不是固定的,而是隨着所需要的空間而動態的增減。 使用tmpfs,首先你編譯內核時得選擇"虛擬內存文件系統支持(Virtual memory filesystem support)" 。 然后就可以加載tmpfs文件系統了: # mkdir -p /mnt/tmpfs # mount tmpfs /mnt/tmpfs -t tmpfs 同樣可以在加載時指定tmpfs文件系統大小的最大限制: # mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m 使用df -aT命令可以看到有個/dev/shm目錄,該目錄的文件系統是tmpfs的,因此這個目錄下的文件訪問是非常快的,但是其大小可能不同機器都不一樣,而且每次重啟后文件也就丟失了。 第二部分 LINUX下我所接觸過的內存文件系統有三個: (1)ramdisk,使用前需要先創建文件系統,並且調整文件系統大小比較麻煩,需要修改內核引導參數並重新啟動操作系統,在繁雜多變的應用與需要 7X24不間斷運行的系統來說,並不是一個可以接受的選擇.好處是自2.0版本起內核便支持(這也算好處?嗯,確實算,如果你手頭真有這樣的系統的話) (2)ramfs,使用前不需要去創建文件系統了,直接通過mount的方式即可掛載上來用,需要的時候可以使用"mount -o remount,maxsize=..."這種方式來調整大小. (3)tmpfs,同ramfs在表面上基本上一樣啦,不同於ramfs針對"物理內存",tmpfs是在虛擬內存下分配空間的,也就是說tmpfs實例中存儲的文件既可能存在於物理內存中,也可能存在於交換分區中,具體存在哪里,是由"虛擬內存子系統"來調度的. 純性能角度講,ramfs會在進程占用內存使用較多的情況下會優於tmpfs,在沒有交換分區或進程占用內存較小而不發生swap行為的情況下,兩者性能不會有差異(這個結論沒有實測過,我"想當然"用猜的) 基本情況介紹完畢,下面介紹tmpfs的應用,(沒辦法,我手頭機器內存不是那么寬裕...) 0,根據需要創建掛載目錄,例: mkdir -p $DIR_TMP; 1,掛載 mount my_tmpfs $DIR_TMP -t tmpfs -o size=512m my_tmpfs這個名字需要起,一個標識而已,會出現在df 的Filesytem一列,起個別致點的名字比較容易被自己寫的其它監控腳本找到,如果非要起個none或tmpfs之類的名字的話...反正系統默認掛載的tmpfs都比較喜歡用這兩個名字,好壞自己琢磨吧. 成功以后自己用df 看一下就知道了,寫監控腳本時可以用"df -t tmpfs|grep ^my_tmpfs"來找到這一行. 2,調整 應用中如果感覺不合適,隨時可以用mount命令調整 mount $DIR_TMP -o remount,size=1024m,nr_inodes=100k nr_inodes為最大節點數,如果你的$DIR_TMP使用df命令查看明明有空間,卻無法創建新文件(例如touch一個新文件),可能是文件節點用到上限了,可以用"df -i"命令來查看,如果是有空間但節點達到上限,就需要用nr_inodes來調整了. 其它可以調整的參數: mode,uid,gid, uid和gid就不多說了,不知道的回家補基礎,mode也不多說了,取值是3個八進制數字,表示許可權限,不知道這個的也回家... 其它參數,參見mount命令的man page之OPTIONS一節中"-o"參數的說明. 3,卸載 umount $DIR_TMP 4,其它 mount 命令的man page中對tmpfs提及不多,詳細一些的文檔,請參閱內核文檔Documentation/filesystems/tmpfs.txt(內核源代碼目錄內)