У меня есть образ жесткого диска 1 ГБ (созданный с помощью bximage для Bochs), на который я хочу установить Grub 2.
Я понимаю, что установка Grub состоит из 3 частей:
Сначала я использую образ boot.img из моего собственного каталога Linux / boot / grub /.
После этого я генерирую свой образ 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.
Как оказалось, мне действительно не хватало модуля, точнее драйвера диска, а именно biosdisk
:
Из OSDev Wiki:
biosdisk - This module is required for GRUB 2 to be able to boot from a LiveCD.
Несмотря на то, что первоначальный автор нашел причину сбоя в своем случае и поделился ею с остальным сообществом, я обнаружил другую проблему, которая вызывает точно такое же поведение:
ls
, вызванный в оболочке спасения grub, не дает никаких устройств.
Если по какой-либо причине *.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
.