initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的某个文件,完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。
2.Linux2.4内核对initrd的处理流程
Linux2.4内核的initrd的格式是文件系统镜像文件initrd.img,常见的文件系统格式为EXT2。
linux2.4内核对initrd的处理流程如下:
1) boot loader把内核以及/dev/initrd的内容加载到内存,/dev/initrd是由boot loader初始化的设备,存储着initrd。
2) 在内核初始化过程中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。
3) 内核以可读写的方式把 /dev/ram0 设备挂载为原始的根文件系统。
4) 如果 /dev/ram0 被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
5) 执行 initrd 上的 /linuxrc 文件,linuxrc 通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。
6) /linuxrc 执行完毕,真正的根文件系统被挂载。
7) 如果真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从 / 移动到 /initrd。否则如果 /initrd 目录不存在, /dev/ram0 将被卸载。
8) 在真正的根文件系统上进行正常启动过程 ,执行 /sbin/init。
linux2.4 内核的 initrd 的执行是作为内核启动的一个中间阶段,也就是说 initrd 的 /linuxrc 执行以后,内核会继续执行初始化代码。
3.initrd文件的创建及修改
传统initrd的制作过程比较繁琐,需要如下六个步骤
#假设当前目录位于准备好的initrd文件系统的根目录下
/*初始化内存文件系统块*/
bash# dd if=/dev/zero of=../initrd.img bs=512k count=5
/*创建文件系统*/
bash# mkfs.ext2 -F -m0 ../initrd.img
/*挂载新文件系统*/
bash# mount -t ext2 -o loop ../initrd.img /mnt
/*拷贝文件系统所需的/bin、/dev等目录文件*/
bash# cp -r * /mnt
/*卸载文件系统*/
bash# umount /mnt
/*打包为.gz格式*/
bash# gzip ../initrd.img
为了简单起见,我们主要针对于实现对于现有系统中initrd.img文件机制的修改:
系统中的initrd.img文件大多位于/boot目录下,此文件为initrd.gz的符号链接。
为实现修改,我们首先将initrd.gz拷贝到用户目录下。
gunzip initrd.gz 解压后生成initrd的文件
file initrd可知,initrd:Linux rev 1.0 ext2 filesystem data
为了查看其文件内容,mount -o loop initrd /mnt/initrd(想要挂载的目录,可任意选择)
cd /mnt/initrd,接下来就能查看initrd内存文件系统中的内容了
其文件系统的核心工作流程为linuxrc的脚本文件,此脚本完成如下功能:
1) 挂载系统启动所必须的设备驱动
2) 挂载真正的文件系统
这个时候,我们就能够对此文件系统进行必须的修改了,如果配置齐全的话,在这里也能够形成不亚于Linux的一个新系统呢。。
修改完后,umount /mnt/initrd,所作修改就能够保存进initrd的文件中
gzip initrd,生成新的initrd.gz文件
创建软连接new.initrd.img
修改lilo或者grub的启动项,使之生效
reboot后,就能启动新的initrd文件系统了
4.nash command
nash是initrd中的命令解释器,主要为了运行/linuxrc脚本,其常用命令有:
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或以后的内核