author:
- luixiao1223
title: 操作系统是如何启动的
前言
最近装各种linux系统,对于系统引导的问题十分的头疼.因为分区格式不同,主板系统不同导致的各种安装失败案例非常多.在这个过程中我查阅了不少资料终于搞清楚系统引导的具体过程.以及什么主板系统,要分配什么样的分区有了一个大概的脉络.现在将这些资料和经验总结下来.
计算机主板系统
其实我们对一台计算安装系统之前第一件事情就是要确定自己的主板系统时什么?
对于你装虚拟机也是一样的.要确定虚拟机使用的是什么样的主板系统.一般pc的主板系统有两个BIOS和UEFI
BIOS系统
这是一个比较老的主板系统.它就是经常被提到的bios设置的界面系统.老主板的计算机开机自检就是靠它.目前新的主板都不再使用它了.具体原因请查阅它的相关资料.这里就不在赘述了.
UEFI系统
现在大量的新主板都是使用的UEFI系统.这个系统的比bios有一定的优越性.具体原因也请查资料即可.我们现在只需要明白有两种主板系统即可.一种老一种新.因为不同的主板系统对我们安装linux系统而言有很大影响.
主板上的cmos
这是主板上的一块存储介质.它上面纪录了很多参数,其中有一个重要参数跟我们要讲的linux启动有关.这个参数就是第一启动盘.它纪录了第一块启动盘是那一块.主板系统自检通过后会去读取第一启动盘上的第一个扇区,进行操作系统引导.
磁盘分区格式
我们也只在这里针对pc最主流的两种分区格式MBR和GPT.因为不同的分区格式也会影响到linux系统安装的具体历程和步骤.所以有必要介绍一下磁盘pc现下最主流的磁盘分区格式.他们也是一新一旧.在安装系统到磁盘的时候你要看是一块新硬盘还是已经分区的硬盘.新硬盘的话你要选择分区类型.这个分区类型就是MBR或者GPT
MBR
这是相较而言比较老的分区格式.MBR的第一个扇区512bytes里面的固定信息十分重要.这个扇区有一个重要的名字叫做Master
Boot Record也就是MBR的全程.还是首先来看看MBR的磁盘布局.
+--------------|----|----|----|----|--|------------|---------------|--------------|---------------|--------------+
| | | | | | | | | | | |
| 446 | 16 | 16 | 16 | 16 |2 | post-gap | partition1 | partition2 | partition3 | partition4 |
| | | | | | | | | | | |
+--------------|----|----|----|----|--|------------|---------------|--------------|---------------|--------------+
第一扇区
- 446 记录引导程序的stage1代码
- 4个16bytes的分区记录.这也是为什么MBR分区只能允许4个主分区的原因.这个分区纪录主要纪录分区的起始位置和终点位置等信息.详细的参数请查阅资料.
- 2bytes的标记位.
所有这些数据加起来正好是一个扇区的大小512bytes.
post-gap
这个部分时第一扇区和第一个分区的间隔区域,不属于任何的分区.通常是因为磁盘希望对齐留下的一块自由区块.这块东西有它的重要用处.等到后面讲到系统启动的时候再来讲.这里只知道MBR分区有一个这样自由区存在即可.
partitions
这是分区的实际位置.通常你可以用MBR记录四个分区,仅此而已不能再多了.因为第一扇区的分区记录只有4个.
GPT
由于MBR只支持4个分区,所以它能支持的磁盘容量不超过2.2T.而现代的计算机磁盘已经可以非常大了.MBR就不能够满足这一需求.于是GPT应运而生.我们还是先来看看GPT的布局.
+---------------------------+
| Protective MBR |
+---------------------------+
| Primary GPT Header |
+------|------|------|------+
|Entry1|Entry2|Entry3|Entry4|
+------|------|------|------+
| |
| Entries 5-128 |
| |
+---------------------------+
| partition 1 |
+---------------------------+
| partition 2 |
+---------------------------+
| partition 3 |
+---------------------------+
| |
| Remaining Partitins |
| |
+------|------|------|------+
|Entry1|Entry2|Entry3|Entry4|
+------|------|------|------+
| |
| Entries 5-128 |
| |
+---------------------------+
| Second GPT Header |
+---------------------------+
Protective MBR
为了兼容老的MBR而设置的扇区
Primary GPT Header
纪录GPT的头的一些信息
Entries
这就是类似于MBR的分区纪录信息.这里不再是4个.而是可以纪录128.所以可以支持的磁盘非常大.
partitions
就是真正的分区.
尾部
尾部基本上时一个GPT纪录的备份.这是为了磁盘前面的纪录损坏时,灾难修复用的.
linux如何启动概述
现代linux一般都是使用grub2等工具来引导启动的.所以这里我只讲一下grub2.其他的工具自行查阅资料.原理基本上大同小异.我们来看看grub2是如何来引导启动linux的.但是主要分为两种开启方式bios系统方式,和UEFI系统方式
bios
- 主板系统(bios)自检,自检通过之后,主板系统会根据纪录在主板cmos上的第一启动盘的第一扇区上的程序开始进行操作系统引导.
- 这第一启动盘第一扇区上的纪录的程序就是grub2的stage1代码.我们通常把它叫做boot.img.
- boot.img会讲控制权交给,grub2的第二部分core.img.因为所有跳转关系,是grub2写入的.所以boot.img知道core.img的地址.
- core.img会调用grub2位于linux目录内/boot/grub里面文件的normal.mod.
然后这个normal.mod会读取/boot/grub/grub.cfg里面的配置文件. - 这个时候你就有了一个启动菜单,你选择启动什么normal.mod就启动你选择的那个linux
kernel并将控制权转交给它.
UEFI
值得注意的是,UEFI系统其实比bios系统复杂先进得多。它实际上是可以工作在CSM模式下的,就是可以读取MBR扇区,并按照bios的启动流程一样加载系统。你安装系统的时候,可以按照传统bios启动方式来安装。UEFI照样可以启动系统,这一点不用担心。除此之外,UEFI还可以按照它专有的启动方式来启动。这要比bios启动简单得多。
注意事项
- 如果是按照UEFI启动方式安装的系统,会有一个单独UEFI system
partition,并被打上标记eps。这个partition里面记录的就是引导程序。 - UEFI系统由于比bios复杂得多,它是有能力读取分区表信息的,而且还有能力读取里面的文件,并加载运行。
- 也就是UEFI系统启动,不需要读取第一扇区。
UEFI启动
UEFI系统读取UEFI system
partition里面的启动程序,开始引导即可。然后交给linux
kernel控制权。所以说UEFI的引导十分简单。
安装系统以及系统启动流程详述
还是老规矩,按照bios方式和UEFI方式分别讲述.因为他们并不一样.注意我们先来看一张表。讲述我们装系统的时候遇到的不同情况
MBR | GPT | |
---|---|---|
BIOS | BIOS-MBR | BIOS-GPT |
UEFI | UEFI-MBR | UEFI-GPT |
安装系统的时候一般你会遇到四种不同的情况。最为复杂的就是BIOS启动的时候系统如何安装的问题。稍不注意,可能出现启动器无法安装的问题。因为你的分区布局可能不对。导致无法安装启动器。
BIOS-MBR
对于bios启动来说最好是使用MBR分区格式。有了MBR分区,你不用太担心启动器安装不了的问题。因为MBR有一个post-gap区域。不属于任何分区。grub2会将boot.img安装到MBR里面,然后讲core.img安装到这个post-gap里面。这样你的linux系统就可以顺利启动了。
BIOS-GPT
对于使用bios启动,但是分区格式确实GPT的情况。要特别注意,因为GPT没有post-gap区域。所以core.img是无法安装到post-gap里面的。这种情况你需要专门开辟一个分区通常也不大2M左右,叫做bios-boot-partition.
core.img就可以被安装在这里。然后一切都正常的安装系统即可。
UEFI-GPT
- 对于UEFI系统模式启动linux来说主要是你要有独立的UEFI
system partition。所以说UEFI十分简单。 - 开辟一个FAT32格式的UEFI system
partition。然后标记位eps,并挂载到你的/boot目录下,或者/boot/efi里面。然后安装系统即可。
UEFI-MBR
因为UEFI需要一个UEFI system partition.而这个partition需要GPT分区.所以你必须在GPT分区下开辟这么一块分区.