initrd.img相关
initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內存盤。在 linux內核啟動前, bootloader 會將存儲介質中的 initrd 文件加載到內存,內核啟動時會在訪問真正的根文件系統前先訪問該內存中的 initrd 文件系統。第一階段啟動的目的是為第二階段的啟動掃清一切障愛,最主要的是加載根文件系統存儲介質的驅動模塊。我們知道根文件系統可以存儲在包括IDE、SCSI、USB在內的多種介質上,如果將這些設備的驅動都編譯進內核,可以想象內核會多么龐大、臃腫。
initrd.img是Linux啟動過程中很重要的一個文件,(如果你編譯內核時將一部分功能編譯為可加載模塊。如果系統的一些設備的驅動編譯為可加載模,那么啟動時如果沒有指定INITRD=/path_to_initrd.img,那么系統啟動或者會失敗,或者啟動后會有設備無法使用(像網卡或者其它設備)。如果沒指定initrd.img或者指定的initrd.img中并沒有包含正確的驅動模塊,則系統啟動時會掛起,并報告"kernel panic: VFS: Unable to mount root fs on 08:06"的錯誤。)
它把kernel的啟動分成兩個階段:在kernel中保留最少最基本的啟動代碼,然后把對各種各樣硬件設備的支持以模塊的方式放在initrd中,這樣就在啟動過程中可以從initrd所mount的根文件系統中裝載需要的模塊。這樣的一個好處就是在保持kernel不變的情況下,通過修改initrd中的內容就可以靈活的支持不同的硬件。在啟動完成的最后階段,根文件系統可以重新mount到其他設備上。
initrd.img不像通常的以.img為擴展名的ramdisk cramfs文件。它是經過用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
現在就可以對目錄里的文件進行修改了。
修改完成后
mkcramfs initrd my.initrd
gzip -9 my.initrd my.initrd.gz
再將生成的文件拷貝到/boot目錄下即可
cp my.initrd.gz /boot/initrd.img
如果自己根據內核來制作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文件系統的,不過個人以為下面那個才對,沒試驗過!*/
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
到這步就出現:mount:?you?must?specify?the?filesystem?type
怎樣指定文件系統都無法mount上去,
我也試過生成2.6.18.img文件,
再mv 2.6.18.img 2.6.18.gz
然后再用gunzip解壓,也是不行。
到底要怎樣才行呢?
你的文件是cpio文件 不是影像文件
你可以用?file?initrd看下 文件類型就可以了
從 Fedora Core 3 開始,默認的 initrd 映像變成了一個經過壓縮的 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不能正確掛載。
總結
以上是生活随笔為你收集整理的initrd.img相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内核编译与新内核启用
- 下一篇: C++ IO类(3) 文件流