本文记录下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。
下图为两种模式的 比较

本文主要记录了initrd到底作了什么,比较粗略。
本文详细解析了Linux系统的启动流程,包括BIOS加载、MBR读取、BootLoader执行以及Initrd的作用。Initrd是Linux内核启动前在内存中创建的临时文件系统,用于加载必要的驱动模块,以便正确挂载真实的根文件系统。根据内核版本不同,Initrd有两种形式:image-initrd和cpio-initrd,它们在启动过程中承担着不同的职责。通过对Initrd的理解,有助于深入掌握Linux系统的启动机制。
&spm=1001.2101.3001.5002&articleId=117151560&d=1&t=3&u=c35bd85eb0cf4a1cbf9d2b6841d8e987)
1万+

被折叠的 条评论
为什么被折叠?



