儘管固態硬碟(SSD)的讀寫效能已經是機械式硬碟(HDD)的好幾倍,但依然還是遠遠不及RAM(Random-access memory)的存取速度。將RAM模擬成硬碟,製成RAMDisk,除了可以有效增加RAM的使用率外,還可以加強RAMDisk內檔案的存取速度,電腦關機或重開機也還會自動將RAMDisk清空,不留下任何痕跡。



Linux系統演進至今,已經發展出三種RAMDisk的機制。第一種就是傳統固定大小,需要指定檔案系統並進行格式化的「ramdisk」,第二種是可變大小,直接使用VFS(Virtual file system, 虛擬檔案系統)來操作檔案而無需格式化的ramfs。第三種如同第二種的ramfs,但它能使用的空間不只限於RAM內,還可以使用交換分區(SWAP),稱作tmpfs

以下將針對這三者分別介紹:

ramdisk

ramdisk的配置存在於Linux的Kernel(核心),Linux預設提供8個或16個ramdisk讓使用者掛載使用,每個ramdisk的路徑可以使用以下指令來查看:

ls /dev/ram*

linux-ramdisk

如果您沒看到/dev/ram相關裝置,可能是因為您的Linux Kernel並沒有載入brd(block ram disk)模組。可以執行sudo modprobe brd指令來載入。

每個ramdisk預設的大小在不同的Linux系統上似乎都不太一樣,但普遍不大,小於128MB,ramdisk的大小可以藉由GRUB開機管理程式來設定Linux Kernel的參數來改變。可以使用文字編輯器開啟/etc/default/grub,在GRUB_CMDLINE_LINUX中加入ramdisk_size參數,並設定ramdisk的大小的數值,以KB為單位。如果還有其他參數,以空隔分隔。如以下設定方式,可以讓每個ramdisk擁有512MB的空間:

GRUB_CMDLINE_LINUX="ramdisk_size=512000"

linux-ramdisk

修改完畢後儲存檔案,再使用以下指令來更新GRUB。

sudo grub-mkconfig -o /boot/grub/grub.cfg

linux-ramdisk

ramdisk必須要經過格式化之後來掛載使用,ramdisk常用的檔案系統為ext2,當然如果您想要使用ext4也行。使用mkfs指令可以進行檔案系統的格式化。格式如下:

sudo mkfs -t 檔案系統 裝置路徑

例如將/dev/ram0格式化成ext2:

sudo mkfs -t ext2 /dev/ram0

linux-ramdisk

例如將/dev/ram1格式化成ext4:

sudo mkfs -t ext4 /dev/ram1

linux-ramdisk

將ramdisk格式化之後,必須要掛載才能使用,首先先創建一個ramdisk掛載目錄,以/mnt/ramdisk為例,先使用mkdir指令來建立目錄:

sudo mkdir /mnt/ramdisk

linux-ramdisk

接著使用mount指令將ramdisk掛載到/mnt/ramdisk目錄,例如要掛載/dev/ram0的話,就使用以下指令:

sudo mount /dev/ram0 /mnt/ramdisk

linux-ramdisk

如果要卸載ramdisk,可以使用umount指令,例如要卸載/mnt/ramdisk目錄:

sudo umount /mnt/ramdisk

linux-ramdisk

可以使用以下指令來查看目前系統的掛載狀況:

df -h -T

參數-h表示顯示以可讀的單位(MB、GB等)來顯示容量大小,參數-T表示顯示檔案系統。

linux-ramdisk

無論ramdisk是掛載還是卸載狀態,一旦ramdisk經過格式化,就會佔用掉檔案系統所需的記憶體空間,如果有放置檔案,會佔用更多用來存放檔案的記憶體空間。換句話說,ramdisk並不會在一開始格式化時就配置等量的記憶體空間,而是隨著使用情況來慢慢增加。

ramfs

ramfs不像ramdisk那樣一定得固定大小,在這裡所講的固定大小是指Linux預設的16個ramdisk的大小都是固定的,使用者可以自由掛載任意數量的ramfs,它們的大小會動態增長。且又因為ramfs是直接使用VFS(Virtual file system, 虛擬檔案系統)來操作檔案,因此無需格式化。

如果要掛載ramfs,必須要使用一個目錄,以/mnt/ramfs為例,先使用mkdir指令來建立目錄:

sudo mkdir /mnt/ramfs

linux-ramdisk

接著再使用mount指令來將ramfs掛載到/mnt/ramfs,可以使用以下指令:

sudo mount -t ramfs ramfs /mnt/ramfs

linux-ramdisk

ramfs似乎是無法限制大小,請小心使用。

卸載ramfs的方式和ramdisk一樣,都可以使用umount指令,例如要卸載/mnt/ramfs目錄:

sudo umount /mnt/ramfs

linux-ramdisk

卸載後,ramfs所佔用的記憶體會自動釋放出來。ramfs掛載的目錄使用df指令無法正常顯示,不太受控制,建議還是使用下面要提的tmpfs。

tmpfs

tmpfs和ramfs類似,只不過tmpfs還可以使用到交換分區(SWAP)的空間,這樣就不用太擔心tmpfs佔用空間太大會使得RAM吃滿造成系統出問題。

如果要掛載tmpfs,必須要使用一個目錄,以/mnt/tmpfs為例,先使用mkdir指令來建立目錄:

sudo mkdir /mnt/tmpfs

linux-ramdisk

接著再使用mount指令來將tmpfs掛載到/mnt/tmpfs,可以使用以下指令:

sudo mount -t tmpfs tmpfs /mnt/tmpfs

linux-ramdisk

預設的tmpfs大小為總RAM的一半,如果要自訂tmpfs的大小,可以加上-o size參數,例如以下將tmpfs指定為5GB:

sudo mount -t tmpfs tmpfs /mnt/tmpfs -o size=5120m

linux-ramdisk

卸載tmpfs的方式和ramdisk一樣,都可以使用umount指令,例如要卸載/mnt/tmpfs目錄:

sudo umount /mnt/tmpfs

linux-ramdisk

可以使用以下指令來查看目前系統的掛載狀況:

df -h -T

參數-h表示顯示以可讀的單位(MB、GB等)來顯示容量大小,參數-T表示顯示檔案系統。

linux-ramdisk

如果tmpfs有放置檔案,才會配置記憶體空間來存放檔案。換句話說,tmpfs並不會在一開始掛載時就配置等量的記憶體空間,而是隨著使用情況來慢慢增加。tmpfs似乎是使用記憶體的Cache空間,因此會造成tmpfs裡明明就放置了愈來愈多的檔案,但是系統所顯示的可用記憶體量卻沒有減少,這點在使用tmpfs時需要注意。tmpfs所佔掉的Cache空間,並不能夠讓其他程序拿去使用,也不會主動釋放,除非將tmpfs內的檔案刪除,或是卸載tmpfs,才可以釋放記憶體。

Linux系統真的需要自己加上RAMDisk嗎?

現在電腦所配備的RAM愈來愈大,但是在一般用途上也許不會使用到這麼多,造成記憶體過剩的浪費。別的作業系統不提,在Linux系統有內建Page Cache和Buffer Cache的機制,能夠有效使用記憶體來提升檔案的存取速度,所以說Linux系統其實也不太需要自行加入RAMdisk,系統自己就會想辦法幫使用者填滿記憶體了。

Linux在讀寫檔案的時候,會使用一套演算法把使用者常用的檔案給Cache(快取)到記憶體中,記憶體中的Cache在RAM還沒被使用完的情況下是可以無限成長的,但是一旦遇到其他程式需要使用到記憶體,而且目前記憶體不太足夠時,系統就會自動釋放掉不常使用的Cache,讓其他程式使用。如果使用者自行使用RAMDisk當Cache,反而還會讓系統重複Cache,導致記憶體佔用更多,性能下降。

Linux在寫入檔案到硬碟之前,會先將檔案存入Buffer(緩衝)中,再一批一批地寫入,能有效加速檔案的寫入。

在終端機下輸入以下指令,可以查看目前的記憶體使用狀況:

free

linux-ramdisk

如果要自訂單位,可以使用-b-k-m-g等參數。

linux-ramdisk