Grub2 根本没有检测到任何设备

Grub2 根本没有检测到任何设备

我有一个 1Gb HDD 映像(使用 Bochs 的 bximage 创建),我希望在其上安装 Grub 2。

据我了解,Grub 安装由 3 部分组成:

  • boot.img镜像,占据第一个扇区
  • core.img 映像,占用第一个扇区之后直到下一个磁道开始的空间
  • 以及 /boot/grub/ 目录,grub.cfg 和其他模块位于其中。

首先,我使用我自己的 Linux /boot/grub/ 目录中的 boot.img 映像。

接下来,我使用以下命令生成 core.img 图像:

sudo grub-mkimage -v --format=i386-pc -o core.img -p\(hd0,msdos1\)/boot/grub ls ext2 part_msdos

要将它们安装到最终的磁盘映像上,我使用以下命令:

  • sudo dd if=boot.img of=/dev/loop0 bs=446 count=1使用 446 块大小以避免覆盖驻留在 MBR 中的分区数据
  • sudo dd if=core.img of=/dev/loop0 bs=512 seek=1这里,seek=1是为了不覆盖刚刚写入的MBR。

该磁盘从第 2048 扇区开始直到最后一个扇区,采用 ext2 分区进行格式化,并包含一个 boot/grub/ 目录,其中包含 grub.cfg(带有一个不加载任何内容的伪造菜单项),以及 / 中的模块。 boot/grub/i386-pc/ 目录。

Bochs 成功引导此 grub 安装一直到 grub> 提示符。作为这个 Ubuntu 指南指出,此行为表明未找到 grub.cfg。

调用后ls,我遇到了一个有趣的问题 - 我显然根本没有连接任何设备!

为了进一步详细说明问题的本质,我观察到,当grub-mkrescue从从驱动器启动映像时,调用ls显示其自己的救援驱动器,以前“不存在”的主磁盘驱动器以及 ext2 分区。我验证了/boot/grub.cfg确实可以访问。

根据这一观察,我假设我自己的 core.img 缺少一些基本模块或功能。但是我该如何修改呢?


我还在使用 USB 记忆棒的物理机上进行了此练习,并且发生了完全相同的事情,因此我可以确认问题不在于 Bochs。

答案1

事实证明,我确实缺少一个模块,更具体地说是一个磁盘驱动程序,即biosdisk

来自 OSDev 维基:

biosdisk -  This module is required for GRUB 2 to be able to boot from a LiveCD.

答案2

尽管原作者已经找到了他的案例失败的原因并与社区其他人分享,但我发现了另一个导致完全相同行为的问题:

ls在 grub 救援 shell 中调用不会产生任何设备。

如果由于任何原因*.mod文件被剥夺了重要的符号信息,则grub-install静默构建core.img,但core.img不能使用打包的任何模块。

即使是这种“无害”的剥离选项也会--strip-unneeded导致丢失两个重要的符号grub_mod_initgrub_mod_fini。如果没有这些符号,grub 模块会被加载但不会初始化,因此无法使用。

如果你确实想删除 grub 的模块,那么你应该添加-K grub_mod_init -K grub_mod_finistrip's命令行。

相关内容