1. 程式人生 > >linux下使用ramdisk的一點認識

linux下使用ramdisk的一點認識

ramdisk是從記憶體中劃出一部分作為一個分割槽使用,這個分割槽跟正常的磁碟分割槽一樣,但其讀寫速度會遠高於磁碟,不過儲存在其中的資料會在系統斷電或者關機後丟失。利用ramdisk的高速和易失特性,可以用ramdisk分割槽將加密檔案解密,或者應用於Web伺服器,或者掛載Loopback檔案系統。 Windows下ramdisk的軟體多達十幾種,特點和效能各有所長。而Linux下對ramdisk的實現主要有三種方法:ramdisk, ramfs, tmpfs.

1.ramdisk

        利用Linux核心對ramdisk的支援,通過掛載分割槽、建立檔案系統的方式來使用。Linux在核心2.4開始就已經支援ramdisk,早期版本是1995寫的rd.c,此後一直是2007年基於/drivers/blocdk/rd.c與loop.c改寫的brd.c,直到現在核心4.1還是這個版本,大部分distributions都預設建立了ramdisk。ramdisk可以有兩種使用方式,一種是編譯到核心,預設下就是這種方式,但改變ramdisk大小需要重啟系統;另一種是編譯成模組,修改ramdisk大小後重新載入模組即可。

        首先,就編譯到核心中如何使用、修改Ramdisk的過程簡要介紹:

(1)ls -l /dev/ram*

檢視系統預設建立的ramdisk

[root]# dmesg | grep RAMDISK

檢視預設建立的ramdisk容量,預設為16個,大小為4MB

(2)增加ramdisk容量

ramdisk的容量通過命令列選項來控制,並在啟動時傳遞給核心。以RedHat9為例,由於GRUB是RedHat9的預設bootloader ,因此可以通過修改/etc/grub.conf作為新的核心選項,設定ramdisk 大小的核心選項是ramdisk_size=xxxxx, xxxx的單位是1KB,修改後需要重啟系統,並通過dmesg輸出檢視修改是否生效。

(3)格式化ramdisk

需要將ramdisk用一種檔案系統格式化,由於沒有必要採用日誌檔案系統,因此僅用EXT2格式即可,以僅需要使用ram0為例:

[root]# mke2fs -m 0 /dev/ram0

(4)建立掛載點,掛載ramdisk

在已經格式化了ramdisk之後,必須為其建立一個掛載點,然後將ramdisk掛載到該掛載點後使用。

[root]# mkdir /mnt/rd
[root]# mount /dev/ram0 /mnt/rd

檢視驗證掛載是否成功及檔案系統資訊

[root]# mount | grep ram0
[root]# df -h | grep ram0

進一步檢視ram0的詳細資訊

[root]# tune2fs -l /dev/ram0

修改掛載點的使用許可權

[root]# chown van:root /mnt/rd
[root]# chmod 0770 /mnt/rd

驗證並檢視掛載點的許可權是否修改

[root]# ls -ald /mnt/rd

(5)使用ramdisk

完成以上工作後,就可以像在磁碟分割槽上一樣在ramdisk上進建立、複製、移動、刪除、編輯檔案了。如果需要移除ramdisk,採用以下命令解除掛載即可:

[root]# umount -v /mnt/rd

以上是手動建立ramdisk的過程,也可以通過在/etc/rc.local初始化指令碼中加入一些命令來自動完成以上過程,以在便系統每次啟動時就自動建立和掛載ramdisk。

-------------------------------------------------------------

/sbin/mke2fs-q -m 0 /dev/ram0
/bin/mount /dev/ram0 /mnt/rd
/bin/chown van:root /mnt/rd
/bin/chmod 0750 /mnt/rd

-------------------------------------------------------------

提示:如果重新掛載ramdisk,資料還在。一旦記憶體被分配給ramdisk,就會被標記以防止核心在之後再次使用記憶體。因此,在你使用完ramdisk之後,並不能重新回收ramdisk。基於這個原因,必須在分配ramdisk空間時儘可能謹慎,應該根據需求定製需要的ramdisk大小。當然,也可以通過重啟釋放空間。

2.ramfs

           ramfs是一種記憶體檔案系統,不像ramdisk那樣基於虛擬在記憶體中的其他檔案系統(如ex2fs),ramfs處於虛擬檔案系統(VFS)層,因而無需格式化,可以建立多個,只要記憶體足夠,在建立時可以指定其最大能使用的記憶體大小。在編譯核心時須將File systems -->> pseudofilesystems -->>  Virtual memoryfile system support支援選上。ramfs的使用相對簡單,建立掛載點後,按照ramfs的檔案系統進行掛載即可。

root# mkdir none /testRAM

root# mount -t ramfs none /testRAM

預設情況下,Ramfs被限制最多可使用一半的記憶體,可通過maxsize選項來改變 

root# mount -t ramfs none /testRAM -omaxsize=2000               (單位是kbyte)

3.tmpfs

            tmpf是一個虛擬記憶體檔案系統,既不同於傳統的用塊裝置形式來實現的Ramdisk,也不同於針對實體記憶體的ramfs,它可以使用實體記憶體,也可以使用交換分割槽。在Linux核心中,虛擬的記憶體資源由實體記憶體(RAM)和交換分割槽(swap)組成,這些資源是由核心中的虛擬記憶體子系統來負責分配和管理。tmpfs向虛擬記憶體子系統請求頁來儲存檔案,它同Linux的其它請求頁的部分一樣,不知道分配給自己的頁是在記憶體中還是在交換分割槽中。同ramfs一樣,tmpfs的大小隨著所需要的空間而動態的增減。Linux預設的/dev/shm即是採用tmpfs檔案系統,大小預設為實體記憶體的一半。在編譯核心時須將File systems -->> pseudofilesystems -->>  Virtual memoryfile system support支援選上。

(1)建立掛載點並掛載tmpfs

root# mkdir -p /mnt/tmpfs 

root# mount tmpfs /mnt/tmpfs -t tmpfs 

同樣可以在載入時指定tmpfs檔案系統大小的最大限制: 

root# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m

(2)在/dev/shm下使用dd命令建立虛擬塊裝置檔案

個人理解認為/dev/shm就是系統按照(1)建立好的tmpfs,因此可以直接基於該目錄使用tmpfs。

ddif=/dev/zero of=/dev/shm/ramdisk0 bs=1M seek=5120 count=0

檢視建立的塊裝置檔案大小

ll  /dev/shm/ramdisk0

檢視塊裝置檔案實際佔用的空間大小,seek引數是略過n個塊不寫

du-m /dev/shm/ramdisk0