一起养成写作习惯!这是我参与「掘金日新计划·4月更文挑战」的第3天,点击查看活动详情。
在UEFI之前的BIOS时代,操作系统的bootloader是储存在主引导记录(MBR)中的linux site:infoq.cn,但因为MBR只有512个字节,容量受限,所以UEFI中引入了一个新的系统分区ESP(EFISystemPartition),该分区拿来储存操作系统的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。
开机后linux 输入法,显卡固件中的程序(UEFIbootmanager)会读取执行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内容相同,也就是都指向了同一个引导文件,那这个文件配置有表示哪些呢?
第一行表示:查找第一个c盘(hd0)的第五个gpt(gpt5)linux安装磁盘分区,也就是就是/dev/sda5。第二、三行表示:设置configfile,也就是将引导文件设置为第一个c盘,第五个gpt的boot/grub/grub.cfg
三、分析efi的作用
当系统从bios读取显存等数据然后,将引导权交给efi,再由efi进行引导设置,也就是交给第一个c盘,第五个gpt的boot/grub/grub.cfg来进行系统引导。至此efi工作完成,grub引导开始工作。
SecureBoot
安全启动解决的问题就是rootkit功击问题。UEFI规范规定了固件可以包含一系列签名,并拒绝运行未签名或签名与固件中包含的签名不一致的EFI可执行文件,浅显地讲,安全启动就是使用非对称加密和数字签名技术来确保整个启动链的安全,所有不合法的UEFI执行程序和驱动程序都不容许执行,这样就解决了操作系统加载前的启动安全问题。其实这是一个可选项,用户可以在UEFI配置界面关掉SecureBoot。
四、启动知识学习
来始于[Linux学习]grub引导文件
GRUB2在BIOS平台上的常规启动步骤是这样的:BIOS-->boot.img[MBR]-->core.img[MBRgap/embeddingarea/BIOSBootPartition]-->设置"prefixrootcmdpath"环境变量-->加载"normal.mod"模块[同时还包括它所依赖的terminalcryptoextcmdbootgettext模块]-->执行"normal$prefix/grub.cfg"命令
GRUB2在UEFI平台上的常规启动步骤是这样的:UEFI-->core.img[BOOTX64.EFI/BOOTX86.EFI]-->设置"prefixrootcmdpath"环境变量-->加载"normal.mod"模块[同时还包括它所依赖的terminalcryptoextcmdbootgettext模块]-->执行"normal$prefix/grub.cfg"命令
假如在加载"normal.mod"模块这一步出现故障,这么你将步入GRUB2的'搜救模式',而不是常规的'普通模式'。在搜救模式中linux安装磁盘分区,GRUB只手动设置了"cmdpathprefixroot"三个环境变量,但是只能使用"insmodlssetunset"四个命令。只有当额外的模块被加载以后,才可以使用一些其它的命令,变量,解析器,驱动程序。一般来说,步入搜救模式可能意味着你的GRUB2没有正确安装。
GRUB2命名规则
(fd0) 第一软盘
(hd0) 第一硬盘[大多数U盘与USB接口的移动硬盘以及SD卡也都被当作硬盘看待]
(hd1,1) 第二硬盘的第一分区(通用于MBR与GPT分区)
(hd0,msdos2) 第一硬盘的第二MBR分区,也就是传统的DOS分区表
(hd1,msdos5) 第二硬盘的第五MBR分区,也就是第一个逻辑分区
(hd0,gpt1) 第一硬盘的第一GPT分区
(cd) 启动光盘[仅在从光盘启动GRUB时可用]
(cd0) 第一光盘