首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GRUB2:错误:找不到磁盘‘(hd0,)’

GRUB2:错误:找不到磁盘‘(hd0,)’
EN

Unix & Linux用户
提问于 2022-08-08 12:37:07
回答 1查看 2.7K关注 0票数 0

我几乎从零开始就完成了Linux;但是,当我试图启动新的LFS系统时。GRUB无法启动系统:

错误:找不到磁盘‘(hd0,)’。

然后我使用了grub> ls输出:(hd0) (hd0, gpt4) (hd0, gpt3) (hd0, gpt2) (hd0, gpt1) --我遵循了指令,没有做任何特别的事情,除了在UEFI中使用GRUB之外,因为我的主机系统一直在使用UEFI和GPT。下面是分区表:

  • /dev/sda GPT
  • /dev/sda1 1:512 in大小。EFI系统分区FAT32
  • /dev/sda2 2:16 in大小。Linux交换。
  • /dev/sda3 3:64 in大小。Linux x86_64根目录。ext4。主机系统。
  • /dev/sda4 4:32 in大小。Linux x86_64根目录。ext4。LFS系统我在sda1中安装了grub。sda1中的文件树类似于:
代码语言:javascript
复制
.
├── 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的内容:

代码语言:javascript
复制
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
}

我主要是根据这些参考资料:

此外,我已经设置使用UEFI,没有CSM支持或遗留。更多详情:

  • GRUB版本2.06
  • LFS Version11.1-systemd
  • Linux内核版本5.16.9
  • 安全启动禁用
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-08-08 13:45:05

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

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

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

应该将prefix设置为(hd0,gpt1)/grub。使用GRUB提示符中没有参数的set命令查看GRUB变量的当前状态。

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

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

  1. insmod ext2,而rootprefix仍按上文所述设置
  2. set root=(hd0,gpt4)将GRUB焦点切换到LFS根文件系统
  3. 加载您需要的任何内容,请记住/boot只是sda4上的一个空目录。Linux内核稍后将使用它作为/dev/sda1的挂载点,但这根本无助于GRUB。

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

代码语言:javascript
复制
...
#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
...

在UEFI系统上,/boot/grub/i386-pc目录将是完全无用的;可以随意删除它。

/boot/grub/fonts/unicode.pf2文件目前似乎不存在于sda1上。但是,由于没有它显然可以在文本模式下获得GRUB,所以没有它就可以生存。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/712872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档