我需要使用 Grub 启动 Windows 和另外两个 Linux distor。因此,我使用以下命令将 Grub 安装在 UEFI 分区上,并使用专用分区来存储 Grub 使用的文件。
sudo grub-install --efi-directory=/mnt/efi --root-directory=/mnt/grub --bootloader-id=Grub --uefi-secure-boot --target=x86_64-efi /dev/sda
/dev/sda1
mounted on/mnt/efi
是我的 EFI 分区,/dev/sda2
mounted on/mnt/grub
是用于 Grub 文件的分区。
然而,启动 Grub 后似乎无法找到我放置在 的 grub.cfg 文件/mnt/grub
,并显示默认的 Grub shell。我可以通过键入 或 来手动恢复我的configfile /efi/Grub/grub.cfg
系统configfile (hd0,gpt2)/grub/grub.cfg
。
这是我的一些文件
$ sudo tree /mnt/efi/EFI
/mnt/efi/EFI
├── Grub
│ ├── BOOTX64.CSV
│ ├── fbx64.efi
│ ├── grub.cfg
│ ├── grubx64.efi
│ ├── mmx64.efi
│ └── shimx64.efi
└── Microsoft
|...
$ sudo tree /mnt/grub/grub
/mnt/grub/grub
├── fonts
│ └── unicode.pf2
├── grub.cfg
├── grubenv
└── x86_64-efi
|...
$ sudo cat /mnt/efi/EFI/Grub/grub.cfg
search.fs_uuid 3110d895-a376-484a-8dba-e0475b9a977c root hd0,gpt2
set prefix=($root)'/grub'
configfile $prefix/grub.cfg
$ sudo fdisk -l /dev/sda
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disklabel type: gpt
Device Start End Sectors Size Type
/dev/sda1 2048 526335 524288 256M EFI System
/dev/sda2 526336 657407 131072 64M Linux filesystem
/dev/sda3 657408 690175 32768 16M Microsoft reserved
/dev/sda4 690176 563607551 562917376 268.4G Microsoft basic data
/dev/sda5 563607552 697825279 134217728 64G Linux filesystem
/dev/sda6 697825280 966260735 268435456 128G Linux filesystem
/dev/sda7 966260736 983037951 16777216 8G Linux swap
/dev/sda8 983037952 1117254748 134216797 64G Linux filesystem
/dev/sda9 1117255680 1385691135 268435456 128G Linux filesystem
/dev/sda10 1385691136 1402468350 16777215 8G Linux swap
我觉得我犯了一些小错误,但我在这上面花了太多时间。
答案1
GRUB 似乎grub.cfg
使用绝对路径从 ESP 加载。也许 GRUB 无法判断它是从哪个目录加载的。
对于 Debian,该路径是/EFI/debian/grub.cfg
.
您可以使用此命令查找特定.efi
可执行文件可能正在使用的路径:
strings /boot/efi/EFI/devuan/grubx64.efi | less '+/EFI\/'
显然,您可能需要使用与上面不同的路径来访问.efi
可执行文件。
这似乎是一个相关的错误。
将 复制grub.cfg
到预期路径似乎有效:
cd /boot/efi/EFI/
mkdir debian
cp devuan/grub.cfg debian/
当然,您的命令和路径可能会有所不同。如果grub.cfg
发生变化,则副本将需要更新,因为 FAT 文件系统不支持链接。不过我的看起来像这样,所以看起来不会有太大变化:
search.fs_uuid $root_fs_uuid root mduuid/$array_uuid
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
答案2
在昨天解决了类似的问题之后,我找到了一个可能对您也有帮助的解决方案。我的/boot
在 ext4 上,我的 和grub.cfg
你的一样,将 EFI 二进制文件重定向到/boot/grub/grub.cfg
.
为了解决这个问题,我手动复制/boot/grub/grub.cfg
到/boot/efi/EFI/ubuntu/
而不是使用 grub-install 添加的“configfile”重定向。
grub EFI 二进制文件是否有可能无法读取grub.cfg
ext4 上的文件?或者正如尼尔·斯托克布里奇所建议的那样,这可能是一个路径问题?
编辑:在进行此更改之前分享我所看到的内容也可能会有所帮助。 Grub shell 正在加载,我能够使用命令启动 Ubuntu 22.04,但 Grub 菜单没有显示。