系统引导是通过BIOS开始的,而BIOS又可分为传统的 Legacy BIOS 和新兴的 UEFI BIOS。那他们有什么区别呢?
- BIOS 写入到主板上的固件(写入到硬件的程序),启动时,它会加载CMOS信息,检测硬件配置,进行自检,初始化硬件,然后寻找能启动的硬盘并读取启动硬盘中的系统引导程序(Boot loader)。
- Legacy BIOS 只能识别MBR分区表格式的硬盘。
- UEFI BIOS 可同时识别MBR分区和GPT分区格式的硬盘。当然,对于微软来说,UEFI BIOS引导的Windows系统只能安装在GPT磁盘中。
一、系统引导(Boot Loader)的2个阶段
Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,最终达到启动操作系统内核的目的。
磁盘主引导记录MBR中虽然可以存放Boot loader,但由于其只有512B大小,无法实现加载系统内核的功能,即使是GPT硬盘也没有足够的扇区来存储加载系统内核所需的数据。因此,为解决这个问题,系统引导是通过先后加载2段代码(也就是2个阶段)来完成任务的。而IPL中存放的只是第一阶段的代码。
1.第一阶段(IPL,Initial Program Loader)
这一阶段其实是为BIOS+MBR引导准备的,也就是称之为 主引导程序(一级引导程序) 阶段,这个主引导程序必须要被安装在启动扇区的(MBR 或者 boot sector)的IPL部分,大小为446B 。
主引导程序(IPL)的作用为:找到 分区表(DPT) 中的活动主分区(也叫激活主分区,注意MBR程序只会在MBR中的分区表中查找活动分区,即Windows只能安装在主分区;Linux无此限制),从而进一步找到该活动分区的引导扇区(分区第一个扇区)中的分区引导记录(PBR) ,紧接着载入PBR中记录的启动管理器。具体来说有以下几个功能:
- 提供引导选项:用户可以选择不同的开机项目(如安全模式、急救模式等),这也是多重引导(不是多系统引导)的重要功能;
- 载入核心文件:直接指向可开机的程序区段(启动管理器+系统内核)来开始操作系统;
- 转交给其他的Boot loader:将开机管理功能转交给其他的 boot loader 负责(实现多系统引导)。
注意:Boot loader主引导程序(IPL)只能识别自己的系统分区内可启动的内核文件,或者其他系统分区的 Boot loader。
对于EFI+GPT引导方式来说,这一阶段的工作(MBR+IPL+DPT+PBR)都交给第二阶段了,仅仅是找到EFI分区,然后读取其中的启动管理器。
2.第二阶段(SPL,second program loader)
这一阶段为主程序加载配置阶段,主要通过启动管理器来加载所有配置文件与相关的环境参数文件(一般来说,配置文件与启动管理器都是放在 /boot 内),然后根据配置文件定位并加载OS内核。如果有多个系统,配置文件就会有多个启动项,相应的启动管理器也会提供选择菜单,并根据用户选择来决定加载哪个boot loader。
二、启动管理器(Boot Manager)
不同类型的操作系统一般有不同的启动管理器,即使是同一类型的操作系统也可以选择使用不同的启动管理器。启动管理器实际分为2个部分,往往对应着启动程序的两个阶段。
- 第一部分一般位于MBR格式磁盘的MBR扇区的IPL部分,或者GPT格式磁盘的LBA0逻辑扇区的IPL部分。
- 第二部分一般位于MBR格式磁盘根目录下的二进制程序(如win10的bootmgr)或者GPT格式磁盘的EFI分区中*.efi,通常我们说的启动管理器就是指的第二部分的这个程序。
几种常用的启动管理器:
- NTLDR :Windows NT时代的启动管理器。通过/boot.ini启动配置文件来管理启动菜单,可以引导grub等其它引导程序。该启动管理器不支持UEFI启动(也就是不能通过EFI方式引导系统)。
- BOOTMGR :Windows Vista以后的系统使用的启动管理器。功能上比NTLDR强大一些,支持VHD,WIM文件的挂载。Legacy BIOS模式下的启动管理器为/bootmgr,启动配置文件为过/boot/bcd。UEFI模式下的启动管理器在/efi/boot/bootmgfw.efi,通过/efi/microsoft/boot/bcd文件来管理启动菜单。但在UEFI环境下它不能引导其它的启动管理器如grub(也就是若装双系统只能为双windows系统)。
- GRUB4DOS :多系统引导程序,GNU GRUB 的一个分支,有一个强大的shell,可以通过命令行进行引导。目前只有Legacy BIOS模式下的引导文件,不支持UEFI启动,一般情况下通过/menu.lst来管理启动菜单。
- GRUB2.0 :多系统引导程序,GNU GRUB的主线项目,有一个强大的shell,可以通过命令行操作。Legacy BIOS模式下启动管理器为/g2ldr.mbr,通过/grub/grub.cfg来配置启动菜单项;UEFI模式下引导文件为/efi/boot/grubx64.efi,一般也是通过/grub/grub.cfg来配置启动菜单项。
三、系统引导原理
学完上面的内容,再来看系统引导,只要一个流程图就能理解了。
1. Legacy BIOS + MBR 引导
引导过程:Legacy BIOS -> 第一阶段引导(MBR -> IPL -> DPT -> PBR) -> 第二阶段引导(启动管理器+启动配置数据文件) -> 内核加载
开机,Legacy BIOS自检,读取MBR磁盘的第一个扇区MBR,加载IPL,加载DPT,找到PBR,载入启动管理器,内核加载,引导系统
MBR磁盘分区格式下,只允许有一个分区是活动的,因此启动管理器必须存放在活动的主分区内,这样才能找到系统载入程序。
2. UEFI BIOS + GPT 引导原理
引导过程:UEFI BIOS –> 类似第一阶段(GPT -> EFI/ESP分区) –> 启动管理器+启动配置数据文件 -> 内核加载
开机,UEFI BIOS自检,读取GPT磁盘分区表,找到EFI分区,载入启动管理器,内核加载,引导系统
ESP分区 :efi system partition,EFI系统分区,一个fat32格式的分区。UEFI BIOS从这里加载UEFI引导器和应用程序。要想以UEFI BIOS引导系统,应当建立ESP分区。
3.多系统引导原理
boot sector :启动扇区,每个磁盘和分区都有一个boot sector,且总是位于磁盘或者分区的第一个扇区,占用512字节。而磁盘的boot sector还有一个名字叫做MBR,因此狭义的boot sector 通常指的是分区的boot sector了,启动扇区主要用来存放Boot loader(系统引导程序)。
如果某个分区有操作系统,则该操作系统会将启动文件写入到各自所在分区的boot sector中,并可以选择写入到MBR中。因此安装多个系统时,MBR、活动分区会不断的被覆盖。如果启动管理器能够识别其他分区引导扇区中的启动程序,则可以根据用户选择将控制权交给相应的启动管理器从而实现多重引导。
- 在 Linux 系统安装时,你可以选择将 boot loader 安装到 MBR 去,也可以选择不安装。 如果选择安装到 MBR 的话,那理论上你在磁盘MBR和分区的boot sector 都会保有一份boot loader 程序。
- Windows 安装时,将自动(你无法选择)将 MBR 与 boot sector 都安装一份boot loader。
Linux的启动管理器(GRUB2)能够识别Windows的启动管理器(BOOTMGR),但Windows的启动管理器则无法识别Linux的启动管理器。又由于Windows在装系统时,默认覆盖MBR和活动分区。所以先装Linux再装windows,则无法提供linux的引导菜单来进行系统引导。