没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1 initrd 概念:
initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader
初始化的内存盘。在 linux 内核启动前, boot loader 会将存储介质中的
initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该
内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动
被分成了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成
加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init
进程。这里提到的"某个文件",Linux2.6 内核会同以前版本内核的不同,
所以这里暂时使用了"某个文件"这个称呼,后面会详细讲到。第一阶段启
动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件系统
存 储 介 质 的 驱 动 模 块 。 我 们 知 道 根 文 件 系 统 可 以 存 储 在 包 括
IDE、SCSI、USB 在内的多种介质上,如果将这些设备的驱动都编译进内
核,可以想象内核会多么庞大、臃肿。
2 initrd 用途:
分成 4 类用途:
2.1. linux 发行版的必备部件
linux 发行版必须适应各种不同的硬件架构,将所有的驱动编译进内核是不现实的,initrd 技术是解决该问题的关
键技术。Linux 发行版在内核中只编译了基本的硬件驱动,在安装过程中通过检测系统硬件,生成包含安装系统硬
件驱动的 initrd,无非是一种即可行又灵活的解决方案。
2.2. livecd 的必备部件
同 linux 发行版相比,livecd 可能会面对更加复杂的硬件环境,所以也必须使用 initrd。
2.3. 制作 Linux usb 启动盘必须使用 initrd
usb 设备是启动比较慢的设备,从驱动加载到设备真正可用大概需要几秒钟时间。如果将 usb 驱动
编译进内核,内核通常不能成功访问 usb 设备中的文件系统。因为在内核访问 usb 设备时, usb 设备通常没有初
始化完毕。所以常规的做法是,在 initrd 中加载 usb 驱动,然后休眠几秒中,等待 usb 设备初始化完毕后再挂载
usb 设备中的文件系统。
2.4. 在 linuxrc 脚本中可以很方便地启用个性化 bootsplash。
3 Linux2.4 内核对 Initrd 的处理流程
为了使读者清晰的了解Linux2.6内核initrd机制的变化,在重点介绍Linux2.6内核initrd之前,先对linux2.4内
核的initrd进行一个简单的介绍。Linux2.4内核的initrd的格式是文件系统镜像文件,本文将其称为image-
initrd,以区别后面介绍的linux2.6内核的cpio格式的initrd。 linux2.4内核对initrd的处理流程如下:
3.1. boot loader把内核以及/dev/initrd的内容加载到内存,/dev/initrd是由boot loader初始化的设备,存储
着initrd。
3.2. 在内核初始化过程中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。
3.3. 内核以可读写的方式把 /dev/ram0 设备挂载为原始的根文件系统。
3.4. 如果 /dev/ram0 被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
3.5. 执行 initrd 上的 /linuxrc 文件,linuxrc 通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动,
以及加载根文件系统。
3.6. /linuxrc 执行完毕,真正的根文件系统被挂载。
3.7. 如果真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从 / 移动到 /initrd。否则如果 /initrd 目录不
存在, /dev/ram0 将被卸载。
3.8. 在真正的根文件系统上进行正常启动过程 ,执行 /sbin/init。 linux2.4 内核的 initrd 的执行是作为内核启动的一
个中间阶段,也就是说 initrd 的 /linuxrc 执行以后,内核会继续执行初始化代码,我们后面会看到这是 linux2.4 内
核同 2.6 内核的 initrd 处理流程的一个显著区别。
4 Linux2.6 内核对 Initrd 的处理流程
linux2.6 内核支持两种格式的 initrd,一种是前面第 3 部分介绍的 linux2.4 内核那种传统格式的文件系统镜像-
image-initrd,它的制作方法同 Linux2.4 内核的 initrd 一样,其核心文件就是 /linuxrc。另外一种格式的 initrd 是 cpio
格式的,这种格式的 initrd 从 linux2.5 起开始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,本
文将这种 initrd 称为 cpio-initrd。尽管 linux2.6 内核对 cpio-initrd 和 image-initrd 这两种格式的 initrd 均支持,但对其
处理流程有着显著的区别,下面分别介绍 linux2.6 内核对这两种 initrd 的处理流程。
cpio-initrd 的处理流程
4.1. boot loader 把内核以及 initrd 文件加载到内存的特定位置。
4.2. 内核初始化相关动作完成后,进行根文件系统创建。。。挂载时判断initrd的文件格式,如果是cpio格式。
4.3. 将initrd的内容释放到rootfs中。
4.4. 执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。
image-initrd的处理流程 《在2.6.32.46或者10代码中能看见此代码的工作。》
4.1. boot loader把内核以及initrd文件加载到内存的特定位置。
4.2. 内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。
4.3. 内核将initrd的内容保存在rootfs下的/initrd.image文件中。
4.4. 内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。
4.5. 接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。
4.6. .如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
4.7. 执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加
载根文件系统。
4.8. /linuxrc执行完毕,常规根文件系统被挂载
4.9. 如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在,
/dev/ram0将被卸载。
4.10. 在常规根文件系统上进行正常启动过程 ,执行/sbin/init。
通过上面的流程介绍可知,Linux2.6 内核对 image-initrd 的处理流程同 linux2.4 内核相比并没有显著的变化, cpio-
initrd
的处理流程相比于
image-initrd
的处理流程却有很大的区别,流程非常简单 ,在后面的源代码分析中,读者
更能体会到处理的简捷。
剩余10页未读,继续阅读
资源评论
哇………
- 粉丝: 1
- 资源: 38
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功