linux中initrd的含义,浅谈linux启动的那些事(initrd.img)

本文详细解析了Linux系统的启动流程,包括BIOS加载、MBR读取、BootLoader执行以及Initrd的作用。Initrd是Linux内核启动前在内存中创建的临时文件系统,用于加载必要的驱动模块,以便正确挂载真实的根文件系统。根据内核版本不同,Initrd有两种形式:image-initrd和cpio-initrd,它们在启动过程中承担着不同的职责。通过对Initrd的理解,有助于深入掌握Linux系统的启动机制。

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

本文记录下linux系统的启动过程,分析下每一步都作了什么。linux

1、linux系统的启动过程小程序

1.加载BIOS,上电自检。由于BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性windows

等。经过BIOS的设置,计算机就知道去读取哪一个硬件设备了。spa

2.读取MBR,即主引导记录。(这里有几个MBR中概念:DPT:分区表,通俗说就是硬盘上记录分区信息的表。PBR:硬盘分区操作系统

引导记录,就是具体到某个分区时,上边记录着这个分区的一些信息,详细了解可度娘。)它的大小是512字节,里面存放了预blog

启动信息、分区表等信息。系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制进程

到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。ip

3.Boot Loader。Boot Loader 就是在操做系统内核运行以前运行的一段小程序。经过这段小程序,咱们能够初始化硬件设备、建内存

立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操做系统内核作好一切准备。Boot Loaderit

有若干种,其中Grub、Lilo和spfdisk是常见的Loader。要了解GRUB的,可自行查阅资料。

4.Boot Loader加载内核,加载initrd。到此,这是本文要着重说明的地方。

2、什么是initrd

1.initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader

会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot

loader 配置了 initrd 的状况下,内核启动被分红了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成加载驱动模块

等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。这里提到的"某个文件",Linux2.6 内核会同之前版本内核的不

同,因此这里暂时使用了"某个文件"这个称呼。第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件

系统存储介质的驱动模块。咱们知道根文件系统能够存储在包括IDE、SCSI、USB在内的多种介质上,若是将这些设备的驱动都

编译进内核,能够想象内核会多么庞大、臃肿。

initrd分为两种,2.4内核及之前的版本中的initrd.img的文件须要先用zip方式解压获得 initrd文件。这里得到到的initrd文件已是

个标准的image文件了(这个文件咱们称为image-initrd),在linux下须要进行挂载,而后能够直接访问。2.5内核及其之后的版本

中的initrd.img文件(这里称为cpio-initrd), initrd.img 是个gz压缩文件,initrd.img更名为initrd.gz能用windows下的winrar或linux

下的gunzip解压,解压后会获得一个initrd文件。这个文件就是cpio格式的文件,只能在linux下用cpio命令解压,执行cpio -i < initrd

2.initrd具体干了什么。

这两种格式的initrd不仅是打包方式不一样,内部文件也有不一样。下面介绍下2种文件的区别。

image-initrd

(1) boot loader(通常你们经常使用的是grub,关于它的介绍能够到网上搜索)把 initrd.img 初始化成一个设备 /dev/intrd。接着boot

loader 把内核以及/dev/initrd的内容加载到内存。

(2) 在内核初始化过程当中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。

(3) 内核以可读写的方式把 /dev/ram0 设备挂载为原始的根文件系统。

(4) 若是 /dev/ram0 被指定为真正的根文件系统,那么内核不会执行(5)、(6)、(7)的操做,由于这下操做是为了帮内核加载最终

的根文件系统作的工做。

(5) 执行 initrd 上的 /linuxrc 文件,linuxrc 一般是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统

(6) /linuxrc 执行完毕,真正的根文件系统被挂载。

(7) 若是真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从 / 移动到 /initrd。不然若是 /initrd 目录不存在, /dev/ram0 将

被卸载。

(8) 在真正的根文件系统上进行正常启动过程 ,执行 /sbin/init。

linux2.4内核的 initrd 的执行是做为内核启动的一个中间阶段,也就是说 initrd 的 /linuxrc执行之后,内核会继续执行初始化代码。

2.6 内核同时支持 image-initrd 和 cpip-initrd。并且 image-initrd处理流程也是这样的。cpio-initrd

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

(2) 内核判断initrd的文件格式,若是是cpio格式。

(3) 将initrd的内容释放到/rootfs中。(rootfs自己也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等)

(4) 执行initrd中的/init文件,执行到这一点,内核的工做所有结束,彻底交给/init文件处理。也就是其实到了最后一步,

内核就已经完成了本身全部的工做,直接移交给initrd 的/init。

下图为两种模式的 比较

d72a325ea2f38ae69e117e33a10e3d8b.gif

本文主要记录了initrd到底作了什么,比较粗略。

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值