initrd 文件系统
initrd是inital ram disk的宿写,这个 initrd 会作为 RAM 中的临时根文件系统使用,加载ext3 等文件系统及 SCSI 设备的驱动后,允许linux内核在没有挂载任何物理磁盘的情况下完整地实现引导。
其次,由于与外围设备进行交互所需要的模块可以是 initrd 的一部分,因此内核就可以非常小,但是仍然需要支持大量可能的硬件配置。
[root@lamp01boot]# file initrd-2.6.18-238.el5.img
initrd-2.6.18-238.el5.img: gzip compressed data, from Unix, last modified: SunOct 4 09:33:13 2015, max compression
上面这个initrd-2.6.18-238.e15.img是个cpio文档格式的压缩文件,可以gunzip解压,然后用cpio命令提取里面的信息,查看其中的文件。
###现在较新的initrd一般是用gzip压缩的cpio格式的image;
###老的initrd(如Linux 2.4 kernel的年代)则直接就是普通image;
### mount -o loop initrd-kernel-2.4.img /mnt/ ##基本很少见了。
[root@lamp01 /]# cd /mnt
[root@lamp01 mnt]# cp /boot/initrd-2.6.18-238.el5.img initrd.gz
[root@lamp01 mnt]# gunzip initrd.gz
[root@lamp01 mnt]# ll
总计 5908
-rw------- 1 root root6033408 11-05 16:36 initrd
[root@lamp01 mnt]# cpio -idmv <initrd
dev
dev/tty
dev/ram1
dev/tty5
dev/ttyS0
dev/ram0
dev/rtc
dev/tty12
dev/ptmx
dev/tty0
dev/ttyS1
dev/tty11
dev/tty10
dev/console
dev/tty1
dev/null
dev/mapper
dev/ram
dev/tty8
dev/ttyS3
dev/tty4
dev/zero
dev/tty7
dev/ttyS2
dev/tty2
dev/tty6
dev/tty9
dev/tty3
dev/systty
proc
sysroot
sbin
bin
bin/kpartx
bin/dmraid
bin/nash
bin/modprobe
bin/insmod
sys
lib
lib/ata_piix.ko
lib/dm-region_hash.ko
lib/dm-mem-cache.ko
lib/dm-message.ko
lib/uhci-hcd.ko
lib/firmware
lib/ohci-hcd.ko
lib/sd_mod.ko
lib/ext3.ko
lib/dm-raid45.ko
lib/usb-storage.ko
lib/scsi_mod.ko
lib/ehci-hcd.ko
lib/libata.ko
lib/dm-log.ko
lib/jbd.ko
lib/dm-mod.ko
init
etc
11784 blocks
[root@lamp01 mnt]# ll //查看initrd-2.6.18-238.e15.img,如下图
[root@lamp01 mnt]# ls
bin dev etc init initrd lib proc sbin sys sysroot
[root@lamp01 mnt]# ls bin
dmraid insmod kpartx modprobe nash
[root@lamp01 mnt]# ls lib
ata_piix.ko dm-mem-cache.ko dm-mod.ko dm-region_hash.ko ext3.ko jbd.ko ohci-hcd.ko sd_mod.ko usb-storage.ko
dm-log.ko dm-message.ko dm-raid45.ko ehci-hcd.ko firmware libata.ko scsi_mod.ko uhci-hcd.ko
[root@lamp01 mnt]# ls dev
console null ram ram1 systty tty0 tty10 tty12 tty3 tty5 tty7 tty9 ttyS1 ttyS3
mapper ptmx ram0 rtc tty tty1 tty11 tty2 tty4 tty6 tty8 ttyS0 ttyS2 zero
sbin目录是指向bin目录的一个连接,其他目录是空的。
操作系统kernel接到控制权之后,开始start_kernel,接着内核将initrd.img展开到/dev/ram0为临时根文件系统,执行里面的init文件。
[root@lamp01 mnt]# cat init
#!/bin/nash
//加载proc内核文件系统
mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfsfilesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs/dev /dev
mkdir /dev/pts
mount -t devpts -ogid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial devicenodes
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 devicenodes.
Mkblkdevs
//加载一些必要的模快;
echo "Loadingehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
echo "Loadingohci-hcd.ko module"
insmod /lib/ohci-hcd.ko
echo "Loadinguhci-hcd.ko module"
insmod /lib/uhci-hcd.ko
mount -t usbfs /proc/bus/usb/proc/bus/usb
echo "Loading jbd.komodule"
insmod /lib/jbd.ko
echo "Loading ext3.komodule"
insmod /lib/ext3.ko
echo "Loadingscsi_mod.ko module"
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.komodule"
insmod /lib/sd_mod.ko
echo "Loading libata.komodule"
insmod /lib/libata.ko
echo "Loadingata_piix.ko module"
insmod /lib/ata_piix.ko
echo "Loadingusb-storage.ko module"
insmod /lib/usb-storage.ko
echo Waiting for driverinitialization.
stabilized/proc/bus/usb/devices
echo "Loadingdm-mem-cache.ko module"
insmod /lib/dm-mem-cache.ko
echo "Loading dm-mod.komodule"
insmod /lib/dm-mod.ko
echo "Loading dm-log.komodule"
insmod /lib/dm-log.ko
echo "Loadingdm-region_hash.ko module"
insmod /lib/dm-region_hash.ko
echo "Loadingdm-message.ko module"
insmod /lib/dm-message.ko
echo "Loadingdm-raid45.ko module"
insmod /lib/dm-raid45.ko
echo Waiting for driverinitialization.
stabilized --hash --interval1000 /proc/scsi/scsi
mkblkdevs
echo Scanning and configuringdmraid supported devices
resume LABEL=SWAP-sda8
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro sda2 //尝试挂载根目录
//mkrootdev使它后面的参数/dev/root成为一个块节点从而使得根分区设备被挂载,其中根分区设备由grub.conf里面的kernel命令后面所带的参数##root=/决定。如果root=参数没有被指定,/proc/sys/kernel/real-root-dev文件将提供根分区设备号。
echo Mounting rootfilesystem.
mount /sysroot
echo Setting up otherfilesystems.
setuproot
echo Switching to new rootand running init.
Switchroot //是在nash中定义的程序
我们必须注意的是这里使用的shell是nash而不是bash,nash是专门为init可执行脚本设计的,这个文件的功能如下:
①加载proc内核文件系统;
②加载一些必要的模快;
③创建块设备;
④调用pivot_root改变根目录所在地;
⑤卸载旧的根目录里面的proc内核文件系统;
Initrd文件系统中的init执行完毕之后,系统在/bin/或者/sbin目录下找到init程式,然后根据它的配置文件/etc/fstab进行初始化,最后调用mingetty程式启动login完成引导。