获得新系统后,我将 NVME 驱动器从旧系统移至新系统,两台机器均设置为使用 UEFI 启动。由于 EFI 设置是特定于机器的,我预计会遇到麻烦,并做好了准备 - 我从实时 USB 启动,进行了安装和 chroot 操作,并根据说明重新安装了 GRUB(在网络上随处可见,下面重复),之后重新启动后,我会进入 GRUB 命令提示符,但我不知道如何解决此问题 - 无论我做什么,如果我选择 Linux UEFI 启动项(如下所示),我都会收到 grub 提示符。如果我选择 Windows UEFI 启动项(这是双启动系统),它可以正常加载。
我总是可以通过键入启动 GRUB 菜单来从 GRUB 提示符启动 Linux 安装configfile (hd0,gpt6)/@/boot/grub/grub.cfg
,这样我就可以毫无问题地启动任何条目(我使用 BTRFS 作为根分区,并且/
位于子卷中@
- 这是非常标准的对于 Ubuntu 安装)。
这是当前的设置:
# efibootmgr --verbose
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0001,0005,0000,0002
Boot0000* UEFI Samsung SSD 970 EVO Plus 1TB S6P7NF0T423021F 1 HD(1,GPT,37b6d616-6865-44b1-a382-9987345e2cfa,0x800,0x32000)/File(\EFI\Boot\BootX64.efi)N.....YM....R,Y.
Boot0001* Neon HD(1,GPT,37b6d616-6865-44b1-a382-9987345e2cfa,0x800,0x32000)/File(\EFI\Neon\shimx64.efi)
Boot0002* UEFI HTTPs Boot PciRoot(0x0)/Pci(0x1f,0x6)/MAC(000000000000,0)/IPv4(0.0.0.00.0.0.0,0,0)/Uri()N.....YM....R,Y.
Boot0005* Windows Boot Manager HD(1,GPT,37b6d616-6865-44b1-a382-9987345e2cfa,0x800,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}....................
# ll /boot/efi/EFI/
total 6
drwx------ 6 root root 1024 Jul 26 12:38 ./
drwx------ 4 root root 1024 Jan 1 1970 ../
drwx------ 2 root root 1024 Aug 28 2022 Boot/
drwx------ 5 root root 1024 Jul 26 12:38 Dell/
drwx------ 4 root root 1024 Aug 28 2022 Microsoft/
drwx------ 2 root root 1024 Jul 24 20:01 Neon/
# cat /boot/efi/EFI/Neon/grub.cfg
search.fs_uuid 2886a665-f535-496e-a543-13c62983b0da root
set prefix=($root)'/@/boot/grub'
configfile $prefix/grub.cfg
# ll /dev/disk/by-uuid/
total 0
drwxr-xr-x 2 root root 120 Jul 26 13:20 ./
drwxr-xr-x 9 root root 180 Jul 26 13:20 ../
lrwxrwxrwx 1 root root 15 Jul 26 13:20 2886a665-f535-496e-a543-13c62983b0da -> ../../nvme0n1p6
lrwxrwxrwx 1 root root 15 Jul 26 13:20 80D9-5688 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Jul 26 13:20 82926928-1ed1-4a76-b0e8-d62a0171c1ee -> ../../nvme0n1p5
lrwxrwxrwx 1 root root 15 Jul 26 13:20 D8D6FA10D6F9EF1E -> ../../nvme0n1p4
# lsblk -e 7 -o name,fstype,size,fsused,label,partlabel,mountpoint,uuid,partuuid
NAME FSTYPE SIZE FSUSED LABEL PARTLABEL MOUNTPOINT UUID PARTUUID
nvme0n1 931.5G
├─nvme0n1p1 vfat 100M 58.8M EFI system partition /boot/efi 80D9-5688 37b6d616-6865-44b1-a382-9987345e2cfa
├─nvme0n1p2 16M Microsoft reserved partition fdc1478a-852d-4f33-8e22-24a2ea209726
├─nvme0n1p3 BitLocker 50.2G Basic data partition e8584ca9-db86-4bb1-abf7-424afe77bc94
├─nvme0n1p4 ntfs 517M D8D6FA10D6F9EF1E 5373ade9-ed41-4164-85e2-c28b7026c25f
├─nvme0n1p5 swap 30.5G [SWAP] 82926928-1ed1-4a76-b0e8-d62a0171c1ee d5d866a5-97d4-49bb-a182-6eec3abcba18
└─nvme0n1p6 btrfs 850.2G 440.5G linux /var/lib/docker/btrfs 2886a665-f535-496e-a543-13c62983b0da cb45a183-14d3-4a95-b89f-6b5e315609cd
我可以尝试通过以下方式重新安装:
- 删除有问题的 EFI 启动项:
efibootmgr -b 1 -B
- 重新安装引导加载到磁盘和EFI:
grub-install /dev/nvme0n1 --target x86_64-efi --efi-directory /boot/efi/ --bootloader-id Neon
- 更新 GRUB 配置(我不确定是否需要,但这就是文档所说的):
update-grub2
之后的配置看起来就像我上面显示的那样,并且在重新启动时 GRUB 将不会自动启动菜单。我不确定 EFI NVRAM 转储中的 UUID,但该值未在我能找到的任何地方配置,并且如果我删除条目并重新创建它们,它会重现。
知道我缺少什么吗?
长话短说:
当使用 Ubuntu 构建的 GRUB 引导加载程序时,必须命名UEFI 引导项
ubuntu
(或者至少,GRUB EFI 配置文件必须位于EFI/ubuntu/grub.cfg
.细节:
问题出在 UEFI 中的 GRUB 设置、安全启动(我假设)以及 Ubuntu 如何设置这一切:在传统 BIOS 启动中,BIOS 启动一个微小的(我相信是 512 字节)可执行文件,该可执行文件要么立即启动其他东西(在过去)或在磁盘上找到引导加载程序的其余部分所在的硬编码部分(“第 2 阶段引导加载程序”)。该设置存在很多问题,最重要的是它无法与移动文件、压缩文件等的高级文件系统一起工作 - 这就是为什么过去如果您想在高级文件系统上运行 root ,您必须
/boot
在 ext2 中有一个单独的分区,GRUB 第二阶段位于其中。对于 UEFI,有一个(相对)较大的 FAT32 分区(ESP),操作系统可以将大型引导加载程序部署到其中,并且 UEFI 固件将立即加载整个引导加载程序。Ubuntu 使用该功能的方式是将整个 GRUB 引导加载程序部署为一个名为
grubx64.efi
. 该文件由 UEFI 固件直接执行或通过适用shimx64.efi
于仅 Microsoft CA 安全启动系统的垫片(称为 )执行。grub.cfg
此 GRUB 安装知道从 EFI 分区加载一个小配置文件,其中包含有关在何处查找完整配置文件的说明。因为您可以立即使用完整的 GRUB 引导加载程序,所以您可以在那里拥有可以读取高级文件系统的 BTRFS 或 ZFS 驱动程序,并且不需要单独的引导分区。问题是所有这些文件路径(直到文件
grub.cfg
加载之后)都被编译到 GRUB EFI 可执行文件中并且不可配置 - 并且因为这整个事情需要签名,所以您无法在安装过程中更新此配置(除非您想要在计算机的 TPM 中设置个人密钥并开始重新编译引导加载程序)。因此,Ubuntu GRUB 安装(基于 Ubuntu LTS 的 KDE Neon 所使用的)需要 EFI 引导加载程序目录(从中加载),它不能是其他任何东西,因为该路径是grub.cfg
编译EFI/ubuntu/grub.cfg
的到grubx64.efi
文件中,如果配置文件不存在 - 你会得到 GRUB 提示符,就像我一样。我们可以通过
set
在 GRUB 提示符下运行来看到这一点:输出将有这意味着前缀(GRUB 认为它是从哪里加载的,以及它期望看到所有其他文件的位置)被硬编码为 Ubuntu 使用的内容。
当您安装 KDE Neon (这就是我正在使用的)时,Neon 安装程序将创建引导
EFI/ubuntu
加载EFI/neon
程序的安装 - 我不确定他们为什么要尝试,因为该EFI/neon
文件夹甚至没有被使用(可能是因为它们希望引导加载程序条目名称为“neon”,并且出于某种原因,这意味着该文件夹也必须称为“neon”?UEFI 规范不要求这样做),这样就可以了。我做错的事情是假设该
EFI/ubuntu
文件夹是某种遗留文件夹(我在以前的 Ubuntu 安装之上安装了 Neon)并将其删除(并且还将 Neon 引导加载程序重新安装到 中EFI/Neon
,因为我希望引导条目能够很好地显示)大写) - 因此 GRUB 可执行文件是从新文件夹加载的(由 UEFI 固件),但是加载后 - 它试图找到其余的设置,但不EFI/ubuntu
存在。所以我们只能根据提示来解决这个问题。