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
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不能正确挂載。