一、什么是initrd

initrd = initialized RAM disk,是一个启动时存在于内存的文件系统。

initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。

这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。

initrd的解释是initialized RAM disk,就是启动的时候由uboot来初始化内存,当做disk来使用。在uboot启动的时候,

uboot会将存储介质中(如Flash)的initrd文件加载到内存,内核启动时会在访问挂载的根文件系统前先访问该内存中的initrd文件系统。

在uboot配置了initrd的情况下,文件系统启动被分成两个阶段,

  • 第一阶段先执行initrd文件系统中的"某个可执行文件"(linuxrc或init,下面会讲到具体会执行哪一个),完成加载驱动模块等任务。
  • 第二阶段是挂载真正的根文件系统中,然后执行/sbin/init进程。

二、Linux启动一定要用initrd么?

不必,如果把需要的功能全都编译到内核中(非模块方式),只需要一个内核文件即可,initrd能够减小启动内核的体积并增加灵活性。
  如果你的内核以模块方式支持某种文件系统(例如ext3, UFS),而启动阶段的驱动模块(如jbd)放在这些文件系统上,内核是无法读取文件系统的,从而只能通过initrd的虚拟文件系统来装载这些模块。
  这里有些人会问: 既然内核此时不能读取文件系统,那内核的文件是怎么装入内存中的呢?答案很简单,Grub是file-system sensitive的,能够识别常见的文件系统。

三、initrd文件是怎么生成的?

使用mkinitrd命令,这个命令其实是一个Bash脚本

  #file `which mkinitrd`/sbin/mkinitrd: Bourne-Again shell script text executable该脚本先建立一个8M的空文件,并在此上建立一个文件系统,并拷贝相应的的文件。一个默认RedHat Fedora Core 2, 它的initrd是什么内容(跟系统的硬件相关)?# file initrd-2.6.5-1.358.imginitrd-2.6.5-1.358.img: gzip compressed data, from Unix, max compression# mv initrd-2.6.5-1.358.img initrd-2.6.5-1.358.gz# gzip -d initrd-2.6.5-1.358.gz# ll-rw-r--r-- 1 root root 8192000 Jan 14 11:32 initrd-2.6.5-1.358# mkdir /mnt/loop# mount -o loop initrd-2.6.5-1.356 /mnt/loop………… 中间修改此文件系统,等等…………# umount loop# cd /boot# gzip -9 initrd-2.6.5-1.356# mv initrd-2.6.5-1.356.gz initrd-2.6.5-1.356.img

四、处理流程

linux内核支持两种格式的文件系统镜像:传统格式的文件系统镜像image-initrd和cpio-initrd格式的镜像。
下面分别说明:

cpio-initrd的处理流程:

(执行流程可以对照下面博文的代码分析:linux的initrd机制和initramfs机制之根文件挂载流程:代码分析)
1.uboot把内核以及initrd文件加载到内存的特定位置。
2.内核判断initrd的文件格式,如果是cpio格式。
3.将initrd的内容释放到rootfs中。
4.执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。
可见对于cpio-initrd格式的镜像,它执行的是init文件

image-initrd的处理流程

1.uboot把内核以及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。
对于image-initrd格式的镜像,它执行的是linuxrc文件

两种格式镜像比较

  1. cpio-initrd的制作方法比image-initrd简单。
  2. cpio-initrd的内核处理流程相比image-initrd更简单,因为:
    a. 根据上面的流程对比可知,cpio-initrd格式的镜像是释放到rootfs中的,不需要额外的文件系统支持,而image-initrd格式的镜像先是被挂载成虚拟文件系统,而后被卸载,基于具体的文件系统
    b. image-initrd内核在执行完/linuxrc进程后,还要返回执行内核进行一些收尾工作,并且要负责执行真正的根文件系统的/sbin/init。

处理流程对比如下图所示:

参考链接:
https://blog.csdn.net/u012787604/article/details/121685547
https://www.cnblogs.com/weifuqin530/archive/2008/07/25/1251305.html

initrd是什么?相关推荐

  1. 制作initrd(2):update-initramfs和mkinitramfs脚本分析

    前一篇文章<制作initrd(1):向initrd内部更新驱动模块>提到更新initrd.img镜像时需要运行update-initramfs命令.起初以为是二进制文件,网上胡乱搜索一通发 ...

  2. linux内核生成img,linux内核探索:定制自己的initrd.img-转载并修改

    1. 什么是initrd.img,它有什么用? initrd.img是Linux启 动过程中很重要的一个文件,如果你编译内核时将一部分功能编译为可加载模块.如果系统的一些设备的驱动编译为可加载模,那么 ...

  3. linux 替换内核 img,查看更改linux内核initrd.img-Go语言中文社区

    2.6以前的版本采用的是ext2格式的initrd,2.6及以后是cpio包形式,具体来看下吧 2.6及以后版本内核 解包 查看ubuntu的grub.cfg文件 红框是root文件系统,挂载在根目录 ...

  4. linux xz 解压initrd.img,2016-8-28 linux基础学习——压缩解压缩及归档 while脚本

    文件管理命令----压缩解压缩及归档基本工具 压缩.解压缩命令 压缩格式:gz, bz2, xz, zip, Z 压缩算法:算法不同,压缩比也会不同: 早期 压缩: compress(压缩比很小): ...

  5. initrd映像文档的作用和制作

    RePrint:http://hi.baidu.com/wangpeng1314/blog/item/212e9e1752377f064b90a7f5.html 我们在安装新内核的时候,通常都会编辑l ...

  6. 解压Ubuntu的initrd.img的方法

    Ubuntu的initrd.img可以在/boot中找到,通常文件名后面还跟有很长的一串版本号. 为了保险起见,不直接操作原文件,而是把它复制到自己的家目(home)录中.如果你是用root帐号登录的 ...

  7. 详解Linux Initrd

    在Linux操作系统中,有一项特殊的功能--初始化内存盘INITRD(INITial Ram Disk)技术,而且内核支持压缩的文件系统映像.有了这两项功能,我们可以让Linux系统从小的初始化内存盘 ...

  8. 【每日一记3.21】initrd

    initrd,既initial RAM disk(Linux出事RAM磁盘),实在系统引导过程中挂载的一个临时根文件系统.用来支持两阶段的引导过程.initrd文件中包含了各种可执行的程序和驱动,用来 ...

  9. 修改initrd做miniLinux

    开始试着修改initrd做miniLinux,需要向其中添加命令,慢慢完善.但是用ldd命令查看哪些大串的库再拷贝实在是纠结~ 自动实现一下: 描述: 输入命令后,自动寻找命令位置,将命令拷到对应根位 ...

  10. fedora利用vmlinuz和initrd制作linux启动u盘,Fedora 17的U盘安装方法

    使用U盘来安装Fedora 17,并使用Windows引导.以前写过U盘安装Fedora 16,http://www.linuxidc.com/Linux/2011-11/47296.htm .但是这 ...

最新文章

  1. [Google App Engine] Hello, world!
  2. [ZJOI2008][BZOJ1036] 树的统计count
  3. WINDOWS上KAFKA运行环境安装
  4. 【WPF】提高InkAnalyer手写汉字识别的准确率
  5. 20个有趣的Linux命令
  6. Outlook 2003解除附件下载限制
  7. Async和Await简介
  8. 安卓4.2系统_五分钟了解 海贝(HiBy)R6PRO 安卓智能Hi-Fi播放器
  9. 【Cocos2dx】资源目录,播放背景音乐,导入外部库
  10. 启动虚拟机连接教程,连接教学,一级初级开发虚拟机中的简单指令
  11. 给DW2XLS源代码增加了同时导出多个dw的代码(合并多个dw)
  12. 使用BatteryHistorian分析和优化应用电量
  13. 【转载】红外遥控HS0038B接法
  14. sh_gamit报错:error reading station a priori constrains
  15. 安卓毕业设计选题基于Uniapp+SSM实现的智能课堂管理APP在线学习网
  16. 谈个人网站发展及赚钱
  17. fiddler抓包 破解微信投票
  18. 2020-2021考研南京大学软件学院学习经验分享(英语90,842自命题110+)
  19. 如何区别API、REST API、RESTful API和Web Service之间的异同
  20. ASP.NET MVC:多语言的三种技术处理策略

热门文章

  1. 用计算机怎么做蒙特卡洛模拟,一篇文章讲明白蒙特卡洛模拟
  2. 《超能失控(导演剪辑加长版)》[BD-RMVB.720p.中英双字] 2012最新科幻
  3. 国内最实用的十六个网站
  4. 研究生电子设计大赛参赛心得
  5. 11月11日大师献给各位染成茜色的坂道FANS的礼物—— あかね色に染まる坂是怎么破解的?
  6. Leetcode - 542. 01 矩阵
  7. MongoDB大中华区首席架构师唐建法:关系型数据库到MongoDB的战略迁移
  8. Linux默认启动项修改
  9. mipmap以及滤波相关的理解
  10. 旗帜软件工作室2021年年度交接会会议总结