单独的 /boot 很难看,我们一起修复它。
注意!
这不是任何产品的官方文档、帮助或使用说明,仅代表博主个人的经验总结,难免会有疏漏和错误之处。请务必结合官方文档进行阅读,以作补充。
注意!
博主对 Grub2 的理解甚为肤浅,本文仅供参考。建议自行阅读 Grub2 Manual 以了解它的全部工作方式。
本文针对 Grub2 撰写。除非特别说明,所有 Grub 均指代 Grub2。
Grub 引导流程 #
在开始之前,有必要了解一下 Grub 的引导流程,因为 Grub 是模块化的设计,对于各种文件系统(甚至包括加密)都有支持。Grub 的使用远没有 grub-install
和 grub-mkconfig
这么简单。
对于 BIOS 系统,Grub2 的引导流程有三个阶段,分别是:
- BIOS 读取 MBR 扇区,加载
boot.img
boot.img
加载core.img
core.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 的方式。