initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內存盤。在 linux內核啟動前, bootloader 會將存儲介質中的 initrd 文件加載到內存,內核啟動時會在訪問真正的根文件系統(tǒng)前先訪問該內存中的 initrd 文件系統(tǒng)。第一階段啟動的目的是為第二階段的啟動掃清一切障礙,最主要的是加載根文件系統(tǒng)存儲介質的驅動模塊。我們知道根文件系統(tǒng)可以存儲在包括IDE、SCSI、USB在內的多種介質上,如果將這些設備的驅動都編譯進內核,可以想象內核會多么龐大、臃腫。
initrd.img是Linux啟動過程中很重要的一個文件,(如果你編譯內核時將一部分功能編譯為可加載模塊。如果系統(tǒng)的一些設備的驅動編譯為可加載模,那么啟動時如果沒有指定INITRD=/path_to_initrd.img,那么系統(tǒng)啟動或者會失敗,或者啟動后會有設備無法使用(像網(wǎng)卡或者其它設備)。如果沒指定initrd.img或者指定的initrd.img中并沒有包含正確的驅動模塊,則系統(tǒng)啟動時會掛起,并報告"kernel panic: VFS: Unable to mount root fs on 08:06"的錯誤。)
它把kernel的啟動分成兩個階段:在kernel中保留最少最基本的啟動代碼,然后把對各種各樣硬件設備的支持以模塊的方式放在initrd中,這樣就在啟動過程中可以從initrd所mount的根文件系統(tǒng)中裝載需要的模塊。這樣的一個好處就是在保持kernel不變的情況下,通過修改initrd中的內容就可以靈活的支持不同的硬件。在啟動完成的最后階段,根文件系統(tǒng)可以重新mount到其他設備上。
initrd.img不像通常的以.img為擴展名的ramdisk cramfs文件。它是經(jīng)過用gzip -9進行壓縮過的ramdisk文件。所以,需要先解壓縮然后在mount,否則會出錯。以下是操作過程。
首先將initrd.img拷貝到操作目錄下:
cp initrd.img /work/initrd.gz
然后解壓縮:
gunzip initrd.gz
解壓后可以看到一個沒有gz后綴的文件initrd
直接mount該文件:
mount -o loop initrd /mnt
mount成功后,/mnt目錄中將能看到initrd.img中的所有文件及目錄
在work下建一個目錄initrd
將mnt下的文件都拷貝到initrd下
cp /mnt/* ./initrd
現(xiàn)在就可以對目錄里的文件進行修改了。
修改完成后
mkcramfs initrd my.initrd
gzip -9 my.initrd my.initrd.gz
再將生成的文件拷貝到/boot目錄下即可
cp my.initrd.gz /boot/initrd.img
如果自己根據(jù)內核來制作initrd.img,如下
Decide on the RAM disk size that you want. Say 8 MB for this example.
dd if=/dev/zero of=imitrd.img bs=1k count=8192
b) Make a filesystem on it. Say ext2fs for this example.
$mke2fs -F -vm0 initrd.img
/*看有的帖子上說是這樣制作initrd文件系統(tǒng)的,不過個人以為下面那個才對,沒試驗過!*/
cd /lib/modules/kernel_version
mkinitrd /tmp/initrd-kernel_version.img kernel_version
cp /tmp/initrd-kernel_version.img /boot
這是一個grub.conf的內容,可以修改一下!
default=1
timeout=10
splashimage=(hd0,6)/grub/splash.xpm.gz
title Psyche (2.4.18-14 standard)//在啟動菜單里顯示的名字
root (hd0,6) //在E盤
kernel /vmlinuz-2.4.18-14.standard ro root=/dev/hda8
initrd /initrd-2.4.18-14.standard.img //改成initrd-kernel_version.img
title Windows xp
rootnoverify (hd0,0)
chainloader +1
-----------------------------------------------------------------------------------------------------------------------------------------
我想做一個U盤啟動的linux,照處面的步驟進行:
建立initrd.img文件
# mkdir -p /mnt/initrd
# cd /tmp
# mkinitrd /tmp/initrd.gz 2.6.18
2.解壓initrd.img文件,修改啟動腳本linuxrc
# gunzip initrd.gz
# mount -o loop /tmp/initrd /mnt/initrd
到這步就出現(xiàn):mount: you must specify the filesystem type
怎樣指定文件系統(tǒng)都無法mount上去,
我也試過生成2.6.18.img文件,
再mv 2.6.18.img 2.6.18.gz
然后再用gunzip解壓,也是不行。
到底要怎樣才行呢?
你的文件是cpio文件 不是影像文件
你可以用 file initrd看下 文件類型就可以了
從 Fedora Core 3 開始,默認的 initrd 映像變成了一個經(jīng)過壓縮的 cpio 歸檔文件。我們不用再使用 loop 設備來將 initrd 作為壓縮映像進行掛載,而是可以將其作為 cpio 歸檔文件來使用
------------------------------------------
cpio –idcmv < 文件名解壓
制作cpio格式initrd
非常簡單:
1. find . | cpio -c -o > initrd.img
2. gzip initrd.img
3. mv initrd.img.gz initrd.img
要注意,cpio 的-c選項別忘了,否則initrd不能正確掛載。
聯(lián)系客服