initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, bootloader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。第一阶段启动的目的是为第二阶段的启动扫清一切障碍,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。<?XML:NAMESPACE PREFIX = O />
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.img 不像通常的以.img为扩展名的ramdisk cramfs文件。它是经过用gzip -9进行压缩过的ramdisk文件。一下是我对它的分析过程。
首先将initrd-<?XML:NAMESPACE PREFIX = ST1 />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
目前常用的构建命令如下:
l
echo
将字符串输出到标准输出,只是功能上没有系统里面
echo
那么多。
l
find
显示指定路径下所匹配名称的文件,即只支持
linux
系统里
find
命令中的
-name
参数。
l
losetup
将文件帮定到回环设备
/dev/loopdev
上
l
mkdevices
指定创建的块设备文件存放路径
,
如
:mkdevices /dev
l
mknod
创建设备文件
l
mkrootdev
创建根文件系统的设备节点,根据内核传递参数当中的“
root=
”来创建对应该设备的节点,节点的名称是
/dev/root
,它不仅能够根据
root=/dev/xxx
来生成对应的设备节点,还能够在碰到
root=LABEL=/
的情况下探测所有的硬盘分区,以便找到对应着卷标为
/
的分区。
l
pivot_root
转换根文件系统,以及挂载临时根文件系统。
l
raidautorun
自动检测所有的
raid
设备
l
showlabels
显示设备的
LABEL
以及
UUID sw
l
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
转载于:https://blog.51cto.com/njqyu/277033