儘管固態硬碟(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的路徑可以使用以下指令來查看:
如果您沒看到/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。
ramdisk必須要經過格式化之後來掛載使用,ramdisk常用的檔案系統為ext2,當然如果您想要使用ext4也行。使用mkfs指令可以進行檔案系統的格式化。格式如下:
例如將/dev/ram0
格式化成ext2:
例如將/dev/ram1
格式化成ext4:
將ramdisk格式化之後,必須要掛載才能使用,首先先創建一個ramdisk掛載目錄,以/mnt/ramdisk
為例,先使用mkdir
指令來建立目錄:
接著使用mount
指令將ramdisk掛載到/mnt/ramdisk
目錄,例如要掛載/dev/ram0
的話,就使用以下指令:
如果要卸載ramdisk,可以使用umount
指令,例如要卸載/mnt/ramdisk
目錄:
可以使用以下指令來查看目前系統的掛載狀況:
參數-h
表示顯示以可讀的單位(MB、GB等)來顯示容量大小,參數-T
表示顯示檔案系統。
無論ramdisk是掛載還是卸載狀態,一旦ramdisk經過格式化,就會佔用掉檔案系統所需的記憶體空間,如果有放置檔案,會佔用更多用來存放檔案的記憶體空間。換句話說,ramdisk並不會在一開始格式化時就配置等量的記憶體空間,而是隨著使用情況來慢慢增加。
ramfs
ramfs不像ramdisk那樣一定得固定大小,在這裡所講的固定大小是指Linux預設的16個ramdisk的大小都是固定的,使用者可以自由掛載任意數量的ramfs,它們的大小會動態增長。且又因為ramfs是直接使用VFS(Virtual file system, 虛擬檔案系統)來操作檔案,因此無需格式化。
如果要掛載ramfs,必須要使用一個目錄,以/mnt/ramfs
為例,先使用mkdir
指令來建立目錄:
接著再使用mount
指令來將ramfs掛載到/mnt/ramfs
,可以使用以下指令:
ramfs似乎是無法限制大小,請小心使用。
卸載ramfs的方式和ramdisk一樣,都可以使用umount
指令,例如要卸載/mnt/ramfs
目錄:
卸載後,ramfs所佔用的記憶體會自動釋放出來。ramfs掛載的目錄使用df指令無法正常顯示,不太受控制,建議還是使用下面要提的tmpfs。
tmpfs
tmpfs和ramfs類似,只不過tmpfs還可以使用到交換分區(SWAP)的空間,這樣就不用太擔心tmpfs佔用空間太大會使得RAM吃滿造成系統出問題。
如果要掛載tmpfs,必須要使用一個目錄,以/mnt/tmpfs
為例,先使用mkdir
指令來建立目錄:
接著再使用mount
指令來將tmpfs掛載到/mnt/tmpfs
,可以使用以下指令:
預設的tmpfs大小為總RAM的一半,如果要自訂tmpfs的大小,可以加上-o size
參數,例如以下將tmpfs指定為5GB:
卸載tmpfs的方式和ramdisk一樣,都可以使用umount
指令,例如要卸載/mnt/tmpfs
目錄:
可以使用以下指令來查看目前系統的掛載狀況:
參數-h
表示顯示以可讀的單位(MB、GB等)來顯示容量大小,參數-T
表示顯示檔案系統。
如果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(緩衝)中,再一批一批地寫入,能有效加速檔案的寫入。
在終端機下輸入以下指令,可以查看目前的記憶體使用狀況:
如果要自訂單位,可以使用-b
、-k
、-m
、-g
等參數。