关于LInux启动流程大概分为五个部分(我自己总结的)
1.POST(Power On Self Test)自检部分
在设备通电之后,设备会自动启动自检的程序,该程序会检查CPU、内存、主板、硬盘、CMOD芯片等硬件;
自检失败:一般会发出声音等提示音,或led的闪烁,给检修人员提供检修信息;
自检成功:则会到达第二部分
2.查找可启动设备,加载主引导目录(MBR)
开机自检完成后,CPUCPU首先读取位于CMOS中的BIOS程序,按照BIOS中设定的启动次序(Boot Sequence)逐一查找可启动设备,找到可启动的设备后,去该设备的第一个扇区中读取MBR;
MBR:存在于可启动设备的0磁道0扇区,占用512字节,主要用于告诉计算机从选定的可启动设备的哪个分区来加载引导加载程序(Boot Loader);
MBR(Master Boot Record)由以下三个部分组成:
①Boot Loader 占用446字节,存储有操作系统(OS)相关信息,如操作系统名称,内核位置等,它的主要功能是加载内核到内存中运行;
②Partition Table 分区表,占用64字节,每个主分区占用16字节,所以一块硬盘只能有4个主分区;
③分区表有效性标记占用2字节,CPU将MBR读取至内存中,运行GRUB会把内核加载到内存中去执行;
3.当GRUB加载内核时,还没有根目录,如何寻找内核(由第二部分引申的)
这个问题通过GRUB的配置进行了解,一般在/boot/grub/grub.cfg在该文件中会看到类似:
root (hd0, 0):这一行实际上是指定了/目录的所在的位置,但这个根并不是真正的根,而是/所在的位置,可以理解成/boot是处在(hd0,0) /boot,而这里的(hd0,0)指的是第一个磁盘的第一个分区;
Kernel /指定内核路径
Initrd:/指定initrd路径
如下图:
GRUB不是通过文件系统来访问内核的,因为此时内核还没有启动,不存在文件系统, 而是直接访问第一个磁盘的第一个分区(通过MBR中的分区表来识别分区),而识别MBR中的分区的文件系统,则是由GRUB通过加载自身携带的系统文件来实现的;
grub启动过程分为三个步骤:
①BIOS加载MBR中的GRUB(GRUB第一阶段的文件),而GRUB只有446字节,无法实现太多功能;
②用来加载识别文件系统的文件,识别完系统后才可以找到/boot目录;
③寻找内核并加载到内存中
4.加载内核,初始化initrd
上述操作,GRUB把内核加载到内存后展开并运行,GRUB的任务已经结束了,接下来内核将会接管并完成 探测硬件–>加载驱动–>挂载根文件系统–>切换至根文件系统(rootfs)–>运行/sbin/init完成系统初始化。GRUB在加载内核的同时,也把initrd加载到内存中并运行;
initrd的作用:是一个虚拟的根文件系统;通过zcat指令对其操作,展开后是一个“/”目录的内容;所以它的功能就是将内核与真正的根建立联系,内核通过它加载根文件系统的驱动程序,然后以读写方式挂载根文件系统,至此, 内核加载完成。
5.执行init程序
内核并加载进内存运行并以读写方式挂载完根文件系统后,执行第一个用户进程init;
该程序的初始化过程中,进行多项设置:
1、获得网络环境
2、挂载设备
3、开机启动画面Plymouth(取替了过往的 RHGB)
4、判断是否启用SELinux
5、显示于开机过程中的欢迎画面
6、初始化硬件
7、用户自定义模块的加载
8、配置内核的参数
9、设置主机名
10、同步存储器
等等·····
最后,系统初始化完成后,init给出用户登录提示符(login)或者图形化界面;
以上是全部内容,若有不足,请指正,感谢观看!!!