热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » Linux内核/嵌入技术 » 2.6.24的内核编译--initrd-2.6.24.img的分析

2.6.24的内核编译--initrd-2.6.24.img的分析

论坛链接
  • 2.6.24的内核编译--initrd-2.6.24.img的分析
  • 发布时间:2008-03-21 13:23:00    浏览数:7650    发布者:superadmin    设置字体【   
initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, bootloader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。

initrd.img是Linux启动过程中很重要的一个文件,如果没指定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文件。一下是我对它的分析过程。

首先将initrd-2.6.24.img拷贝到操作目录下:(测试环境:redflag6.0)

cp initrd-2.6.24.img /home/kernel/initrd.gz

然后解压缩:

gunzip initrd.gz

解压后可以看到一个没有gz后缀的文件initrd

这里就可以用”file initrd”来查看文件的类型

在这里可以由另一种方法分析和查看initrd中的内容.但是由于这种方法我没有试通,所以也就不详加说明了,只是把这种方法也列出来.

mount –o loop initrd /mnt

cd /mnt

这时就可以看到initrd中的内容了.

一下是我在我机子上测试通过的方法。环境是redflag6.0。

cp initrd-2.6.24.img /home/kernel/initrd.gz

cd /home/kernel/

gunzip -dc initrd | cpio –idmv

这时在单前文件夹中就可以看到initrd中的内容了.

可以看到这里面有以下一些目录和文件(当然是除了initrd.gz这是原先cp过来的):

Bin:

这里面有三个文件: insmod modprobe,nash.insmod是用来加载内河模块的.还可看到modprobe是指向nash程序的.那什么是nash呢? nash (not a shell)它不是一个SHELL,是一个设计的尽可能小的简单命令解释器。主要用于初始化RAM DISK时候解释里面的linuxrc或者init这些简单的脚本。nash目前常用的构建命令如下:

echo 将字符串输出到标准输出,只是功能上没有系统里面echo那么多。

find 显示指定路径下所匹配名称的文件,即只支持linux系统里find命令中的-name参数。

losetup 将文件帮定到回环设备/dev/loopdev上

mkdevices指定创建的块设备文件存放路径,如:mkdevices /dev

mknod 创建设备文件

mkrootdev 创建根文件系统的设备节点,根据内核传递参数当中的“root=”来创建对应该设备的节点,节点的名称是/dev/root,它不仅能够根据root=/dev/xxx来生成对应的设备节点,还能够在碰到root=LABEL=/的情况下探测所有的硬盘分区,以便找到对应着卷标为/的分区。

pivot_root 转换根文件系统,以及挂载临时根文件系统。

raidautorun 自动检测所有的raid设备

showlabels 显示设备的LABEL以及UUID sw

itchroot 与pivot_root功能类似,用于转换根文件系统。但只能用于2.6或以后的核心。

Bootsplash: 内核的图形化启动进程。

Dev:系统启动时一些必须的设备文件,都是字符设备,但有一个文件夹,不知何用?

etc:众所周知这是一个成放配置文件的目录。这个目录在嵌入式系统中是非常有有的,有关系统启动后要执行那些用户程序或是配置命令都是以shell程序的形式写在这里面的。这里就不详加说明了。

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

Proc:

Sbin:它是指向bin的

Sys,Sysroot,User:这些就不多说了。

Init文件中的内容。

#!/bin/nash



mount -t proc /proc /proc

setquiet

echo Mounting proc filesystem

echo Mounting sysfs filesystem

mount -t sysfs /sys /sys

echo > /sys/power/suspend2/do_resume

echo Creating /dev

mount -o mode=0755 -t tmpfs /dev /dev

mkdir /dev/pts

mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts

mkdir /dev/shm

mkdir /dev/mapper

echo Creating initial device nodes

mknod /dev/null c 1 3

mknod /dev/zero c 1 5

mknod /dev/systty c 4 0

mknod /dev/tty c 5 0

mknod /dev/console c 5 1

mknod /dev/ptmx c 5 2

mknod /dev/rtc c 10 135

mknod /dev/tty0 c 4 0

mknod /dev/tty1 c 4 1

mknod /dev/tty2 c 4 2

mknod /dev/tty3 c 4 3

mknod /dev/tty4 c 4 4

mknod /dev/tty5 c 4 5

mknod /dev/tty6 c 4 6

mknod /dev/tty7 c 4 7

mknod /dev/tty8 c 4 8

mknod /dev/tty9 c 4 9

mknod /dev/tty10 c 4 10

mknod /dev/tty11 c 4 11

mknod /dev/tty12 c 4 12

mknod /dev/ttyS0 c 4 64

mknod /dev/ttyS1 c 4 65

mknod /dev/ttyS2 c 4 66

mknod /dev/ttyS3 c 4 67

echo Setting up hotplug.

hotplug

echo Creating block device nodes.

mkblkdevs

echo "Loading uhci-hcd.ko module"

insmod /lib/uhci-hcd.ko

echo "Loading ohci-hcd.ko module"

insmod /lib/ohci-hcd.ko

echo "Loading ehci-hcd.ko module"

insmod /lib/ehci-hcd.ko

mount -t usbfs /proc/bus/usb /proc/bus/usb

echo "Loading jbd.ko module"

insmod /lib/jbd.ko

echo "Loading ext3.ko module"

insmod /lib/ext3.ko

echo "Loading scsi_mod.ko module"

insmod /lib/scsi_mod.ko

echo "Loading sd_mod.ko module"

insmod /lib/sd_mod.ko

echo "Loading libata.ko module"

insmod /lib/libata.ko

echo "Loading ata_generic.ko module"

insmod /lib/ata_generic.ko

echo "Loading ata_piix.ko module"

insmod /lib/ata_piix.ko

echo Waiting for driver initialization.

stabilized --hash --interval 250 /proc/scsi/scsi

echo "Loading mptbase.ko module"

insmod /lib/mptbase.ko

echo "Loading mptscsih.ko module"

insmod /lib/mptscsih.ko

mkblkdevs

resume LABEL=SWAP-hda3

echo Creating root device.

mkrootdev -t ext3 -o defaults,ro hda2

echo Mounting root filesystem.

mount /sysroot

echo Setting up other filesystems.

setuproot

echo Switching to new root and running init.

switchroot
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理