Total Pageviews

Sunday, 28 October 2012

initrd的作用

initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的”某个文件”,完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。这里提到的”某个文件”,Linux2.6 内核会同以前版本内核的不同,所以这里暂时使用了”某个文件”这个称呼。对于2.4的内核,“某个文件”是指linuxrc;对于2.6的内核,“某个文 件”是指init。第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。
Initrd 的用途主要有以下四种:
1. linux 发行版的必备部件
linux 发行版必须适应各种不同的硬件架构,将所有的驱动编译进内核是不现实的,initrd 技术是解决该问题的关键技术。Linux 发行版在内核中只编译了基本的硬件驱动,在安装过程中通过检测系统硬件,生成包含安装系统硬件驱动的 initrd,无非是一种即可行又灵活的解决方案。
2. livecd 的必备部件
同 linux 发行版相比,livecd 可能会面对更加复杂的硬件环境,所以也必须使用 initrd。
3. 制作 Linux usb 启动盘必须使用 initrd
usb 设备是启动比较慢的设备,从驱动加载到设备真正可用大概需要几秒钟时间。如果将 usb 驱动编译进内核,内核通常不能成功访问 usb 设备中的文件系统。因为在内核访问 usb 设备时, usb 设备通常没有初始化完毕。所以常规的做法是,在 initrd 中加载 usb 驱动,然后休眠几秒中,等待 usb设备初始化完毕后再挂载 usb 设备中的文件系统。
4. 在 linuxrc 脚本中可以很方便地启用个性化 bootsplash。
2.6的内核使用gzip压缩的cpio格式的文件。
分析一下 initrd 的内容:
.
|– bin
| |– dmraid (discover, configure and activate software (ATA)RAID)
| |– insmod (simple program to insert a module into the Linux Kernel)
| |– kpartx  (Create device maps from partition tables)
| |– modprobe -> /sbin/nash
| `– nash      (script interpretor to interpret linuxrc images )
|– dev
| |– console
| | ……
| `– zero
|– etc
|– init
|– lib
| |– ata_piix.ko
| |– dm-log.ko
| |– dm-mem-cache.ko
| |– dm-message.ko
| |– dm-mod.ko
| |– dm-raid45.ko
| |– dm-region_hash.ko
| |– ehci-hcd.ko
| |– ext3.ko
| |– firmware
| |– jbd.ko
| |– libata.ko
| |– megaraid_mbox.ko
| |– megaraid_mm.ko
| |– ohci-hcd.ko
| |– scsi_mod.ko
| |– sd_mod.ko
| |– shpchp.ko
| `– uhci-hcd.ko
|– proc
|– sbin -> bin
|– sys
`– sysroot
/init的内容:
#!/bin/nash
#以下指令多为nash的内置命令
#挂载/proc文件系统
mount -t proc /proc /proc
#setquiet,nash内置命令,作用是关闭输出
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
#挂载/sys系统系统
mount -t sysfs /sys /sys
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/urandom c 1 9
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
#加载USB相关模块,驱动键盘、鼠标等USB设备
echo “Loading ehci-hcd.ko module”
insmod /lib/ehci-hcd.ko
echo “Loading ohci-hcd.ko module”
insmod /lib/ohci-hcd.ko
echo “Loading uhci-hcd.ko module”
insmod /lib/uhci-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 megaraid_mm.ko module”
insmod /lib/megaraid_mm.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 megaraid_mbox.ko module”
insmod /lib/megaraid_mbox.ko
echo “Loading shpchp.ko module”
insmod /lib/shpchp.ko
echo “Loading libata.ko module”
insmod /lib/libata.ko
echo “Loading ata_piix.ko module”
insmod /lib/ata_piix.ko
echo “Loading dm-mem-cache.ko module”
insmod /lib/dm-mem-cache.ko
echo “Loading dm-mod.ko module”
insmod /lib/dm-mod.ko
echo “Loading dm-log.ko module”
insmod /lib/dm-log.ko
echo “Loading dm-region_hash.ko module”
insmod /lib/dm-region_hash.ko
echo “Loading dm-message.ko module”
insmod /lib/dm-message.ko
echo “Loading dm-raid45.ko module”
insmod /lib/dm-raid45.ko
echo Waiting for driver initialization.
stabilized –hash –interval 1000 /proc/scsi/scsi
mkblkdevs
echo Scanning and configuring dmraid supported devices
resume LABEL=SWAP-sda5
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro sda3
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
#应该是根据启动时传递给内核的参数(bootparam)
switchroot
引用:
Linux2.6 内核的 Initrd 机制解析
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/