ramdisk

1Ram 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 -> ram1
brw-rw----    1 root     disk       1,   0 Jan 30  2003 /dev/ram0
brw-rw----    1 root     disk       1,   1 Jan 30  2003 /dev/ram1
brw-rw----    1 root     disk       1,  10 Jan 30  2003 /dev/ram10
brw-rw----    1 root     disk       1,  11 Jan 30  2003 /dev/ram11
brw-rw----    1 root     disk       1,  12 Jan 30  2003 /dev/ram12
brw-rw----    1 root     disk       1,  13 Jan 30  2003 /dev/ram13
brw-rw----    1 root     disk       1,  14 Jan 30  2003 /dev/ram14
brw-rw----    1 root     disk       1,  15 Jan 30  2003 /dev/ram15
brw-rw----    1 root     disk       1,  16 Jan 30  2003 /dev/ram16
brw-rw----    1 root     disk       1,  17 Jan 30  2003 /dev/ram17
brw-rw----    1 root     disk       1,  18 Jan 30  2003 /dev/ram18
brw-rw----    1 root     disk       1,  19 Jan 30  2003 /dev/ram19
brw-rw----    1 root     disk       1,   2 Jan 30  2003 /dev/ram2
brw-rw----    1 root     disk       1,   3 Jan 30  2003 /dev/ram3
brw-rw----    1 root     disk       1,   4 Jan 30  2003 /dev/ram4
brw-rw----    1 root     disk       1,   5 Jan 30  2003 /dev/ram5
brw-rw----    1 root     disk       1,   6 Jan 30  2003 /dev/ram6
brw-rw----    1 root     disk       1,   7 Jan 30  2003 /dev/ram7
brw-rw----    1 root     disk       1,   8 Jan 30  2003 /dev/ram8
brw-rw----    1 root     disk       1,   9 Jan 30  2003 /dev/ram9
lrwxrwxrwx    1 root     root            4 Jun 12 00:31 /dev/ramdisk -> ram0
 
3.1.1 查看系統中內存盤的大小
 
[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
RAMDISK: Compressed image found at block 0
也就是說,默認的 RamDisk 是4MB的。
 
 
3.2 格式化RamDisk
 
接下來就需要做文件系統了,也就是格式化。RamDisk是臨時性的,所以沒有帶日誌的文件系統的必要,所以我們一般做 ext2 就可以了:
[root]# mke2fs -m 0 /dev/ram0
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
4000 inodes, 16000 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
2 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks:8193
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 22 mounts or
180 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=<offset>' 指令。
 
內核不能夠放在壓縮過的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 -vm 0 /dev/ram0 2048
 
c)掛載這個磁盤設備
 
無論是一個RAM磁盤設備,還是一個單獨的分區,向裏面拷貝你需要的文件(比如:/etc/* /dev/* ...)。然後卸載這個設備(umount)。mount /dev/ram0 /tmp/ramdisk0   umount /tmp/ramdisk1
 
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通過管道一步執行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章