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/
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/