Linux中ramdisk的使用【轉】


linux RamDisk 使用簡介
1、Ram Disk介紹
1.1   什么是Ram Disk

Ram Disk 就是將內存中的一塊區域作為物理磁盤來使用的一種技術。

對於用戶來說,可以把RAM disk與通常的硬盤分區(如/dev/hda1)同等對待來使用。

1.2    Ramdisk與硬盤分區的不同
RAM disk不適合作為長期保存文件的介質,掉電后Ramdisk的內容會隨內存內容的消失而消失。
RAM disk的其中一個優勢是它的讀寫速度高,內存盤的存取速度要遠快於目前的物理硬盤,可以被用作需要高速讀寫的文件。
注意:在2.6版本后,Ramdisk的這一作用開始被tmpfs(Virtual memory file system support)取代。   

1.3    Ramdisk的作用

內存盤對於保存加密數據來說是一個福音,因為我們如果將加密的文件解密到普通磁盤的話,即使我們隨后刪除了解密文件,數據仍然會留在磁盤上。這樣是非常不安全的。而對於 RamDisk 來說,沒有這樣的問題。

假設有幾個文件要頻繁的使用,你如果將它們加到內存當中,程序運行速度會大副提高,因為內存的讀寫速度遠高於硬盤。
    
象WEB服務器這樣的計算機,需要大量的讀取和交換特定的文件,因此,在WEB服務器上建立RamDisk會大大提高網絡讀取速度。

RAM disks can be a great place to store temporary data.

2、前提條件

       為了能夠使用RAM disk 你的內核必須要支持RAM disk,即:在編譯內核時,要選中RAM disk support這一選項,會在配置文件中定義CONFIG_BLK_DEV_RAM。
       為了讓內核有能力在內核加載階段就能裝入RAMDISK,並運行其中的內容,要選中initial RAM disk(initrd) support 選項,會在配置文件中定義CONFIG_BLK_DEV_INITRD。

3、操作步驟:

3.1系統中已有的“內存盤”

3.1.1 查看系統中有那些“內存盤”

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*lrwxrwxrwx    1 root     root            4 Jun 12 00:31 /dev/ram -> ram1brw-rw----    1 root     disk       1,   0 Jan 30  2003 /dev/ram0brw-rw----    1 root     disk       1,   1 Jan 30  2003 /dev/ram1brw-rw----    1
root     disk       1,  10 Jan 30  2003 /dev/ram10brw-rw----    1 root     disk       1,  11 Jan 30  2003 /dev/ram11brw-rw----    1 root     disk       1,  12 Jan 30  2003 /dev/ram12brw-rw----    1 root     disk       1,  13 Jan 30  2003 /dev/ram13brw-rw----   
1 root     disk       1,  14 Jan 30  2003 /dev/ram14brw-rw----    1 root     disk       1,  15 Jan 30  2003 /dev/ram15brw-rw----    1 root     disk       1,  16 Jan 30  2003 /dev/ram16brw-rw----    1 root     disk       1,  17 Jan 30  2003 /dev/ram17brw-rw----   
1 root     disk       1,  18 Jan 30  2003 /dev/ram18brw-rw----    1 root     disk       1,  19 Jan 30  2003 /dev/ram19brw-rw----    1 root     disk       1,   2 Jan 30  2003 /dev/ram2brw-rw----    1 root     disk       1,   3 Jan 30  2003 /dev/ram3brw-rw----   
1 root     disk       1,   4 Jan 30  2003 /dev/ram4brw-rw----    1 root     disk       1,   5 Jan 30  2003 /dev/ram5brw-rw----    1 root     disk       1,   6 Jan 30  2003 /dev/ram6brw-rw----    1 root     disk       1,   7 Jan 30  2003 /dev/ram7brw-rw----   
1 root     disk       1,   8 Jan 30  2003 /dev/ram8brw-rw----    1 root     disk       1,   9 Jan 30  2003 /dev/ram9lrwxrwxrwx    1 root     root            4 Jun 12 00:31 /dev/ramdisk -> ram0

3.1.1 查看系統中內存盤的大小

[root]# dmesg | grep RAMDISKRAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksizeRAMDISK: Compressed image found at block 0
也就是說,默認的 RamDisk 是4MB的。

3.2 格式化RamDisk

接下來就需要做文件系統了,也就是格式化。RamDisk是臨時性的,所以沒有帶日志的文件系統的必要,所以我們一般做 ext2 就可以了:
[root]# mke2fs -m 0 /dev/ram0mke2fs 1.32 (09-Nov-2002)Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)4000 inodes, 16000 blocks0 blocks (0.00%) reserved for the super userFirst data block=12 block groups8192 blocks per group,
8192 fragments per group2000 inodes per groupSuperblock backups stored on blocks:8193Writing inode tables: doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 22 mounts or180 days, whichever
comes first.  Use tune2fs -c or -i to override.

mke2fs 的-m百分比值>選項:指定給管理員保留扇區的比例。在這里,-m 0,即:不為管理員保留任何扇區,任何普通用戶都可以使用所有可用的空間。

3.3 創建掛載點並掛載 RamDisk

現在,我們的 RamDisk 已經可以使用了,只需要再將它掛接到一個可訪問的目錄點:
[root]# mkdir /mnt/rd[root]# mount /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

 

3.4 使用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

4、與RAMdisk有關的命令行參數:

4.1 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磁盤的容量,而直接在其上掛載文件系統時,它的容量是其上限值。

4.2 load_ramdisk=N

       這個參數告訴內核是否要載入一個RAMDISK映像。load_ramdisk =1時指定核心將軟盤載入內存。默認值是0,表示內核不要去載入RAMDISK映像。
4.3 prompt_ramdisk=N

此參數告訴內核是否要給你個提示要求插入含RAMDISK映像的軟盤。

在只用一張軟盤的配置下RAMDISK映像與剛剛載入/啟動的核心在相同的軟盤上,故不需要提示,這種情況可以用 `prompt_ramdisk=0'。

在使用兩張軟盤的配置下你需要交換軟盤,故可以使用 `prompt_ramdisk=1'。因為這是預設值,所以不必真的去指定它。

4.4 ramdisk_start=NNN

為了使內核映像能夠與壓縮的RAMDISK映像放在一張軟盤內,所以加入這個 `ramdisk_start=' 指令。

內核不能夠放在壓縮過的RAMDISK磁盤的文件系統映像里,因為它得從最開始的第零磁區開始放置,這樣基本輸出入系統(BIOS)才能載入啟動磁區而內核也才能夠開始啟動執行。(參考Documentation/ramdisk.txt,但是我不太明白)?????????
注意:如果你使用的是沒有壓縮的RAMDISK磁盤映像,那么內核可以是要載入的RAMDISK磁盤的文件統映像的一部份,且該軟盤可以由 LILO 啟動,兩者也可以如同壓縮的映像那樣為分開的兩部份。

如果你使用啟動/根(boot/root)兩張磁盤的方式(內核一張,RAMDISK映像放第二張)那么RAMDISK磁盤會由第零磁區開始,並使用零作為偏移值(offset)。因為這是預設值,你根本不必真的去使用這個指令。

5、使用"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=1
prompt_ramdisk=1"考慮到默認的start = 0和prompt = 1,你可以簡化lilo的命令行參數為:
append = "load_ramdisk=1"

6、一個創建壓縮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/fd0
rdev -r /dev/fd0 49552

到此為止,你已經獲得了你自己的啟動/根壓縮RAM磁盤(軟盤),你也可以將步驟d和步驟f通過管道一步執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM