linux中ramdisk的使用
? 內存盤的存取速度要遠快于目前的物理硬盤,可以被用作需要高速讀寫的文件。像WEB服務器這樣的計算機,需要大量的讀取和交換特定的文件,因此,在WEB服務器上建立RamDisk會大大提高網絡讀取速度。注意:在2.6版本后,Ramdisk的這一作用開始被tmpfs(Virtual memory file system support)取代。tmpfs 就像虛擬磁盤(RamDisk),但不一樣。像虛擬磁盤一樣,tmpfs 可以使用 RAM,但也可以使用交換分區來存儲。
而傳統的虛擬磁盤是個塊設備,并且需要格式化才能真正地使用,tmpfs 是一個文件系統,而不是塊設備,只要安裝,它就可以使用了。???
????????????????為了能夠使用RAMdisk你的內核必須要支持RAM disk,即:在編譯內核時,要選中RAM disk support這一選項,會在配置文件中定義CONFIG_BLK_DEV_RAM。為了讓內核有能力在內核加載階段就能裝入RAMDISK,并運行其中的內容,要選中initial RAM disk(initrd) support選項,會在配置文件中定義CONFIG_BLK_DEV_INITRD。
?系統中已有的“內存盤”
?查看系統中有那些“內存盤”????? Linux內核默認創建了16個ramdisks。它們目前是未啟用的,不占用任何內存空間。這16個設備分別是/dev/ram0 -- /dev/ram15。雖然我們可以看到還有/dev/ram16 -- 19,但是它們默認是不可用的。 通過更改rd.c的配置,可以使系統支持的RAM disk的數量增加到255個。為了使用更多的RAM disk,我們可以使用“mknod ?/dev/ramX b 1 X”命令創建更多的RAM disk設備文件,并且通過chmod命令將他們的訪問權限改成我們想要的。?使用下面的命令查看:
[root]#?ls -l /dev/ram*
查看系統中內存盤的大小?[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
RAMDISK: Compressed image found at block 0
也就是說,默認的 RamDisk 是4MB的。?? 格式化RamDisk ? ? #一般是使用ext2文件系統格式化RANdisk,而在此之前,即使我們的電腦中有ramdisk*設備文件,他們是不占空間,沒有用處的,必須進行格式化之后才能使用。 ?接下來就需要做文件系統了,也就是格式化。RamDisk是臨時性的,所以沒有帶日志的文件系統的必要,所以我們一般做ext2就可以了:[root]# mke2fs -m 0 /dev/ram0 //使用ext2文件系統格式化ram0
mke2fs 的-m<百分比值>選項:指定給管理員保留扇區的比例。在這里,-m 0,即:不為管理員保留任何扇區,任何普通用戶都可以使用所有可用的空間。
?創建掛載點并掛載RamDisk
?現在,我們的 RamDisk 已經可以使用了,只需要再將它掛接到一個可訪問的目錄點:[root]# mkdir /mnt/rd[root]# mount /dev/ram0 /mnt/rd //將/dev/ram0掛載到/mnt/rd目錄下
我們來驗證一下,RamDisk是否已經掛在成功了:[root]# mount | grep ram0
/dev/ram0 on /mnt/rd type ext2 (rw)
[root]# df -h | grep ram0
/dev/ram0????????????? 16M?? 13K?? 16M?? 1
% /mnt/rd
使用RamDisk ?Now that it has been created, you can copy, move, delete, edit, and list files on the ramdisk exactly as if they were on a physical disk partiton.To unmount the ramdisk, simply enter the following:[root]# umount -v /mnt/rd
/dev/ram0 umounted
關于RAMdisk的使用的例子,這里給出一個很常見的用法:使用RamDisk做/tmp目錄.如果你的內存太多,那么可以將其中一部分做為/tmp目錄,這樣將大大提高你的系統執行速度。而且,/tmp將會在系統重新啟動時被刪除,多么愜意呀。
與RAMdisk有關的命令行參數: ? ramdisk_size=N ? 這個參數告訴RAM磁盤驅動將RAM磁盤的大小設置為N k,默認是4096(4 MB)。? RAM磁盤的大小會根據需要動態的增長,因此其大小有個上限加以限制以免它用光所有可用的內存而壞事。 ramdisk_size 這個參數實際是設置這個上限值的。我們可以通過命令:dmesg | grep RAMDISK來查看這個上限值。要注意的是,這個值在系統運行階段是不能再被修改的。盡管RAM磁盤的大小有個最大值,但我們可以指定需要使用的RAM磁盤的容量。比如,在本例中我們設為2MB。通過寫入RAM磁盤設備來創建。命令為dd if=/dev/zero of=/dev/ram0 bs=1k count=2048。當我們沒有指定需要使用的RAM磁盤的容量,而直接在其上掛載文件系統時,它的容量是其上限值。 load_ramdisk=N ?這個參數告訴內核是否要載入一個RAMDISK映像。 load_ramdisk ?=1時指定核心將軟盤載入內存。默認值是0,表示內核不要去載入RAMDISK映像。 prompt_ramdisk=N 此參數告訴內核是否要給你個提示要求插入含RAMDISK映像的軟盤。在只用一張軟盤的配置下RAMDISK映像與剛剛載入/啟動的核心在相同的軟盤上,故不需要提示,這種情況可以用 `prompt_ramdisk=0'。在使用兩張軟盤的配置下你需要交換軟盤,故可以使用 `prompt_ramdisk=1'。因為這是預設值,所以不必真的去指定它。
ramdisk_start=NNN
為了使內核映像能夠與壓縮的RAMDISK映像放在一張軟盤內,所以加入這個 `ramdisk_start=<offset>' 指令。? 內核不能夠放在壓縮過的RAMDISK磁盤的文件系統映像里,因為它得從最開始的第零磁區開始放置,這樣基本輸出入系統(BIOS)才能載入啟動磁區而內核也才能夠開始啟動執行。(參考Documentation/ramdisk.txt,但是我不太明白)????????? 注意:如果你使用的是沒有壓縮的RAMDISK磁盤映像,那么內核可以是要載入的RAMDISK磁盤的文件統映像的一部份,且該軟盤可以由 LILO 啟動,兩者也可以如同壓縮的映像那樣為分開的兩部份。 如果你使用啟動/根(boot/root)兩張磁盤的方式(內核一張,RAMDISK映像放第二張)那么RAMDISK磁盤會由第零磁區開始,并使用零作為偏移值(offset)。因為這是預設值,你根本不必真的去使用這個指令。? 使用"rdev -r"? ?命令“rdev –r”設置內核鏡像文件中的兩個字節(32bit),這兩個字節中各個位的含義如下:低11位(0 -> 10)指定了一個偏移量(以1K的塊為單位),最到能尋址到2M,用以指定到何處去尋找RAM磁盤。第14位指示RAM磁盤是否被加載。第15位指示是否在加載RAM磁盤之前給出一個提示并等待用戶指令。?如果隨著數據被寫入RAM磁盤,RAM磁盤的大小是動態增長的,那么指定RAM磁盤的大小的域將被忽略。11到13位沒有被使用,所以可以為0。?上面所列的數據并非什么秘密,可以在參照下列地方:?進入內核源碼所在目錄:./arch/i386/kernel/setup.c:#define RAMDISK_IMAGE_START_MASK 0x07FF./arch/i386/kernel/setup.c:#define RAMDISK_PROMPT_FLAG 0x8000./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000?考察一個典型的"兩張軟盤啟動",內核在第一張軟盤上,并且已經將一個RAM磁盤鏡像文件放到了第二張軟盤上。?所以你希望將0到13位設置為0,這將意為著你的RAM磁盤處于從軟盤起始地址偏移量為0KB的地方。相同功能的命令行參數為:"ramdisk_start=0"?你希望第14位為1,即聲明加載RAM磁盤。相同功能的命令行參數為:"load_ramdisk=1?你希望第15位為1,這是聲明希望顯示一個提示并等待用戶的按鍵以得到一個提示機會來更換軟盤。形同功能的命令行參數為:"prompt_ramdisk=1"?將上述的標志位綜合在一起得到:2^15 + 2^14 + 0 = 49152作為參數傳遞給rdev用來設置內核鏡像里的兩個字節。所以如果創建上述的第一個磁盤,你需要進行如下操作:/usr/src/linux# cat arch/i386/boot/zImage > /dev/fd0/usr/src/linux# rdev /dev/fd0 /dev/fd0/usr/src/linux# rdev -r /dev/fd0 49152?如果你創建一個使用了lilo的啟動磁盤,為了得到上面說明的那些效果,你需要使用下列lilo的參數:append = "ramdisk_start=0 load_ramdisk=1prompt_ramdisk=1"考慮到默認的start = 0和prompt = 1,你可以簡化lilo的命令行參數為:append = "load_ramdisk=1"? 一個創建壓縮RAM磁盤的例子: ?為了創建一個RAM磁盤的鏡像,你需要你一個單獨的塊設備。這個塊設備可以是一個RAM磁盤設備本身,也可以是一個未使用的磁盤分區(比如一個沒有被掛載的交換分區)。在這個例子中,我們將使用RAM磁盤設備:"/dev/ram0"。?a)確定你希望使用的RAM磁盤的容量?比如,在本例中我們設為2MB。通過寫入RAM磁盤設備來創建。最好寫入0,這樣下一步創建鏡像時進行最大比例壓縮的時候比較方便壓縮未使用的塊。命令為:dd if=/dev/zero of=/dev/ram0 bs=1k count=2048?b)創建一個文件系統。在本例中使用ext2fs。命令為:mke2fs -vm0 /dev/ram0 2048?c)掛載這個磁盤設備?無論是一個RAM磁盤設備,還是一個單獨的分區,向里面拷貝你需要的文件(比如:/etc/* /dev/* ...)。然后卸載這個設備(umount)。?d)壓縮這個RAM磁盤鏡像。?壓縮之后,被實際使用的空間大約能壓縮到原來的50%,并且未被使用的空間幾乎被完全壓縮到0。命令為:dd if=/dev/ram0 bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz?e)將內核放入軟盤。?命令為:dd if=zImage of=/dev/fd0 bs=1k?f)將RAM磁盤鏡像放入軟盤。?使用一個比內核所占空間略大的偏移量。之所以要有一個略大的偏移量,可以方便以后更換內核,而不會覆蓋到RAM磁盤的鏡像。比如,如果內核占用了350KB,那么寫入RAM磁盤鏡像的時候使用400KB的偏移量是比較合理的。注意:確定"偏移量+RAM磁盤鏡像的體積"不會超出軟盤的容量(通常是1440KB)。命令為:dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400?g)使用rdev命令設置啟動設備,RAM磁盤偏移量,是否提示換磁盤標志,等等。?比如設置:prompt_ramdisk=1, load_ramdisk=1,ramdisk_start=400,這些標志時,可以計算出來:2^15 + 2^14 + 400 = 49552,使用的命令可能為:rdev /dev/fd0 /dev/fd0rdev -r /dev/fd0 49552?到此為止,你已經獲得了你自己的啟動/根壓縮RAM磁盤(軟盤),你也可以將步驟d和步驟f通過管道一步執行。總結
以上是生活随笔為你收集整理的linux中ramdisk的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Xlib库进行基本图形编程
- 下一篇: 交叉编译tinyx