Linux 2.4内核下的initrd.img机制分析


1.什么是initrd

  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 <newroot> <oldroot> : 把挂载在 <newroot> 下的文件系统当成新的 / 文件系统,而当前的/文件系统被移动到 <oldroot> 下

  raidautorun : 自动检测所有的raid设备

  showlabels : 显示设备的LABEL以及UUID sw

  itchroot  : 与pivot_root功能类似,用于转换根文件系统。但只能用于2.6或以后的内核


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3