;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
推荐阅读
- 飞鸽传书 Linux系统下编译安装g2ipmsg
- 内核新版本发布:Linux Kernel 2.6.24.4
- Linux系统内核的实时操作性能将大幅提高
- Linux2.4内核和2.6内核对Initrd处理流程
- 学习园地:编译Linux系统内核的方法步骤
- Linux系统下多线程程序编译makefile文件
- 高手进阶:Redhat Linux上vsftpd编译安装
- by finnce MOTO MPx220 与Dopod 575/585 之内核CPU的比较
- Debian Linux系统编译内核标准方式介绍
- Linux服务器中OpenSSH的源码编译与升级