我有一个 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_init
和grub_mod_fini
。如果没有这些符号,grub 模块会被加载但不会初始化,因此无法使用。
如果你确实想删除 grub 的模块,那么你应该添加-K grub_mod_init -K grub_mod_fini
到strip's
命令行。