使用 Grub2 引导加密的分区
单独的 /boot 很难看,我们一起修复它。
注意!
这不是任何产品的官方文档、帮助或使用说明,仅代表博主个人的经验总结,难免会有疏漏和错误之处。请务必结合官方文档进行阅读,以作补充。
注意!
博主对 Grub2 的理解甚为肤浅,本文仅供参考。建议自行阅读 Grub2 Manual 以了解它的全部工作方式。
本文针对 Grub2 撰写。除非特别说明,所有 Grub 均指代 Grub2。
Grub 引导流程
在开始之前,有必要了解一下 Grub 的引导流程,因为 Grub 是模块化的设计,对于各种文件系统(甚至包括加密)都有支持。Grub 的使用远没有 grub-install 和 grub-mkconfig 这么简单。
对于 BIOS 系统,Grub2 的引导流程有三个阶段,分别是:
- BIOS 读取 MBR 扇区,加载 
boot.img boot.img加载core.imgcore.img加载 /boot
这张图很好地说明了 BIOS 下的 Grub 启动流程:
之所以 Grub 需要 core.img,是由于 boot.img 有 512 字节的限制,所以它无法读取任何文件系统。
对于 core.img,它同样非常小(<= 1M)。它包含所有需要挂载 /boot 的模块,挂载并加载他们。该镜像是动态生成的。
/boot 则包含 Grub 的大部分内容(绝大多数都是 .mod)。这些 .mod 文件将被 Grub 加载。
对于 UEFI 博主没有查到很多资料(Grub2 的手册中鲜有提及 grubx64.efi,不过它仍然是被 grub-mkimage 生成的)。理论上整个过程大同小异。
加密 /boot 的设计
在实际开始之前,需要明确加密 /boot 的设计:
对于 BIOS 引导(GPT),之前的分区表为:
| 分区 | 类型 | 注释 | 
|---|---|---|
| (MBR 扇区) | N/A | 存储 boot.img | 
      
| /dev/sda1 | BIOS Boot | 存储 core.img | 
      
| /dev/sda2 | Linux | Root,包含 /boot | 
BIOS GPT 原设计
流程:BIOS 引导 GPT 的 MBR 扇区中的 boot.img -> sda1 中的 core.img -> sda2 /boot 中的 *.mod。当然,/boot 也可以处于单独分区中,流程大同小异。
加密后的分区表为:
| 分区 | 类型 | 注释 | 
|---|---|---|
| (MBR 扇区) | N/A | 存储 boot.img | 
      
| /dev/sda1 | BIOS Boot | 存储 core.img | 
      
| /dev/sda2 | Linux | LUKS 1 加密的 Root,包含 /boot | 
      
BIOS GPT 新设计
流程大同小异,不过 sda2 中的 /boot 是被加密的,所以 core.img 需要重新生成使它包含用于解密的模块。core.img 会提示用户解密 sda2,并读取 *.mod。后续流程雷同。
对于 UEFI 引导(GPT),之前的分区表为:
| 分区 | 类型 | 注释 | 
|---|---|---|
| /dev/sda1 | ESP | 存储 BOOTX64.EFI 和 /boot 的剩余内容 | 
      
| /dev/sda2 | Linux | Root,不 包含 /boot | 
UEFI 原设计
整个过程与 BIOS 类似,除了 BIOS 会引导 Grub EFI 并挂载 /boot 以外,没有区别。需要注意的是,我们一般会将 /boot 中其他 Grub 模块放到 ESP 中以方便维护,不过这理论上是可以豁免的,也就是说,ESP 可以仅包含 BOOTX64.EFI,并将其他内容放进 Root。
加密后的分区表为:
| 分区 | 类型 | 注释 | 
|---|---|---|
| /dev/sda1 | ESP | 存储 BOOTX64.EFI | 
      
| /dev/sda2 | Linux | LUKS1 加密的 Root, 包含 /boot | 
UEFI 新设计
整个过程与 BIOS 类似,不再赘述。需要注意的是,这里除了将 /boot 加密,并将它放进了整个被加密的 Root 中。读者可以根据自身情况选择加密 /boot 分区或和并 /boot 和根分区。
兼容性
在实际操作前需要确认兼容性。如果你的 LUKS 分区是 LUKS2,需要降级到 LUKS1,因为 Grub 不支持 LUKS2。降级是 LUKS 官方支持的操作,所以无需担心。
实际操作
实际操作相对容易。首先,修改 Grub 配置的 GRUB_ENABLE_CRYPTODISK 为 y,并重新生成镜像(大部分情况下 grub-install 足矣)。例如:
grub-install --target=x86_64-efi --recheck --removable --efi-directory=/mnt --boot-directory=/boot --debug
有两点需要注意:
--efi-directory不必和--boot-directory相同。前者是 ESP 分区,不能加密且必须使用 FAT 文件系统。后者是包含 Grub*.mod的目录。如设计一节所述,你可以自行考虑是将/boot和并到根分区,或单独划分到一个加密的分区中。--removable不是必须的。如果选择,它会将 EFI 可执行文件放置到$ESP/EFI/Boot/BOOTX64.efi中(这是 UEFI Spec 定义的缺省地址)。 对于 BIOS 安装,整个过程大同小异,如:
grub-install --target=i386-pc --recheck --boot-directory=/boot /dev/sda --debug
之后,需要生成配置。注意,配置应存放在 /boot 中,而不是 ESP 中。
总结
本文主要涉及两个重点:
- Grub 的引导流程和组成
 - Grub 对加密分区的支持和如何操作
 
如果想深入了解,可以自行查找相关手册和资料。
注意:
- Grub 的解密过程似乎比较慢。
 - Grub 解密后,如果 /boot 位于根分区,需要再次解密。建议使用 Keyfile 的方式。