linux2.4内核kernel对 Initrd 的处理流程

为了使读者清晰的了解Linux2.6内核initrd机制的变化,在重点介绍Linux2.6内核initrd之前,先对linux2.4内核的 initrd进行一个简单的介绍。

Linux2.4内核的initrd的格式是文件系统镜像文件, 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 执行以后,内核会继续执行初始化代码,我们后面会看到这是 linux2.4 内核同 2.6 内核的 initrd 处理流程的一个显著区别。

linux2.6 内核kernel对 Initrd 的处理流程

linux2.6 内核支持两种格式的 initrd,一种是前面 linux2.4 内核那种传统格式的文件系统镜像-image-initrd,它的制作方法同 Linux2.4 内核的 initrd 一样,其核心文件就是 /linuxrc。

另外一种格式的 initrd 是 cpio 格式的,这种格式的 initrd 从 linux2.5 起开始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init。

尽管 linux2.6 内核对 cpio-initrd和 image-initrd 这两种格式的 initrd 均支持,但对其处理流程有着显著的区别,下面分别介绍 linux2.6 内核对这两种 initrd 的处理流程。

cpio-initrd 的处理流程

1. boot loader 把内核以及 initrd 文件加载到内存的特定位置。

2. 内核判断initrd的文件格式,如果是cpio格式。

3. 将initrd的内容释放到rootfs中。

4. 执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。

image-initrd的处理流程

1. boot loader把内核以及initrd文件加载到内存的特定位置。

2. 内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。

3. 内核将initrd的内容保存在rootfs下的/initrd.image文件中。

4. 内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。

5. 接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。

6. .如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。

7. 执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。

8. /linuxrc执行完毕,常规根文件系统被挂载

9. 如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在, /dev/ram0将被卸载。

10. 在常规根文件系统上进行正常启动过程 ,执行/sbin/init。

通过上面的流程介绍可知,Linux2.6内核对image-initrd的处理流程同linux2.4内核相比并没有显著的变化, cpio-initrd的处理流程相比于image-initrd的处理流程却有很大的区别,流程非常简单。

cpio-initrd同image-initrd的区别与优势

cpio-initrd的制作方法更加简单 ,而传统initrd的制作过程比较繁琐,后面有详细介绍。

cpio-initrd的内核处理流程更加简化

通过上面initrd处理流程的介绍,cpio-initrd的处理流程显得格外简单,通过对比可知cpio-initrd的处理流程在如下两个方面得到了简化:

1. cpio-initrd并没有使用额外的ramdisk,而是将其内容输入到rootfs中,其实rootfs本身也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等步骤。

2. cpio-initrd启动完/init进程,内核的任务就结束了,剩下的工作完全交给/init处理;而对于image-initrd,内核在执行完 /linuxrc进程后,还要进行一些收尾工作,并且要负责执行真正的根文件系统的/sbin/init。

cpio-initrd的职责更加重要

cpio-initrd不再象image-initrd那样作为linux内核启动的一个中间步骤,而是作为内核启动的终点,内核将控 制权交给cpio-initrd的/init文件后,内核的任务就结束了,所以在/init文件中,我们可以做更多的工作,而不比担心同内核后续处理的衔 接问题。当然目前linux发行版的cpio-initrd的/init文件的内容还没有本质的改变,但是相信initrd职责的增加一定是一个趋势。

linux 内核 不用initrd,linux2.4/2.6内核kernel对Initrd的处理流程相关推荐

  1. linux提高nand速度,linux-2.6.31.1内核支持Nand Flash

    linux-2.6.31.1支持Nand Flash 目的:使NandFlash驱动同时支持64M, 256M或更高容量的NandFlash 将linux内核解压在/opt目录下,修改内核源码文件,添 ...

  2. linux 内核配置lcd,Linux-2.6.32.2内核在mini2440上的移植---添加LCD背光驱动

    移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 1,主机环境:VMare下CentOS 5.5 ,1G内存. 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linu ...

  3. linux内核没有iobuf,LINUX2.6.26.6内核下双口RAM的驱动函数测试成功!

    驱动程序: #include //#include #include #include #include #include #include #include //#include #include ...

  4. linux内核snat分析,Linux2.6.29.6内核netfilter代码中SNAT的过程跟踪

    内核netfilter是通过iptables进行进行过滤规则设置的,因此snat方可通过IPtables工具设置一定的规则来实现.为了得到snat的工作原理,这里介绍一下它的流程: 在挂钩点NF_IP ...

  5. 新增linux驱动并重新编译内核,【转】配置并编译内核[更新到linux-2.6.29.2]

    有关内核精简的内容,看3楼. 一.下载源代码和编译软件准备下载内核源代码:http://www.kernel.org/ 注意,点击2.6.29内核的F版,即完整版. 如果你懒得去网站点联接,运行下列命 ...

  6. linux 内核2.6.35.3,linux-2.6.35.3内核移植(s3c2440)

    忙乎了一个下午,总算忙乎出来了,不过前期大量的搜索工作别人已经完成. 大量参考:http://blog.csdn.net /huihui1988/archive/2010/08/09/5799500. ...

  7. Y410P用虚拟机装Linux系统,OK6410、Linux2.6.36内核移植,DM9000 驱动移植

    对照这个结构体  将那些进行修改,注意  by  acanoe   的语句为修改重点. // add by acanoe 2 &s3c_device_nand,//这一语句为添加nand  设 ...

  8. Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(1)

    移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 1,主机环境:VMare下CentOS 5.5 ,1G内存. 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linu ...

  9. linux内核编译如何选择cpu类型,Ubuntu内核编译和CPU Hot-Plug特性配置全过程及遇到问题记录...

    最近编译Palacios需要linux的内核支持cpu Hot-Plug(内存热插拔)特性,无奈我机器上安装的Ubuntu10.04系统默认不支持内存热插拔特性,所以需要修改配置文件并重新编译linu ...

最新文章

  1. java使用Maven加载JDBC:mysql-connector连接MySQL/MariaDB
  2. [2009.08.09]博客园北京俱乐部活动暨《博客园精华集:Web标准之道》现场签售通知...
  3. PCA与LDA两种降维方法原理的简要对比
  4. Scala入门到精通——第二十节 类型参数(二)
  5. leetcode 700. 二叉搜索树中的搜索 思考分析
  6. Dijkstra(迪杰斯特拉)算法的总结
  7. Vue学习笔记(六) 表单输入绑定
  8. ajax连接mysql数据库查询数据_ajax动态查询数据库数据并显示在前台的方法
  9. FragmentSharedFabTransition
  10. (附源码)RN Demo
  11. VSCode Latex Workshop 设置 XeLatex 编译
  12. 包装严重的IT行业,作为面试官,我是如何甄别应聘者的包装程度
  13. c语言vc怎么改变背景板颜色,VC OnCtlColor函数来修改控件背景颜色
  14. Bitmovin首席执行官Stefan:开发者正在构建视频产品的未来
  15. vue中 给v-for渲染的元素动态添加移除类名
  16. 视频去水印工具有什么 哪个去水印软件好用
  17. 前端安全跨站脚本攻击
  18. java谷歌填表_chrome自动填表会遮挡input中背景图的问题解决方法
  19. 计算机一级考试选择题知识点,计算机一级选择题必背知识点有哪些?快来了解一下...
  20. Nilsson's sequence score算法解决八数码问题解释

热门文章

  1. Matrix Analysis With Mathematica
  2. 单单训练营 第四期 第八课 行业和岗位
  3. Visual Studio各版本工程文件之间的转换(VS低版本打开高版本、高版本打开低版本项目问题)
  4. java cas volatile_VolatileCAS浅析
  5. IO存储,硬盘,文件系统相关常识总结
  6. 100句关于生命的名人名言
  7. 为什么枚举类是单例模式?
  8. FPGA综合实验 05 - | VGA彩条信号显示控制电路设计
  9. App换量攻略|实操技巧+换量神器,app换量推广
  10. Carnac源码下载编译(win10,VS2022)