grub2有什么用 (grub2模式和正常模式区别)

这个系列主要介绍 GRUB ,GRUB是Linux生态圈最为重要的引导器,其地位不言而喻。GRUB分为早期的GRUB和现代的GRUB2,早期的GRUB已经被弃用,现在指的GRUB主要指的是GRUB2,所以后续GRUB主要指代GRUB2。在计算机启动后,经过 BIOS/UEFI 固件初始化后,系统就会将加载引导操作系统的工作交给引导器,在这里我们指的引导器是 GRUB 。后续将以 GRUB 指代引导器,这里不介绍其他引导器。

之前的文章介绍过 BIOS/UEFI 固件,也知道在BIOS中,BIOS会将MBR系统分区的第一个扇区加载到 0x7C00 的地址位置,然后跳转到这个地址执行,在BIOS系统中,系统第一个扇区作为MBR,MBR中的前446字节就包含了GRUB的部分代码。也就是说此时系统的控制权就交给了GRUB。由于第一个扇区的大小限制(一个扇区存放512个字节),所以在这个阶段GRUB指存放了最简单的代码。这个阶段主要用于负责将引出后续GRUB的工作。然后GRUB在第二个阶段会将后续的代码加载到内存中,这个阶段主要负责加载GRUB启动的内核所需要的数据,加载好后进入第三个阶段。在第三个阶段主要负责解压压缩的GRUB内核,将处理器切换到保护模式,然后将处理器的控制权交付给GRUB内核。由GRUB内核负责后续的引导工作。GRUB内核负责Linux内核的真实加载工作。

在而 UEFI 中,UEFI会查找EFI系统分区,从系统分区中获取EFI应用程序,在这个场景中,就不需要之前说的第一,第二个阶段。GRUB将GRUB内核直接编译为EFI应用程序,由UEFI直接运行。直接接入GRUB内核,由其负责后续的引导工作。

但在 UEFI 中有一个特殊的场景,现代的UEFI固件通常为了安全性支持安全启动的模式,这个模式下,引导的方式更加的复杂,我们这里介绍最为普遍使用的场景,通常各大计算机厂商支持UEFI固件启动,通常内置了微软的KEK,DB(至于这两个是什么,看后序文章的详细介绍)等秘钥信息,这些信息用于校验签发的程序是否授信。如果授信UEFI固件将会执行对应的UEFI应用。如果所有的应用都需要微软的秘钥,未免太过依赖,所以在Linux中引入了 Shim 机制。即自建自己的一套安全启动秘钥。在Linux只有 shim 需要经过微软的签发,后续的所有安全启动过程全部交给了 ShimShim 负责后续GRUB的引导,GRUB的EFI应用程序也只需要经过 Shim 签发的秘钥即可,但这样也有安全隐患。我们后续在说,这里我们只要知道 UEFI 固件将系统系统引导交给了 ShimShim 后续会校验GRUB程序是否经过安全信任而确认是否加载对应的GRUB程序。GRUB内核加载Linux内核同样也需要校验对应的Linux是否经过了Shim秘钥的签发。而内核加载模块同样也需要确认内核模块也经过了Shim秘钥的签发。

所以在这个系列中,我们将介绍两种GRUB的启动过程,分别是传统的BIOS和现代的UEFI两种启动方式。这个系列将分别详细介绍这两种模式。希望可以供大家参考。

这个系列不会介绍 GRUB 的详细使用,我只会从实现的角度介绍它,也不会像大妈一样万事俱到,不会再这里进行分析代码,我最讨厌看到网上一群喜欢拿着代码一行行的分析。在这里,我会首先介绍几个例子介绍GRUB的使用,然后介绍GRUB中的关键实现。希望通过这个系列我们可以知道发行版本的Linux如何使用GRUB引导系统系统以及如何建立自己的引导器。

对于BIOS/UEFI的引导,基于先介绍使用,然后介绍对应的调试方式,最后介绍相关的关键技术分析。这个系列主要介绍三个范围

  • GRUB基于BIOS的引导
  • GRUB基于UEFI的引导
  • GRUB基于UEFI安全启动的引导