Chinaunix首页 | 论坛 | 博客
  • 博客访问: 190216
  • 博文数量: 76
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 831
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-31 00:52
文章分类

全部博文(76)

文章存档

2010年(58)

2009年(18)

我的朋友

分类:

2010-03-23 11:33:43

initrd.img 分析

initrd --- boot loader initialized RAM disk。这是由boot loader初始化的内存盘。在Linux内核启动前,bootloader会将存储介质中的initrd文件加载到内存(这个文件和内核Image是放 在一起的),内核在启动正真的根文件系统前先访问内存中的initrd文件系统。这一阶段的启动目的是为下一阶段启动完成各种准备动作,如加载根文件系统 存储介质的驱动模块等。众所周知根文件系统可以存储在多种介质上如IDE,SCSI,USB等等,如果将这些设备驱动都编译进内核,可以相像内核会变的非常臃肿。

initrd就是避免这种臃肿而实现的一种方法。如果没有指定initrd.img或者initrd.img中没有包含正确的驱动模块, 系统启动时候都会挂起,并报告类似"kenrel panic: VFS:Unable to mount root fs on 08:06"的错误。

kenrel启动分成两个阶段:
1. Kernel中保留最少的基本启动代码,然后把各种各样的硬件设备的支持以模块的方式放在initrd中,这样就在启动的第一阶段把initrd作为根文件系统mount,让后从这个文件系统中装载所需要的模块。这样的好处就是保持Kenrel不便的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。

2. 在第一阶段完成后,正真根文件系所在介质的驱动已经加载到Kernel。这样Kenrel就可以把正真的根文件系统mount进来。


解压命令:

gzip -cd initrd-2.6.9-89cblade-jli.img | cpio -id

压缩命令:
find . ! -name "*~" | cpio -H newc --create | gzip -9 > /boot/initrd-jli.img


initrd文件解压后的内容如下:
bin  dev  etc  init  lib  loopfs  proc  sbin  sys  sysroot


其中的文件作用如下:

./bin/nash
一个设计的尽可能小的简单命令解释器,主要用于初始化ramdisk时候解释里面的linuxrc或者init这些简单的脚本


./init
init则是其引导的核心文件,在cpio格式的initrd里,该文件的名称只能是init。init是一个可以被nash来执行的脚本文件,负责加载内核访问根文件系统必须的驱动,以及加载根文件系统。


./lib
包含系统引导必须的驱动模块



init脚本的内容如下:

[root@jli jli]# cat init

#!/bin/nash


mount -t proc /proc /proc
setquiet
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs none /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs none /dev
mknod /dev/console c 5 1
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mkdir /dev/pts
mkdir /dev/shm
echo Starting udev
/sbin/udevstart
echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
echo Loading scsi_mod.ko module
insmod /lib/scsi_mod.ko
echo Loading sd_mod.ko module
insmod /lib/sd_mod.ko
echo Loading mptbase.ko module
insmod /lib/mptbase.ko
echo Loading mptscsi.ko module
insmod /lib/mptscsi.ko
echo Loading mptspi.ko module
insmod /lib/mptspi.ko
echo Loading mptsas.ko module
insmod /lib/mptsas.ko
echo Loading mptscsih.ko module
insmod /lib/mptscsih.ko
echo Loading megaraid_sas.ko module
insmod /lib/megaraid_sas.ko
echo Loading jbd.ko module
insmod /lib/jbd.ko
echo Loading ext3.ko module
insmod /lib/ext3.ko
/sbin/udevstart
echo Creating root device
mkrootdev /dev/root
umount /sys
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
mount -t tmpfs --bind /dev /sysroot/dev
echo Switching to new root
switchroot /sysroot
umount /initrd/dev


阅读(781) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~