使用 Grub2 引导加密的分区

· 318 words · 2 minute read

单独的 /boot 很难看,我们一起修复它。

注意!

这不是任何产品的官方文档、帮助或使用说明,仅代表博主个人的经验总结,难免会有疏漏和错误之处。请务必结合官方文档进行阅读,以作补充。

注意!

博主对 Grub2 的理解甚为肤浅,本文仅供参考。建议自行阅读 Grub2 Manual 以了解它的全部工作方式。

本文针对 Grub2 撰写。除非特别说明,所有 Grub 均指代 Grub2。

Grub 引导流程 #

在开始之前,有必要了解一下 Grub 的引导流程,因为 Grub 是模块化的设计,对于各种文件系统(甚至包括加密)都有支持。Grub 的使用远没有 grub-installgrub-mkconfig 这么简单。

对于 BIOS 系统,Grub2 的引导流程有三个阶段,分别是:

  1. BIOS 读取 MBR 扇区,加载 boot.img
  2. boot.img 加载 core.img
  3. core.img 加载 /boot

这张图很好地说明了 BIOS 下的 Grub 启动流程:

https://unix.stackexchange.com/q/502287

之所以 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_CRYPTODISKy,并重新生成镜像(大部分情况下 grub-install 足矣)。例如:

grub-install --target=x86_64-efi --recheck --removable --efi-directory=/mnt --boot-directory=/boot --debug

有两点需要注意:

  1. --efi-directory 不必和 --boot-directory 相同。前者是 ESP 分区,不能加密且必须使用 FAT 文件系统。后者是包含 Grub *.mod 的目录。如设计一节所述,你可以自行考虑是将 /boot 和并到根分区,或单独划分到一个加密的分区中。
  2. --removable 不是必须的。如果选择,它会将 EFI 可执行文件放置到 $ESP/EFI/Boot/BOOTX64.efi 中(这是 UEFI Spec 定义的缺省地址)。 对于 BIOS 安装,整个过程大同小异,如:
grub-install --target=i386-pc --recheck --boot-directory=/boot /dev/sda --debug

之后,需要生成配置。注意,配置应存放在 /boot 中,而不是 ESP 中。

总结 #

本文主要涉及两个重点:

  1. Grub 的引导流程和组成
  2. Grub 对加密分区的支持和如何操作

如果想深入了解,可以自行查找相关手册和资料。

注意:

  1. Grub 的解密过程似乎比较慢。
  2. Grub 解密后,如果 /boot 位于根分区,需要再次解密。建议使用 Keyfile 的方式。

参考文献 #

  1. https://wiki.archlinux.org/index.php/GRUB
  2. https://www.gnu.org/software/grub/manual/grub/grub.html
  3. https://unix.stackexchange.com/questions/502287/what-are-the-differences-between-the-purposes-of-core-img-and-files-in-boot
  4. https://wiki.osdev.org/GRUB
  5. https://wiki.debian.org/Grub2