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系统启动流程概览的主要内容,如果未能解决你的问题,请参考以下文章