initrd.img相关

来源:互联网 发布:比特币行情软件 编辑:程序博客网 时间:2024/04/30 02:07

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

0 0
原创粉丝点击