User:Xiaoxi654/sandbox

From ArchWiki

/boot 加密

GRUB 还专门支持从加密的 /boot 启动。这需要解锁一个 LUKS 块设备,来读取配置文件以及载入 initramfs内核。这个选项试图解决未加密的 boot 分区问题。

提示: /boot 不需要 专门放到一个单独的分区,它也可以就留在系统的根目录 / 下面。
警告: GRUB 2.0.6 对 LUKS2 提供了有限的支持,参见 #LUKS2 以获取详细信息。

要启用这个功能,正常使用 LUKS/boot 所在的分区加密,然后在 /etc/default/grub 中添加如下选项:

/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y

grub-install 使用这个选项来生成 core.img,所以在修改这个选项之后要重新安装 grub

如果没有进一步的修改,你需要两次输入一个密码:第一次是为了让 GRUB 在启动伊始解锁 /boot 的挂载点,第二次是在 initramfs 的要求下解锁根文件系统。你可以用 keyfile 来避免密码输入过程。

警告:
  • 如果你想要 生成主配置文件,确保 /boot 已经挂载好了。
  • 为了进行与 /boot 的挂载点有关的系统更新,确保在进行更新之前已经对加密的 /boot 进行了解锁和挂载。如果使用了独立的 /boot 分区,这个可以通过使用 crypttab 和一个 keyfile 在启动的时候自动完成。
注意:
  • 如果你使用了特别的键盘映射,默认安装的 GRUB 是不知道的。这关系到如何输入密码来解锁 LUKS 块设备。请查阅 GRUB/Tips and tricks (简体中文)#为早期启动手动配置核心映像
  • 如果你遇到问题没法显示输入密码的界面(与 cryptouuid, cryptodisk相关的错误,或者 "device not found"),可以试着重新安装 GRUB,并在 grub-install 命令的尾部加上 --modules="part_gpt part_msdos"
提示: 你可以使用 pacman hooks 来在升级时涉及到 /boot 中的文件的时候自动挂载它。
LUKS2

GRUB 2.06 对 LUKS2 提供有限的支持。参见 GRUB bug #55093

提示: 你可以使用 grub-improved-luks2-gitAUR,这个包已经完成 LUKS2 的补丁支持。
  • 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 normalnormal 继续启动即可。

如果你确定你输入了正确的解锁口令,但是它立即返回了 Invalid passphrase,请确保你指定了正确的加密模块。使用 cryptsetup luksDump /dev/nvme0n1p2 来确认