带有 root LUKS 加密的 GRUB 引导加载程序:仅 grub shell

Ecc*_*coB 10 linux bootloader grub disk-encryption

我希望得到有关解决 GRUB 引导加载程序问题的帮助和提示。\n我有一个带有 root LUKS 加密的系统。意味着除了带有引导加载程序的分区之外,整个系统都位于加密的 LUKS 容器中。我不确定可能的问题出在哪里,所以我告诉你更多细节。

\n\n

系统更新后,GRUB 现在挂在 GRUB shell 中(不是救援模式)。

\n\n

不过,我可以手动启动:

\n\n
insmod cryptodisk\ninsmod luks\ninsmod lvm\ninsmod ext2\ncryptomount -a\nset root=(lvm/system-root)\nlinux (lvm/system-boot)/vmlinuz-[...]-generic root=/dev/system/root\ninitrd (lvm/system-boot)/initrd.img-[...]-generic\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的系统上运行 lsblk 如下所示:

\n\n
nvme0n1           259:0    0 953,9G  0 disk\n\xe2\x94\x9c\xe2\x94\x80nvme0n1p1       259:1    0   450M  0 part\n\xe2\x94\x9c\xe2\x94\x80nvme0n1p2       259:2    0   100M  0 part  /boot/efi\n\xe2\x94\x9c\xe2\x94\x80nvme0n1p3       259:3    0    16M  0 part\n\xe2\x94\x9c\xe2\x94\x80nvme0n1p4       259:4    0  97,9G  0 part\n\xe2\x94\x94\xe2\x94\x80nvme0n1p5       259:5    0 839,4G  0 part\n  \xe2\x94\x94\xe2\x94\x80system        253:0    0 839,4G  0 crypt\n    \xe2\x94\x9c\xe2\x94\x80system-boot 253:1    0   512M  0 lvm   /boot\n    \xe2\x94\x9c\xe2\x94\x80system-swap 253:2    0  16,1G  0 lvm   [SWAP]\n    \xe2\x94\x94\xe2\x94\x80system-root 253:3    0 822,8G  0 lvm   /\n
Run Code Online (Sandbox Code Playgroud)\n\n

p1、p3、p4 属于已安装的 Windows 10。\np2 是 fat32 EFI 系统分区\np5 是 luks 加密系统,具有启动、交换和根分区。

\n\n

也许 Grub 无法加载 grub.cfg?

\n\n

我以为Grub在/boot/efi/grub/grub.cfg中的p2分区中找不到配置文件。

\n\n

但如果是这种情况,手动执行配置文件应该会成功。所以我在启动时在grub shell中执行(使用自动完成,所以路径应该是正确的):

\n\n
configfile (hd0,gpt2)/grub/grub.cfg\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我只是得到了一个清除的 grub shell(没有任何错误)。

\n\n

为什么我认为 grub 找不到 grub.cfg 是因为 EFI 文件夹中的 grub 配置文件的内容(根据我对 corecctly 的理解,它首先加载):\n/boot/efi/EFI/ubuntu/grub.cfg :

\n\n
search.fs_uuid db041d94-37fa-42a6-b2f3-87572a38f23c root lvmid/uWUnvj-b70J-Gfam-Tfr3-87I3-GQAP-bL2Lym/gEpImK-yuWK-W6Ip-v5KF-ZGKm-8GZS-ALhXxF \nset prefix=($root)\'/grub\'\nconfigfile $prefix/grub.cfg\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里它寻找的UUID(列表在最后)是加密的启动分区之一。这看起来很奇怪:在我输入密码之前,grub 不应该看到它吗?

\n\n

但由于我手动加载配置文件的命令不起作用,我想这不是我的问题。

\n\n

检查 /etc/default/grub

\n\n

所以它可能是我的配置文件:\n我无法判断这个文件有多正确,所以这里是该文件的摘要内容:

\n\n
GRUB_DEFAULT=0\nGRUB_TIMEOUT_STYLE=menu\nGRUB_TIMEOUT=10\nGRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`\nGRUB_CMDLINE_LINUX_DEFAULT=""\nGRUB_ENABLE_CRYPTODISK=y\n\nGRUB_CMDLINE_LINUX="cryptdevice=UUID=8d82f654-43fd-40ba-a185-1ead48838f54:system root=/dev/system/system-root resume=/dev/system/system-swap ro"\n\nGRUB_PRELOAD_MODULES="luks cryptodisk lvm ext2"\n
Run Code Online (Sandbox Code Playgroud)\n\n

对我来说,这看起来还不错。cryptdevice 的 UUID 看起来不错。\n我尝试将“/dev/system/system-root”更改为\n“/dev/system/system”,因为这是运行系统时的路径,但没有任何效果。\ni还运行了 update-grup 和grub 安装。

\n\n

此外,我还安装了 grub-emu(grub 引导加载程序的模拟器)。\n这至少向我显示了 gurb 菜单。当选择启动 ubuntu 的条目时,我至少收到一些错误:

\n\n
error: no such cryptodisk found.\nerror: no such device: db041d94-37fa-42a6-b2f3-87572a38f23c.\nerror: can\'t find command `linux\'.\nerror: can\'t find command `initrd\'.\n
Run Code Online (Sandbox Code Playgroud)\n\n

什么可以帮助我

\n\n
    \n
  • 当然,请指出问题并告诉我修复方法。\n由于我现在必须处理它,所以我对 grub 的引导过程感到好奇:
  • \n
  • 我不明白/boot/efi/EFI/ubuntu/grub.cfg 的内容。
  • \n
  • 这里($root)的内容是什么?为什么它要寻找加密分区?
  • \n
  • 在哪里确定该文件中的内容?
  • \n
  • 即使存在阻止系统启动的错误,为什么它至少不向我显示 grub 菜单?
  • \n
\n\n

非常感谢,\nEcco

\n\n

附加内容

\n\n

/boot/efi/grub/grub.cfg 的内容可以在https://pastebin.com/D1X7jPsS找到

\n\n

UUID(我省略了 Windows 特定分区)

\n\n
    \n
  • /dev/nvme0n1p2: UUID="2885-45AC" TYPE="vfat" PARTLABEL="EFI 系统分区" PARTUUID="1043df12-d11d-4023-bf6a-6acc2919c06f"
  • \n
  • /dev/nvme0n1p5:UUID =“8d82f654-43fd-40ba-a185-1ead48838f54”类型=“crypto_LUKS”PARTLABEL =“系统”PARTUUID =“2457b24a-7695-4737-ae46-5687aca3ab01”
  • \n
\n\n

LUKS 容器的 UUID

\n\n
    \n
  • /dev/mapper/system: UUID="X7XHJG-pQ21-edgj-d73H-kK8Z-DxM8-eXBCh6" TYPE="LVM2_member"
  • \n
  • /dev/mapper/system-root: LABEL="root" UUID="07e1d1e4-cd00-42dd-96cf-4f99864d0b7f" TYPE="ext4"
  • \n
  • /dev/mapper/system-swap: UUID="02664e3e-3ba7-4a03-8b03-eb0335ca40f9" TYPE="交换"
  • \n
  • /dev/mapper/system-boot: LABEL="boot" UUID="db041d94-37fa-42a6-b2f3-87572a38f23c" TYPE="ext4"
  • \n
\n

Ecc*_*coB 5

最后它再次起作用: cmd refreshgrub成功了 该命令将文件 /boot/efi/EFI/ubuntu/grub.cfg 的内容更改为:

search.fs_uuid 2885-45AC root 
set prefix=($root)'/EFI/ubuntu/grub'
configfile $prefix/grub.cfg
Run Code Online (Sandbox Code Playgroud)

这比以前更有意义:搜索未加密的分区。但现在更大的 grub.cfg 文件存储在另一个文件夹中,这没关系。

现在显示菜单,但启动失败,我必须在 /etc/default/grub.cfg 中更改以下行:

GRUB_CMDLINE_LINUX="cryptdevice=UUID=8d82f654-43fd-40ba-a185-1ead48838f54:system root=/dev/system/root resume=/dev/system/swap ro"
Run Code Online (Sandbox Code Playgroud)