零零社区|百姓的网上家园-互动交流平台!(0.0)=^_^=(00社区)

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz

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

2013-4-5 16:24| 发布者: 123456000000| 查看: 13| 评论: 0

摘要: initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, bootloader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访 ...
 

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>

它把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


路过

雷人

握手

鲜花

鸡蛋

相关阅读

发表评论

最新评论

相关分类


Archiver|手机版|小黑屋|00社区

GMT+8, 2023-1-31 10:50 , Processed in 0.042940 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部