Linux中的Ramdisk和Initrd
Ramdisk簡(jiǎn)介
先簡(jiǎn)單介紹一下ramdisk,Ramdisk是虛擬于RAM中的盤(pán)(Disk)。對(duì)于用戶(hù)來(lái)說(shuō),能把RAM disk和通常的硬盤(pán)分區(qū)(如/dev/hda1)同等對(duì)待來(lái)使用,例如:
redice # mkfs.ext2 /dev/ram0
mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
2048 inodes, 8192 blocks
409 blocks (4.99%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.??Use tune2fs -c or -i to override.
redice # mount /dev/ram0 /mnt/rd
redice # ls /mnt/rd
lost+found
redice # mount
/dev/hda2 on / type ext3
proc on /proc type proc (rw)
/dev/ram0 on /tmp/xxx type ext2 (rw)
當(dāng)然,Ramdisk和硬盤(pán)分區(qū)有其不同的地方,例如RAM disk不適合作為長(zhǎng)期保存文件的介質(zhì),掉電后Ramdisk的內(nèi)容會(huì)隨內(nèi)存內(nèi)容的消失而消失。Ramdisk的其中一個(gè)優(yōu)勢(shì)是他的讀寫(xiě)速度高,能被用作需要高速讀寫(xiě)的文件。但在2.6版本后,Ramdisk的這一作用開(kāi)始被tmpfs(Virtual memory file system support)取代。
回到上面的例子,我們格式化了一個(gè)ramdisk(/dev/ram0)并且將其mount到/mnt/rd目錄下,那么這個(gè)Ramdisk有多大呢?先看一下:
redice # df -h /dev/ram2
Filesystem????????????容量??已用 可用 已用% 掛載點(diǎn)
/dev/ram0?????????????7.8M??1.0K??7.4M???1% /mnt/rd
從上面的信息看出,ramdisk有大約7.8M的可用空間。我們?cè)僭囈幌铝硗獾奈募到y(tǒng),重新格式化成minix分區(qū)并掛接試一下:
redice # umount /mnt/rd
redice # mkfs.minix /dev/ram0
2752 inodes
8192 blocks
Firstdatazone=90 (90)
Zonesize=1024
Maxsize=268966912
redice # mount /dev/ram0 /mnt/rd
redice # df -h /dev/ram0
Filesystem????????????容量??已用 可用 已用% 掛載點(diǎn)
/dev/ram0?????????????8.0M??1.0K??8.0M???1% /mnt/rd
目前看出來(lái)了,的確是8M(這同時(shí)說(shuō)明,EXT2文件系統(tǒng)本身要占用一定的存儲(chǔ)空間,相比之下minix文件系統(tǒng)要少些),這個(gè)空間是在編譯核心時(shí)就確定下來(lái)了,在設(shè)置Ramdisk時(shí),有一個(gè)叫?Default RAM disk size?的參數(shù)決定默認(rèn)情況下Ramdisk的大小。能通過(guò)核心命令行參數(shù)(ramdisk_size)來(lái)改動(dòng)這個(gè)值,例如要設(shè)置Ramdisk的大小為16M,在grub中能用:
# grub.conf -
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Redice Linux
????????root (hd0,0)
????????kernel /vmlinuz ro root=LABEL=/ hdc=ide-scsi ramdisk_size=16384
????????initrd /initrd
這樣,Ramdisk的大小就變成16M了。這個(gè)參數(shù)是Ramdisk直接編譯到核心時(shí)才能使用的,如果Ramdisk編譯為模塊,則應(yīng)該使用模塊參數(shù)來(lái)設(shè)置Ramdisk的大小:
redice # insmod rd rd_size=16384
編譯到核心時(shí),能通過(guò)下面的一些核心命令行參數(shù)來(lái)設(shè)置Ramdisk:
ramdisk_size - ramdisk的大小(Kbytes);
ramdisk - 和ramdisk_size的作用相同;
ramdisk_blocksize - ramdisk的塊大小,默認(rèn)情況為1024;
當(dāng)以模塊的形式譯時(shí),模塊支持以下幾個(gè)加載參數(shù):
rd_size - 同上面的ramdisk_size或ramdisk參數(shù);
rd_blocksize - 同上面的ramdisk_blocksize;
initrd
上面已提到,Ramdisk需要先格式化然后理能使用。那么,如果核心希望使用ramdisk該怎么做呢?于是initrd產(chǎn)生了,initrd全稱(chēng)是?initial RAM disk?,他提供一種讓核心能簡(jiǎn)單使用Ramdisk的能力,簡(jiǎn)單的說(shuō),這些能力包括:
格式化一個(gè) Ramdisk;
加載文件系統(tǒng)內(nèi)容到Ramdisk;
將Ramdisk作為根文件系統(tǒng);
我們能將initrd形像的比作
Norton Ghost
備份的硬盤(pán)分區(qū),而Linux啟動(dòng)階段的Ramdisk相當(dāng)于一個(gè)未格式化的硬盤(pán)分區(qū),核心能直接將initrd的內(nèi)容釋放到一個(gè)未初始化的Ramdisk里,這個(gè)過(guò)程和Ghost恢復(fù)一個(gè)分區(qū)的過(guò)程十分相似。于是,相應(yīng)的內(nèi)容被加載到相應(yīng)的Ramdisk中,同時(shí),這個(gè)Ramdisk也被格式化成某種由initrd格式所表達(dá)的分區(qū)格式。
initrd和Ghost備份的分區(qū)有許多相似之處,例如,他有一定的大小,包含分區(qū)上的文件系統(tǒng)格式等。initrd支持的格式包括:
Ext2文件系統(tǒng);
Romfs文件系統(tǒng);
cramfs文件系統(tǒng);
minix文件系統(tǒng);
如果核心選擇了Gzip支持(通常這是默認(rèn)的,在init/do_mounts_rd.c中定義的BUILD_CRAMDISK宏)還能使用Gzip壓縮的initrd。相關(guān)的代碼能在核心源碼?drivers/block/rd.c:identify_ramdisk_image?中找到。
制作initrd
制作initrd傳統(tǒng)的作法是通過(guò)軟盤(pán)(顯然過(guò)時(shí)了,不介紹了)、ramdisk或loop設(shè)備(/dev/loop)。通過(guò)ramdisk來(lái)制作的方法比較簡(jiǎn)單(以ext2文件系統(tǒng)為例):
redice # mkfs.ext2 /dev/ram0
redice # mount /dev/ram0 /mnt/rd
redice # cp _what_you_like_??/mnt/rd????# 把需要的文件復(fù)制過(guò)去
redice # dd if=/dev/ram0 of=/tmp/initrd
redice # gzip -9 /tmp/initrd
這個(gè)過(guò)程也最能夠解釋initrd的本質(zhì),對(duì)于Linux來(lái)說(shuō),Ramdisk的一個(gè)塊設(shè)備,而initrd是這個(gè)塊設(shè)備上所有內(nèi)容的“克隆”(由命令dd來(lái)完成)而生成的文件。核心中加載initrd相關(guān)的代碼則用于完成將相反的過(guò)程,即將這一個(gè)文件恢復(fù)到Ramdisk中去。
通過(guò)loop設(shè)備來(lái)制作initrd的過(guò)程:
redice # dd if=/dev/zero of=/tmp/initrd bs=1024 count=4096 # 制作一個(gè)4M的空白文件
redice # losetup /dev/loop0 /tmp/initrd????????????????????# 映射到loop設(shè)備上;
redice # mkfs.ext2 /dev/loop0??????????????????????????????# 創(chuàng)建文件系統(tǒng);
redice # mount /dev/loop0 /mnt/rd
redice # cp _what_you_like_ /mnt/rd????????????????????????# 復(fù)制需要的文件;
redice # umount /mnt/rd
redice # losetup -d /dev/loop0
redice # gzip -9 /tmp/initrd
不過(guò),目前已有了一些更好的工具來(lái)完成這些工作,包括genromfs(uClinux里常用的工具),genext2fs,mkcramfs等。這些工具提供了一些方便研發(fā)的新特性,例如,不必上面煩索的過(guò)程,只要將文件復(fù)制到某個(gè)目錄中,將其作為根目錄,即可生成initrd;另一個(gè)重要的改進(jìn)是,這些工具都能以普通用戶(hù)的身份來(lái)生成initrd。
未完,待續(xù)…(補(bǔ)充有關(guān)怎么加載|ARM中怎么使用initrd作為根文件系統(tǒng)等)
鏈接和參考文件
文件
?
原文:http://czdj2000.yo2.cn/articles/linux%E4%B8%AD%E7%9A%84ramdisk%E4%B8%8Einitrd.html
轉(zhuǎn)載于:https://www.cnblogs.com/hicjiajia/archive/2012/07/10/2582634.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Linux中的Ramdisk和Initrd的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 摩尔庄园航天飞行器怎么获得
- 下一篇: 英国的钱是中国多少钱啊?