红联Linux门户
Linux帮助

linux2.6内核启动时加载的重要文件--initrd.img

发布时间:2008-08-06 20:54:36来源:红联作者:Skill
  通常initrd.img将内核的启动分成了两个阶段,内核中只保留了一些基本的启动代码,而将一些像设备驱动之类的代码编译为可加载模块,让initrd.img文件来加载执行,这样可以有效的减小内核的尺寸。在启动参数中需要指定类似INITRD=/boot/initrd.img这样的参数来说明你的系统中initrd.img文件所在位置,如果没有指定或是指定错误,让系统找不到initrd.img文件,则有可能会有一些重要的设备驱动找不着,启动后有一些设备无法启用或是系统挂起,并显示“kernel panic: VFS: Unable to mount root fs”这样的错误信息。

  一般情况下initrd.img文件和ramdisk、cramfs这种类型的img文件不一样,它并不是一个真正的img格式文件,而是一个经过gzip -9压缩过的ramdisk文件,因此我们可以用gunzip先解压,然后就可以直接用mount -o loop来挂载它。要注意的是,用gunzip解压之前,必需将initrd.img文件的扩展名修改成.gz,否则gunzip无法正确识别initrd.img的压缩格式。

  但是目前的一些较新的linux发行版中,内核的版本都已经是2.6以上了,initrd.img文件也与以前不太一样了,用gunzip解压之后,不能直接以mount -o loop命令来挂载,因为它解压之后再也不是一个标准的img格式文件,所以在mount时会提示你需要指定挂载的文件系统类型,但是不论你指定什么类型都没用。这是因为新的initrd.img是一个cpio归档文件,然后再用gzip -9压缩出来的文件,所以我们不用挂载它,gunzip解压出来后,再用“cpio -idcmv <待解压的文件”这个命令来解开cpio档即可,通常解出来的initrd包括以下文件:

  bin/ etc/ init* lib/ sbin@ sysroot/
  dev/ firmware/ proc/ sys/ usr/

  其中init这个文件就是initrd.img加载时需要调用的初始化文件。需要注意的是,init这个文件是cpio格式的initrd.img文件所需要用到的,如果不是cpio格式的,则是调用linuxrc这个文件,而不是init。

  initrd.img文件的启动方式有两种,一是ramdisk方式,另一种是initramfs方式,貌似initramfs方式要简单一些。

  下面我们来归纳一下解压和制作initrd.img文件的过程:

  1、解压initrd.img文件:
  mv initrd.img initrd.img.gz
  gunzip initrd.img.gz
  cpio -idcmv < initrd.img

  2、制作initrd.img文件:
  cd需要打包进initrd的文件所在目录
  find . | cpio -c -o > initrd.img
  gzip -9 initrd.img
  mv initrd.img.gz initrd.img

  需要注意的是cpio的-c参数不能掉,否则有可能initrd.img文件无法正常使用。

  如果要让内核认为initrd.img的启动方式是initramfs,则需要用以下参数来制作cpio档:

  find .| cpio -o -H newc
文章评论

共有 1 条评论

  1. alingmeng 于 2012-11-12 10:44:14发表:

    不错,收藏