博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux initrd与linuxrc
阅读量:4140 次
发布时间:2019-05-25

本文共 1861 字,大约阅读时间需要 6 分钟。

6.4.4 initrd的奥妙所在:linuxrc文件

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

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

#!/bin/sh   
 
echo 'Greetings: this is 'linuxrc' from Initial Ramdisk'  
echo 'Mounting /proc filesystem'  
mount -t proc /proc /proc  
 
busybox sh 

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

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

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

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

转载地址:http://umhvi.baihongyu.com/

你可能感兴趣的文章
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
Jackson Tree Model Example
查看>>
常用js收集
查看>>
如何防止sql注入
查看>>
springmvc传值
查看>>
在Eclipse中查看Android源码
查看>>
Android使用webservice客户端实例
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>