Ecc*_*coB 10 linux bootloader grub disk-encryption
我希望得到有关解决 GRUB 引导加载程序问题的帮助和提示。\n我有一个带有 root LUKS 加密的系统。意味着除了带有引导加载程序的分区之外,整个系统都位于加密的 LUKS 容器中。我不确定可能的问题出在哪里,所以我告诉你更多细节。
\n\n系统更新后,GRUB 现在挂在 GRUB shell 中(不是救援模式)。
\n\n不过,我可以手动启动:
\n\ninsmod 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\nnvme0n1 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\np1、p3、p4 属于已安装的 Windows 10。\np2 是 fat32 EFI 系统分区\np5 是 luks 加密系统,具有启动、交换和根分区。
\n\n我以为Grub在/boot/efi/grub/grub.cfg中的p2分区中找不到配置文件。
\n\n但如果是这种情况,手动执行配置文件应该会成功。所以我在启动时在grub shell中执行(使用自动完成,所以路径应该是正确的):
\n\nconfigfile (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\nsearch.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所以它可能是我的配置文件:\n我无法判断这个文件有多正确,所以这里是该文件的摘要内容:
\n\nGRUB_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\nerror: 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非常感谢,\nEcco
\n\n/boot/efi/grub/grub.cfg 的内容可以在https://pastebin.com/D1X7jPsS找到
\n\n最后它再次起作用: 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)