User:Xiaoxi654/sandbox
/boot 加密
GRUB 还专门支持从加密的 /boot
启动。这需要解锁一个 LUKS 块设备,来读取配置文件以及载入 initramfs 和内核。这个选项试图解决未加密的 boot 分区问题。
/boot
不需要 专门放到一个单独的分区,它也可以就留在系统的根目录 /
下面。要启用这个功能,正常使用 LUKS 将 /boot
所在的分区加密,然后在 /etc/default/grub
中添加如下选项:
/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y
grub-install 使用这个选项来生成 core.img
,所以在修改这个选项之后要重新安装 grub。
如果没有进一步的修改,你需要两次输入一个密码:第一次是为了让 GRUB 在启动伊始解锁 /boot
的挂载点,第二次是在 initramfs 的要求下解锁根文件系统。你可以用 keyfile 来避免密码输入过程。
- 如果你使用了特别的键盘映射,默认安装的 GRUB 是不知道的。这关系到如何输入密码来解锁 LUKS 块设备。请查阅 GRUB/Tips and tricks (简体中文)#为早期启动手动配置核心映像
- 如果你遇到问题没法显示输入密码的界面(与 cryptouuid, cryptodisk相关的错误,或者 "device not found"),可以试着重新安装 GRUB,并在
grub-install
命令的尾部加上--modules="part_gpt part_msdos"
。
/boot
中的文件的时候自动挂载它。LUKS2
GRUB 2.06 对 LUKS2 提供有限的支持。参见 GRUB bug #55093。
- Argon2id 与 Argon2i PBKDFs 不被支持,只有 PBKDF2 可以使用。
grub-install
不支持创建可以用于解锁 LUKS2 的镜像。参考下面的文档或是 grub-gitAUR 以获取详细信息。
按照 #安装 所述的方式使用 grub-install
以安装 GRUB,但是这时生成的 EFI 二进制并不支持 LUKS2,所以需要替换掉它。
创建 grub-pre.cfg
,将 /dev/nvme0n1p2
替换为对应的内容。
# 将 ... 替换为 `lsblk -no TYPE,UUID /dev/nvme0n1p2 | awk '$1=="part"{print $2}' | tr -d -` 输出的内容 set crypto_uuid=... cryptomount -u $crypto_uuid # 如果你使用 LVM,把 crypto0 替换为 lvm/NameOfVolume set root=crypto0 set prefix=($root)/boot/grub insmod normal normal
如果你使用 LVM,那么把 lvm
加到如下命令的参数中。另外根据需求也可以把 ext2
替换为 btrfs
:
$ grub-mkimage -p /boot/grub -O x86_64-efi -c grub-pre.cfg -o /tmp/grubx64.efi luks2 part_gpt cryptodisk gcry_rijndael pbkdf2 gcry_sha256 ext2
将文件复制到 ESP:
# install -v /tmp/grubx64.efi esp/EFI/GRUB/grubx64.efi
如果你在启动过程中输入了错误的解锁口令并进入了 GRUB rescue shell,尝试使用 cryptomount -a
以挂载所有加密分区,或是使用 cryptomount -u $crypto_uuid
以挂载指定的分区。然后和正常的恢复过程一样,使用 insmod normal
和 normal
继续启动即可。
如果你确定你输入了正确的解锁口令,但是它立即返回了 Invalid passphrase
,请确保你指定了正确的加密模块。使用 cryptsetup luksDump /dev/nvme0n1p2
来确认