Linux启动流程分析及无法正常开机的解决办法

第一部分:Linux启动流程一览

一.Linux启动流程一览
1.加载BIOS的硬件信息与自我检测(自检),并根据设置读取第一个可启动的设备
2.读取第一个启动设备内的MBR(主引导记录)的启动引导程序(grub2,spfdisk等程序)
3.根据启动引导程序的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序
4.在硬件驱动成功后,Kernel主动调用systemd程序,并以default.target流程启动
·systemd执行sysinit.target初始化系统及basic.target准备操作系统
·systemd启动multi-user.target下的本机与服务器服务
·systemd执行multi-user.target下的/etc/rc.d/rc/local文件
·systemd执行multi-user.target下的getty.target及登录服务
·systemd执行graphical需要的服务

第二部分:流程详细分析

一.BIOS
启动整个系统首先要做的是让系统去加载BIOS,(Basic Input Output System),并通过BIOS程序去加载CMOS的信息,并且借由CMOS内的设置值取得主机的各项硬件配置,例如CPU与接口设备的沟通频率,启动设备的查找顺序,硬盘的大小与类型,系统时间等

在取得这些消息之后BIOS还会进行自我启动检测,然后开始执行硬件检测的初始化,并设置PnP设备,之后再定义出可启动的设备顺序,接下来就会开始进行启动设备的数据读取了

由于我们系统软件大多放置到硬盘种,所以BIOS会指定启动的设备好让我们可以读取磁盘中的操作系统内核文件。但由于不同的操作系统它的文件系统格式不同,因此我们必须要以一个启动引导程序来处理内核文件加载(load)的问题,因此这个启动引导程序就被称为boot loader,这个boot loader就安装在了启动设备的第一个扇区中,也就是我们一直谈到的MBR(主引导记录)

二.boot loader的功能
loader的最主要功能是要识别操作系统的文件格式,并据以加载内核到内存中去执行。由于不同操作系统的文件格式不一致,因此每种操作系统都有自己的boot loader,用自己的loader才有办法加载内核文件

这里就引申出了一个问题,即多重操作系统—在一台主机上面安装多种不同的操作系统

由上我们可以了解
必须要使用自己的loader才能够加载属于自己的操作系统内核,但是系统的MBR只有一个,那我们怎么才可以在同一台主机上同时安装linux和windos呢?

其实每个文件系统都会保留一块启动扇区(boot sector)提供操作系统安装boot loader,而通常操作系统默认都会安装一份loader到它的根目录所在的文件系统的boot sector上。如果我们在一台主机上面安装Windows和Linux后,该boot sector,boot loader与MBR的相关性有点像下图

Linux启动流程分析及无法正常开机的解决办法_第1张图片

如上图所示,每个操作系统默认会安装一个boot loader到它自己的文件系统中,(图上显示就是每个filesystem的左下角的方块),而在Linux系统安装时,你可以选择将boot loader安装到MBR,也可以选择不安装。如果选择安装到MBR的话,那理论上你在MBR与boot sector都会保存一份boot loader程序。至于Windows安装时,它默认会主动地将MBR与boot sector都装上一份boot loader。所以,你会发现安装多重操作系统时,你的MBR常常会被不同的操作系统的boot loader所覆盖

我们刚刚提到的问题还是没有解决:虽然各个操作系统都可以安装一份boot loader到它的boot sector中,这样操作系统可以通过自己的boot loader来加载自己的内核。问题是系统的MBR只有一个。你要怎么执行boot sector中的loader呢?下面我们来看一下boot loader的主要功能

boot loader的主要功能如下
1.提供选项:用户可以选择不同的启动项,这也是多重引导的重要功能
2.加载内核文件:直接指向可启动的程序区域来启动操作系统
3.转交给其他loader:将启动管理功能转交给其他loader负责

由于具有选项功能,因此我们可以选择不同的内核来启动,而由于具有控制权转交的功能,因此我们可以加载其他boot sector中的loader。不过windows的loader默认不具有控制权转交的功能,因此我们不能使用windows的loader来加载Linux的loader

这也是为什么我们一般要先安装windows再装linux的原因

先安装linux,后安装windows的话,windows的boot loader会覆盖掉MBR中linux 的boot loader,而windows的loader又不能将控制权转交给linux,所以这样就无法启动linux只能启动Windows了

先安装windows,后安装linux的话,linux的loader覆盖掉MBR中windows中的loader,linux的loader可以将控制权转交给windows所以windows和linux都可以正常启动

三.加载内核检测硬件
当我们借由boot loader的管理而开始读取内核文件之后,接下来Linux就会将内核解压缩到内存当中,并且利用内核的功能,开始测试与驱动各个周边设备,包括存储设备,CPU,网卡,声卡等。此时Linux内核会以自己的功能重新检测一次硬件,而不一定会使用BIOS检测到的硬件信息。这也就是说,内核此时才开始接管BIOS后的工作。那么内核的文件在哪里?一般来说,他会被放置到/boot里面,并且取名为/boot/vmlinuz

四.第一个程序systemd及使用default.target进入启动程序分析
在内核加载完毕,进行完硬件检测与驱动程序加载后,此时你的主机硬件应该已经准备就绪了。此时内核会调用第一个程序那就是systemd,使用pstree查看时会发现systemd的PID为1!

systemd最主要的功能就是准备软件执行的环境,包括系统的主机名,网络设置,语言设置,文件系统格式及其他服务的启动等。所有的操作都会通过systemd的默认启动服务集合,亦即是/etc/systemd/system/default.target来规划

第三部分 Linux启动可能遇到的问题及解决方案

Linux系统无法开机及其解决办法

你可能感兴趣的:(Linux启动流程分析及无法正常开机的解决办法)