天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧系统 >> 正文

内核编译 initrd-2.6.24.img分析

2008-4-8塞迪网佚名

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来执行的脚本文件,负责加载内核访问根文件系统必须的驱动,以及加载根文件系统。

欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛https://bbs.txwb.com

关注天下网吧微信,了解网吧网咖经营管理,安装维护:


本文来源:塞迪网 作者:佚名

声明
本文来源地址:0
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系Email:support@txwb.com.,本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行