Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹


儘管固態硬碟(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的配置存在於LinuxKernel(內核),Linux預設提供16個ramdisk讓使用者掛載使用,每個ramdisk的路徑可以使用以下指令來查看:

ls /dev/ram*

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

每個ramdisk預設的大小在不同的Linux系統上似乎都不太一樣,但普遍不大,小於128MB,ramdisk的大小可以藉由GRUB開機管理程式來設定Linux Kernel的參數來改變。可以使用類似以下的指令來用文字編輯器開啟「/etc/default/grub」:

sudo pluma /etc/default/grub

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

GRUB_CMDLINE_LINUX中加入ramdisk_size參數,並設定ramdisk的大小的數值,以KB為單位。如果還有其他參數,以空隔分隔。如以下設定方式,可以讓每個ramdisk擁有512MB的空間:

GRUB_CMDLINE_LINUX="ramdisk_size=512000"

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

sudo update-grub

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

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

例如將「/dev/ram0」格式化成ext2

sudo mkfs -t ext2 /dev/ram0

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

例如將「/dev/ram1」格式化成ext4

sudo mkfs -t ext4 /dev/ram1

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

mkdir /mnt/ramdisk

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

sudo mount /dev/ram0 /mnt/ramdisk

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

sudo umount /mnt/ramdisk

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

其實也不一定要建立目錄再使用mount指令來掛載ramdisk,因為ramdisk其實就像是一個擁有固定大小的儲存裝置一樣,可以直接使用檔案瀏覽器來快速掛載與卸載,在一次開很多個ramdisk的時候還蠻好用的。

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

df -h -T

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

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

ramfs

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

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

mkdir /mnt/ramfs

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

sudo mount -t ramfs ramfs /mnt/ramfs

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

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

sudo umount /mnt/ramfs

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

tmpfs

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

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

mkdir /mnt/tmpfs

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

sudo mount -t tmpfs tmpfs /mnt/tmpfs

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

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

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

sudo umount /mnt/tmpfs

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

df -h -T

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

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

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

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

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

Linux在寫入檔案到硬碟之前,會先將檔案存入Buffer(緩衝)中,再一批一批地寫入,能有效加速檔案的寫入。但是這樣的作法可能會使得電腦發生意外時(突然斷電、突然當機)檔案容易遺失,因此Buffer通常不會太大,最多不過幾十MB而已。

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

free

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

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

Linux如何將記憶體(RAM)作為硬碟使用?RAMDisk詳細介紹

關於作者

Magic Len

各位好,我是Magic Len,是這網站的管理員。我是台灣台中大肚山上人,畢業於台中高工資訊科和台灣科技大學資訊工程系,曾在桃機航警局服役。我熱愛自然也熱愛科學,喜歡和別人分享自己的知識與經驗。如果你有興趣認識我,可以加我的Facebook,並且請註明是從MagicLen來的。

相關文章