0

I have a 1Gb HDD image (created using bximage for Bochs), onto which I wish to install Grub 2.

I understand that a Grub installation consists of 3 parts:

  • The boot.img image, which occupies the first sector
  • The core.img image, which occupies space following the first sector up until the start of the next track
  • And the /boot/grub/ directory, in which the grub.cfg and other modules are located.

First I use a boot.img image that from within my own Linux /boot/grub/ directory.

Following this, I generate my core.img image using the following command:

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

And to install them onto the final disk image, I use the following commands:

  • sudo dd if=boot.img of=/dev/loop0 bs=446 count=1 the 446 blocksize is used so as to not overwrite The partition data that resides within the MBR
  • sudo dd if=core.img of=/dev/loop0 bs=512 seek=1 and here, seek=1 is so as to not overwrite the MBR that was just written.

The disk, starting from sector 2048 until the last, is formatted with an ext2 partition, and contains a boot/grub/ directory containing a grub.cfg (with a single bogus menuentry which doesn't load anything), and modules in the /boot/grub/i386-pc/ directory.

Bochs successfully boots this installation of grub all the way to the grub> prompt. As This Ubuntu guide points out, this behaviour indicates that grub.cfg was not found.

Upon invoking ls, I am faced with an interesting problem - I apparently have no devices connected at all!

To further elaborate on the nature of the problem, I observed that when booting a grub-mkrescue image from a slave drive, invoking ls displayed its own rescue drive, and the previously 'non-existant' primary disk drive, along with the ext2 partition. I verified that /boot/grub.cfg could indeed be accessed.

From this observation I would assume that my own core.img is missing some fundamental module or functionality. But which, and how would I amend this?


I also conducted this exercise on a physical machine using a USB stick, and the exact same thing happened, so I can confirm that the problem is not with Bochs.

2 Answers 2

0

As it turns out, I was indeed missing a module, more specifically a disk driver, namely biosdisk:

From OSDev Wiki:

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

Even though the original author has found a reason for the failure in his case and shared it with the rest of community I found another issue which causes exactly the same behaviour:

ls invoked in grub rescue shell yields no devices.

If for any reason *.mod files are stripped of vital symbol information then grub-install silently builds core.img but that core.img cannot use any modules packed along.

Even such "harmless" stripping option as --strip-unneeded results in loss of two important symbols grub_mod_init and grub_mod_fini. Without these symbols grub modules are loaded but not initialized and so are unusable.

If you really want to strip grub's modules then you should add -K grub_mod_init -K grub_mod_fini to strip's command line.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.