GRUB2:错误:未找到磁盘“(hd0,)”

GRUB2:错误:未找到磁盘“(hd0,)”

我几乎已经完成了《Linux From Scratch》;然而,当我尝试启动新的LFS系统时。 GRUB 无法启动系统:

错误:未找到磁盘“(hd0,)”。

然后我使用grub> ls
输出:(hd0) (hd0, gpt4) (hd0, gpt3) (hd0, gpt2) (hd0, gpt1)
我按照说明进行操作,没有任何特别的地方,除了我将 GRUB 与 UEFI 一起使用,因为我的主机系统一直在使用 UEFI 和 GPT。
这是分区表:

  • /dev/sda GPT
  • /dev/sda1:大小为 512MB。 EFI系统分区。 FAT32
  • /dev/sda2:大小为 16GB。 Linux 交换。 [交换]
  • /dev/sda3:大小为 64GB。 Linux x86_64 根。分机4。主机系统。
  • /dev/sda4:大小为 32GB。 Linux x86_64 根。分机4。 LFS系统。我在 sda1 中安装 grub。 sda1中的文件树如下:
.
├── config-5.16.9
├── EFI
│   └── LFS
│       └── grubx64.efi
├── grub
│   ├── fonts
│   ├── grub.cfg
│   ├── grubenv
│   ├── i386-pc
│   ├── locale
│   │   ├── ast.mo
│   │   ├── ca.mo
│   │   ├── ...
│   │   └── zh_TW.mo
│   └── x86_64-efi
│       ├── acpi.mod
│       ├── ...
│       └── zstd.mod
├── System.map-5.16.9
└── vmlinuz-5.16.9-lfs-11.1-systemd

以及内容grub.cfg

set default=0
set timeout=5
insmod part_gpt
insmod vfat # I've tried fat here.  
set root=(hd0) #I've tried (hd0,gpt1), (hd0,gpt4), (hd0,1) .etc here.  

if loadfont /boot/grub/fonts/unicode.pf2; then
        set gfxmode=auto
        insmod all_video
        terminal_output gfxterm
fi

menuentry "GNU/Linux, Linux 5.16.9-lfs-11.1"{
        linux /boot/vmlinuz-5.16.9-lfs-11.1 root=/dev/sda4 ro
}

menuentry "Firmware Setup"{
        fwsetup
}

我主要参考了这些参考资料:

另外,我已设置在没有 CSM 支持或遗留的情况下使用 UEFI。
更多细节:

  • GRUB 版本 2.06
  • LFS 版本 11.1-systemd
  • Linux 内核版本 5.16.9
  • 安全启动已禁用

答案1

最初,GRUB 依赖 UEFI 服务来访问 ESP,因此除非您有固件支持ext4,否则 GRUB 将只能读取 FAT32。它可以ext4在之后读取insmod ext2,但要做到这一点,它需要ext2.mod先读取。

为了获得更多功能,GRUB 需要能够加载其模块,这些模块显然/grub/x86_64-efi位于/dev/sda1.但要做到这一点,GRUB 需要正确设置两个重要的变量:rootprefix

在您的情况下,您需要set root=(hd0,gpt1),假设您只有一张磁盘。如果您有多个磁盘,预测正确的hdN数量可能会很棘手,这就是为什么现代发行版通常更喜欢使用语法search --fs-uuid --set=root <UUID-of-the-filesystem>而不是直接的set root=.

prefix设置为(hd0,gpt1)/grub.在 GRUB 提示符下使用set不带参数的命令来查看 GRUB 变量的当前状态。

GRUB 一次只能关注一个文件系统,因此如果您挂载/dev/sda1/boot,那么当 GRUBroot设置为时(hd0,gpt1),它将显示/boot/。因此,您应该/boot从所有引用 的路径中省略sda1

如果您需要从 ext4 文件系统加载某些内容/dev/sda4,则需要执行三步操作:

  1. insmod ext2whilerootprefix仍然按上述设置
  2. set root=(hd0,gpt4)将 GRUB 焦点切换到 LFS 根文件系统
  3. 加载您需要的任何内容,请记住,这/boot只是sda4. Linux 内核稍后将使用它作为 的挂载点/dev/sda1,但这对 GRUB 没有任何帮助。

因此,您需要更正的行grub.cfg是:

...
#set root=(hd0)    # not just the disk, but the partition/filesystem GRUB will focus on
set root=(hd0,gpt1)
...
#if loadfont /boot/grub/fonts/unicode.pf2; then   # GRUB will see /boot as /
if loadfont /grub/fonts/unicode.pf2; then
...
#       linux /boot/vmlinuz-5.16.9-lfs-11.1 root=/dev/sda4 ro  # same here, also fix the kernel filename
        linux /vmlinuz-5.16.9-lfs-11.1-systemd root=/dev/sda4 ro
...

/boot/grub/i386-pc目录在 UEFI 系统上将毫无用处;请随意删除它。

/boot/grub/fonts/unicode.pf2文件当前似乎不存在于sda1.但由于您显然可以在没有它的情况下以文本模式获取 GRUB,因此您可以在没有它的情况下生活。

相关内容