一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
在 UEFI 之前的 BIOS 时代,操作系统的 bootloader 是存放在主引导记录(MBR)中的,但由于 MBR 只有512个字节,容量受限,所以 UEFI 中引入了一个新的系统分区 ESP (EFI System Partition) ,该分区用来存储操作系统的 bootloader 和 EFI 驱动程序等数据,当计算机启动后,UEFI 固件从该分区中加载所需要的硬件驱动,执行 bootloader 启动指定的操作系统。
一、efi分区的内容
UEFI启动时,首先会查找硬盘中的EFI分区。EFI分区一般为FAT32格式,被标记为ESP。EFI不需要为第一个分区。
以下是安装了ubuntu和UOS两个linux系统之后的EFI分区内容。
root@hollowman-F117:/boot/efi/EFI# tree
.
├── BOOT
│ ├── BOOTX64.EFI
│ ├── bootx64.efi-1635292977.bak
│ ├── grub.cfg
│ ├── grub.efi
│ ├── grubx64.efi
│ └── shimx64.efi
├── ubuntu
│ ├── grub.cfg
│ ├── grub.efi
│ ├── grubx64.efi
│ └── shimx64.efi
└── UOS
├── BOOTX64.CSV
├── fbx64.efi
├── grub.cfg
├── grub.efi
├── grubx64.efi
├── mmx64.efi
└── shimx64.efi
UEFI 标准定义了一种可执行文件格式,所有的 UEFI 固件都能够执行以这种格式编写的代码,操作系统 bootloader 都采用这种格式编写,比如 Windows10操作系统的 bootloader 叫做 boot{架构}.efi 如 BOOTX64.efi,linux操作系统的bootloader叫做grub{架构}.efi 如 grubx64.efi。这些bootloader文件都存放在 EFI 系统分区的 Boot 文件夹下,如果一台机器上安装了多个厂商的操作系统, EFI 系统分区的 Boot 目录中就会有多个对应的bootloader。
开机后,主板固件中的程序(UEFI boot manager)会读取执行 bootloader 来启动指定的操作系统。
二、看看里面都有些什么配置。
可以分析出grub.cfg是配置文件。.EFI,.efi为二进制文件,负责读取和处理配置文件信息,*.bak为备份文件。
root@hollowman-F117:/boot/efi/EFI# cat ./BOOT/grub.cfg
search.fs_uuid f711c1e0-6649-4706-935f-20e61a58ad16 root hd0,gpt5
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
root@hollowman-F117:/boot/efi/EFI# cat ./ubuntu/grub.cfg
search.fs_uuid f711c1e0-6649-4706-935f-20e61a58ad16 root hd0,gpt5
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
root@hollowman-F117:/boot/efi/EFI# cat ./UOS/grub.cfg
search.fs_uuid f711c1e0-6649-4706-935f-20e61a58ad16 root hd0,gpt5
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
可以看出,BOOT,ubuntu,UOS三个目录内的grub.cfg内容相同,也就是都指向了同一个引导文件,那这个文件配置有表示什么呢?
第一行表示:查找第一个磁盘(hd0)的第五个gpt(gpt5),也就是就是/dev/sda5。
第二、三行表示:设置configfile,也就是将引导文件设置为第一个磁盘,第五个gpt的boot/grub/grub.cfg
三、分析efi的作用
当系统从bios读取内存等数据之后,将引导权交给efi,再由efi进行引导设置,也就是交给第一个磁盘,第五个gpt的boot/grub/grub.cfg来进行系统引导。至此efi工作完成,grub引导开始工作。
Secure Boot
安全启动解决的问题就是 rootkit 攻击问题。 UEFI 规范规定了固件可以包含一系列签名,并拒绝运行未签名或签名与固件中包含的签名不一致的 EFI 可执行文件,通俗地讲,安全启动就是使用非对称加密和数字签名技术来确保整个启动链的安全,所有不合法的 UEFI 执行程序和驱动程序都不允许执行,这样就解决了操作系统加载前的启动安全问题。当然这是一个可选项,用户可以在 UEFI 配置界面关闭 Secure Boot。
四、启动知识学习
GRUB2在BIOS平台上的常规启动步骤是这样的:BIOS --> boot.img[MBR] --> core.img[MBR gap/embedding area/BIOS Boot Partition] --> 设置"prefix root cmdpath"环境变量 --> 加载"normal.mod"模块[同时还包括它所依赖的 terminal crypto extcmd boot gettext 模块] --> 执行"normal $prefix/grub.cfg"命令
GRUB2在UEFI平台上的常规启动步骤是这样的:UEFI --> core.img[BOOTX64.EFI/BOOTX86.EFI] --> 设置"prefix root cmdpath"环境变量 --> 加载"normal.mod"模块[同时还包括它所依赖的 terminal crypto extcmd boot gettext 模块] --> 执行"normal $prefix/grub.cfg"命令
如果在加载"normal.mod"模块这一步出现故障,那么你将进入GRUB2的'救援模式',而不是常规的'普通模式'。在救援模式中,GRUB只自动设置了"cmdpath prefix root"三个环境变量,并且只能使用"insmod ls set unset"四个命令。只有当额外的模块被加载之后,才可以使用一些其它的命令,变量,解析器,驱动程序。通常来说,进入救援模式可能意味着你的GRUB2没有正确安装。
GRUB2命名规则
(fd0) 第一软盘
(hd0) 第一硬盘[大多数U盘与USB接口的移动硬盘以及SD卡也都被当作硬盘看待]
(hd1,1) 第二硬盘的第一分区(通用于MBR与GPT分区)
(hd0,msdos2) 第一硬盘的第二MBR分区,也就是传统的DOS分区表
(hd1,msdos5) 第二硬盘的第五MBR分区,也就是第一个逻辑分区
(hd0,gpt1) 第一硬盘的第一GPT分区
(cd) 启动光盘[仅在从光盘启动GRUB时可用]
(cd0) 第一光盘