详解linux的initrd
作者: easylife?????http://www.mike.org.cn/blog/index.php?load=read&id=635
在Linux操作系統(tǒng)中,有一項(xiàng)特殊的功能——初始化內(nèi)存盤INITRD(INITial Ram Disk)技術(shù),而且內(nèi)核支持壓縮的文件系統(tǒng)映像。有了這兩項(xiàng)功能,我們可以讓Linux系統(tǒng)從小的初始化內(nèi)存盤啟動(dòng),并把系統(tǒng)內(nèi)存的一部分作為根文件系統(tǒng)掛載。
Ramdisk就是將內(nèi)存的一部分分配為一個(gè)分區(qū)并作為硬盤來使用。對(duì)于系統(tǒng)運(yùn)行時(shí)不斷使用的程序,將它們放在Ramdisk中將加快計(jì)算機(jī)的操作,如大數(shù)據(jù)量的網(wǎng)絡(luò)服務(wù)器、無(wú)盤工作站等。為了能夠使用Ramdisk,我們?cè)诰幾g內(nèi)核時(shí)須將block device中的Ramdisk支持選上,它下面還有兩個(gè)選項(xiàng),一個(gè)是設(shè)定Ramdisk的大小,默認(rèn)是4096k;另一個(gè)是設(shè)定默認(rèn)個(gè)數(shù)。如果要使用initrd,還得選上的支持。它既可以直接編譯進(jìn)內(nèi)核,也可以編譯成模塊,在需要的時(shí)候加載。我們由于在啟動(dòng)時(shí)就用它,所以必須將它直接編譯進(jìn)內(nèi)核。
下面是2.6內(nèi)核對(duì)模塊選擇路徑:
Linux Kernel Configuration
-> Device Drivers
->Block devices
->RAM block device support
->Default number of RAM disks (設(shè)定Ramdisk的個(gè)數(shù),默認(rèn)是16)
->Default RAM disk size (kbytes) (設(shè)定Ramdisk的大小,默認(rèn)是4096k)
Linux Kernel Configuration
->General setup
->Inital RAM filesystem and RAM disk(initramfs/initrd) support
如果對(duì)Ramdisk的支持已經(jīng)編譯進(jìn)內(nèi)核,我們就可以使用它了。首先在/mnt目錄下創(chuàng)建目錄ram,運(yùn)行mkdir /mnt/ram;然后對(duì)/dev/ram0創(chuàng)建文件系統(tǒng),運(yùn)行mke2fs /dev/ram0;最后掛載上/dev/ram,運(yùn)行mount /dev/ram0 /mnt/ram,就可以象對(duì)普通硬盤一樣對(duì)它進(jìn)行操作了。值得注意的是,在創(chuàng)建文件系統(tǒng)的時(shí)候,在屏幕上輸出1024 inodes ,4096 blocks,即ramdisk大小為4M=4096個(gè)塊,但是我們掛載上之后,用命令df –k /dev/ram查看時(shí),顯示出來ramdisk大小只有3963K,這是由于文件系統(tǒng)本身占用了一些空間。(這個(gè)空間是在編譯核心時(shí)就由Default RAM disk size (kbytes)確定下來)
我們能根據(jù)需要改變r(jià)amdisk的大小。如我們要把默認(rèn)的4M增大到8M,當(dāng)ramdisk是直接編譯進(jìn)內(nèi)核的情況下,可在grub配置文件 grub.conf中加入ramdisk=8192 ,運(yùn)行g(shù)rub后,重啟計(jì)算機(jī)后,ramdisk大小變?yōu)?M。
例如要設(shè)置Ramdisk的大小為8M,在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=8192
??????? initrd /initrd
這樣Ramdisk的大小就變成16M了。這個(gè)參數(shù)是Ramdisk直接編譯到核心時(shí)才能使用的,如果Ramdisk編譯為模塊,則應(yīng)該使用模塊參數(shù)來設(shè)置Ramdisk的大小:
a、在模塊加載配置文件 /etc/modules.conf中加入一行:
options rd rd_size=8192,
b、在加載rd模塊是在后面加上說明,即insmod rd rd_size=8192。
# insmod rd rd_size=8192
?
編譯到核心時(shí),可以通過下面的一些核心命令行參數(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;
?
或者在啟動(dòng)是作為啟動(dòng)行參數(shù)ramdisk=8192;
創(chuàng)建initrd ramdisk 映像
上面已經(jīng)提到,Ramdisk需要先格式化然后才能使用。那么,如果核心希望使用ramdisk該如何做呢?于是initrd產(chǎn)生了,initrd全稱是 initial RAM disk ,它提供一種讓核心可以簡(jiǎn)單使用Ramdisk的能力,簡(jiǎn)單的說,這些能力包括:
格式化一個(gè) Ramdisk;
加載文件系統(tǒng)內(nèi)容到Ramdisk;
將Ramdisk作為根文件系統(tǒng);
我們可以將initrd形像的比作Norton Ghost備份的硬盤分區(qū),而Linux啟動(dòng)階段的Ramdisk相當(dāng)于一個(gè)未格式化的硬盤分區(qū),核心可以直接將initrd的內(nèi)容釋放到一個(gè)未初始化的Ramdisk里,這個(gè)過程與Ghost恢復(fù)一個(gè)分區(qū)的過程十分相似。于是,相應(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)的ramdisk和cpio格式(這種格式的好處是內(nèi)核原生不需要額外的文件系統(tǒng)支持)
制作initrd傳統(tǒng)的作法是通過軟盤(顯然過時(shí)了,不介紹了)、ramdisk或loop設(shè)備(/dev/loop)。通過ramdisk來制作的方法比較簡(jiǎn)單(以ext2文件系統(tǒng)為例):
通過ramdisk
# mkfs.ext2 /dev/ram0
# mount /dev/ram0 /mnt/rd
# cp _what_you_like_? /mnt/rd??? # 把需要的文件復(fù)制過去
# dd if=/dev/ram0 of=/tmp/initrd
# gzip -9 /tmp/initrd
這個(gè)過程也最能夠解釋initrd的本質(zhì),對(duì)于Linux來說,Ramdisk的一個(gè)塊設(shè)備,而initrd是這個(gè)塊設(shè)備上所有內(nèi)容的“克隆”(由命令dd來完成)而生成的文件。核心中加載initrd相關(guān)的代碼則用于完成將相反的過程,即將這一個(gè)文件恢復(fù)到Ramdisk中去。
通過loop設(shè)備來制作initrd的過程:
dd if=/dev/zero of=/tmp/initrd bs=1024 count=4096 # 制作一個(gè)4M的空白文件
losetup /dev/loop0 /tmp/initrd??????????????????? # 映射到loop設(shè)備上;
mkfs.ext2 /dev/loop0????????????????????????????? # 創(chuàng)建文件系統(tǒng);
mount /dev/loop0 /mnt/rd
cp _what_you_like_ /mnt/rd??????????????????????? # 復(fù)制需要的文件;
umount /mnt/rd
losetup -d /dev/loop0
gzip -9 /tmp/initrd
通過cpio來制作initrd的過程:
cd /path/to # 到需要復(fù)制的文件的目錄
find . |cpio -o -H newc |gzip -c > ../initrd.gz
不過,現(xiàn)在已經(jīng)有了一些更好的工具來完成這些工作,包括genromfs(uClinux里常用的工具),genext2fs,mkcramfs、mkinitrd等。這些工具提供了一些方便開發(fā)的新特性,例如,不需要上面煩索的過程,只要將文件復(fù)制到某個(gè)目錄中,將其作為根目錄,即可生成initrd;另一個(gè)重要的改進(jìn)是,這些工具都可以以普通用戶的身份來生成initrd。
分類:?initrd
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的详解linux的initrd的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GRUB的使用
- 下一篇: linux内核编译与新内核启用