linux initrd与linuxrc

来源:互联网 发布:吉首大学网络 编辑:程序博客网 时间:2024/05/10 07:52

6.4.4 initrd的奥妙所在:linuxrc文件

在内核引导时,它会检测到存在initrd映像,将其从RAM中的指定物理地址处将这个二进制压缩格式文件复制到恰当的内核ramdisk中,并将其挂载为根文件系统。initrd的奥妙之处来自initrd映像中某个特殊文件的内容。当内核挂载这个初始ramdisk时,它会查找一个名为linuxrc的特殊文件;Linux内核会把该文件当作脚本文件,并执行包含在其中的命令。这一机制使得系统设计人员可以定制initrd的行为,代码清单6-11列举了一个简单的linuxrc文件。

代码清单6-11 linuxrc文件示例

  1. #!/bin/sh  
  2.  
  3. echo 'Greetings: this is 'linuxrc' from Initial Ramdisk'  
  4. echo 'Mounting /proc filesystem'  
  5. mount -t proc /proc /proc  
  6.  
  7. busybox sh 

实际上,该文件会包括在挂载真正的根文件系统之前需要执行的指令。例如,为了从CompactFlash存储设备上获取一个真正的根文件系统,可能需要加载CompactFlash设备的驱动程序。这个例子只是简单地创建一个busybox shell,并终止引导过程以进行研究。你可以从代码清单6-10中看到由busybox shell给出的提示符#。如果在该提示符后面键入exit命令,内核将继续其引导过程直到结束。

当内核将ramdisk映像从物理内存复制到内核ramdisk时,内核会释放原来ramdisk映像所占用的内存空间,你可以把它看作是从物理内存的实地址处将initrd映像文件复制到内核自身的虚拟内存中(以内核ramdisk设备的形式存在)的一个过程。

代码清单6-11中最后需要说明的一点是:挂载/proc文件系统,该挂载命令中的proc单词看似多余;下面的命令同样有效:

  1. mount -t proc none /proc 

注意,上面mount命令将设备名部分改为none,该挂载命令忽略了设备名描述,是因为并没有实际的物理设备与proc文件系统相对应,该命令采用-t proc就足以将/proc文件系统挂载到/proc挂载点。使用前一个命令形式只是为了说明我们正在将一个内核虚拟设备(/proc文件系统)挂载到/proc挂载点,实际上挂载命令会忽略这个参数(设备名)。你可以选择自己喜欢的做法。

6.4.5 initrd探究

作为Linux引导过程的一部分,Linux内核必须找出并且挂载一个根文件系统。在引导过程的后期,内核通过一个名为prepare_namespace()的函数来决定挂载什么并且在哪里挂载。如果当前内核如图6-1所示的配置启用了initrd支持,同时Linux内核命令也按这样进行了配置,那么内核就会对压缩的initrd映像文件进行解压缩,同时最终会从物理内存中把该映像文件内的内容复制到一个ramdisk设备(/dev/ram)里。这个时候,我们就在内核的ramdisk下有了一个恰当的文件系统。在将该文件系统的内容读到ramdisk之后,内核会将该ramdisk设备挂载为它的根文件系统。最后,内核生成一个内核线程来执行initrd映像 中的linuxrc脚本文件。

当执行linuxrc脚本之后,内核会卸载initrd并且继续执行系统引导的最后阶段。如果当前系统就有一个叫作/initrd的根设备,那么Linux会将initrd文件系统挂载到该路径下(在本书中称为挂载点);如果该目录(/initrd)不存在,那么initrd映像只是简单地被丢弃。

如果内核命令行中包含一个指定ramdisk的命令行参数root=(例如root=/dev/ram0),在前面内容中描述的initrd处理过程就会有两个重要的改变。首先,对于可执行文件linuxrc的处理会跳过;其次,Linux内核不会再试着挂载其他文件系统作为其根文件系统,也就是说你会有这样的一个Linux系统,即以initrd作为唯一的根文件系统。在对系统进行小型化配置的时候这样做是非常有益的。在这样的系统下,唯一的根文件系统即为ramdisk。将/dev/ram0内容放到内核命令行中将使得完全的系统初始化以initrd作为最终的根文件系统而结束。

http://book.51cto.com/art/200910/158736.htm
原创粉丝点击