Linux入职基础-4.6_initrd 文件系统

本文介绍了initrd(初始RAM磁盘)文件系统的作用及其组成结构。initrd在Linux内核引导过程中作为临时根文件系统使用,它包含了启动所需的模块和脚本。文章详细解释了如何查看initrd的内容,并展示了init脚本的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

initrd 文件系统

initrdinital 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完成引导。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值