linux系统启动流程概览

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux系统启动流程概览相关的知识,希望对你有一定的参考价值。

 

 作为一名Linux运维人员,我们需要对Linux的启动流程有一定的了解,在工作过程中,如果遇到了启动故障,我们就可以更加得心应手的进行故障排查。

 

 我们先大概描述一下整个启动过程,如下图:


技术分享

 

 

 上述过程为整个启动流程的大体流程,每个步骤具体做了什么,我们可以参考如下总结:

 

1、POST 

 加电自检 power-on self test ( POST)  ,加电后,固化在固件中的指令被加载到内存中,cpu

从内存读取这些指令,这些指令会对各个硬件进行检查,查看这些硬件是否能够正常运转。

 

2、BIOS(Boot Sequence)

 还记得我们在bios中设置的启动项吗,bios会找到启动项中第一个可以启动的设备一般情

况下都是设置从硬盘启动,bios会去扫描这些硬盘,从中发现可以启动的硬盘,发现存在mbr

的硬盘。

 

3、MBR(bootloader,446byte)

   读取第一个启动硬盘的MBR,mbr的前446个字节,就是grub引导程序的第一阶段,但是

单单的446个字节是无法完成所有引导工作的,这446个字节的唯一作用,就是找到grub引导

程序的下一阶段的代码,通过第1阶段,找到grub的第1.5阶段的代码,grub的第1.5阶段存放

在启动硬盘的0柱面上,启动硬盘的0柱面上不仅有grub的第1.5阶段,还有boot分区文件系统对

应的驱动,为什么需要boot分区文件系统的驱动?因为grub很大,grub还有第2阶段的代码,

grub的第2阶段代码就存放在/boot所在分区中,所以,如果我们如果想要得到完全的grub,

则必须能够进入boot分区中,想要挂载boot分区,就需要有boot分区对应的文件系统的驱动。

上述过程可以这样理解,我们通过grub stage 1 找到 grub stage 1.5,      再通过grub stage1.5找

到boot分区的驱动,挂载boot分区后,找到grubstage 2。

 

4、 Kernel

  boot分区被挂载,grub也完整了,grub继续工作,读取grub.conf文件,grub.conf文件中指定了

要加载的内核,加载boot分区中的内核文件到内存,并且在内存中解压,我们知道,linux最核心的内

核文件存放在/boot中,那么系统启动时肯定要读取/boot所在分区中的内核文件,但是,boot分区是

有文件系统的(此处我们假设boot是一个单独分区),如果想要能够使用boot分区,则必须获取boot

分区的文件系统对应的驱动,那么,我们是在什么时候获取了boot分区文件系统的驱动呢?就是在上

一步,grub的1.5阶段中,获取到了boot分区的驱动,我们在安装操作系统的时候,boot分区对应的文

件系统必须是标准的文件系统,比如ext文件系统,当我们确定了boot分区的文件系统以后,那么文件

系统的驱动的大小则同时被确定了,所以,grub stage1.5在哪里可以找到boot分区的驱动,也就可以

确定了。

 

5、 ramdisk或ramfs:initrd/initramfs  (伪根)

  在上一步中内核已经被加载到内存中,这个时候,内核应该去挂载根分区,但是这个时候内核遇到了问

题,根分区是存在文件系统的,如果想要使用根分区,内核必须获取根分区对应的文件系统的驱动,那么,

内核去哪里获取根分区对应的文件系统驱动呢,答案是从boot分区的initramfs*.img这个文件中去获得,

initramfs*.img这个文件是我们安装操作系统的时候生成的,我们在安装操作系统的时候,指定了根分区

使用哪种文件系统,所以initramfs*.img知道根分区对应的文件系统是什么,从而initramfs*.img也保存

了根文件系统对应的驱动,当initramfs*.img这个文件被加载到内存中,它会伪装成一个根文件系统,内

核需要获取到真正的根文件系统的驱动的时候,就会去这个伪根中查找,从而获取到真正的根分区的文件

系统对应的驱动,得到了真正的根分区的文件系统以后,就可以挂载并使用rootfs了。

 

6、(ROOTFS)init(/etc/inittab)(用户空间主导进程)

  bootloader将kernel和initrd/initramfs装载至内存,kernel和initrd位于boot分区,boot分区要是

一个基本的磁盘设备,以便bootloader访问并加载至内存,kernel在内存中解压,kernel获得控制权,

kernel访问initrd,kernel借助initrd中的驱动或者模块,最终访问到rootfs,在rootfs中找到/sbin/init,

用户空间中的程序的初始化由init完成。init读取配置文件/etc/inittab,执行/etc/rc.d/rc.sysinit初始化

脚本,初始化系统的指定进程。

 

 

 

 


本文出自 “学思行知” 博客,谢绝转载!

以上是关于linux系统启动流程概览的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统启动流程

linux系统启动流程,linux系统启动不了,启动出错怎么办?

Linux系统启动流程

Linux系统启动流程

Linux系统启动流程

Linux系统启动流程分析与关机流程