Вопрос или проблема
Я пытаюсь создать простой qcow2 размером 200 МБ с установленным только режимом BIOS grub2. Моя цель – получить доступ к командной строке grub или командной строке grub rescue, когда я загружаю указанный образ qcow2 в публичном облаке, таком как OCI или AWS.
Следующие шаги я предпринял:
-
Компилирование GRUB2 в режиме BIOS из исходного кода
- mkdir grub2
- cd grub2
- wget https://ftp.gnu.org/gnu/grub/grub-2.06.tar.gz
- tar -xvf grub-2.06.tar.gz
- cd grub-2.06
- ./configure –target=x86_64 –with-platform=pc –disable-efiemu
- make
- grub-mkimage -v -O i386-pc -d ./grub-core -p(hd0,msdos1)/boot/grub -o core.img biosdisk part_msdos fat ntfs exfat part_gpt ext2
- cp core.img i386-pc
После этих шагов у меня есть boot.img, core.img и файлы .mod в папке i386-pc.
- Создание нового образа qcow2 и создание таблицы разделов с помощью gdisk
- qemu-img create -f qcow2 cloud_grub2bios.img 200M
- sudo qemu-nbd -c /dev/nbd4 cloud_grub2bios.img
- sudo gdisk /dev/nbd4
- Затем я переключаю диск на gpt с помощью команды o, а затем создаю 2 раздела: первый – это 4MiB раздел загрузки BIOS, а второй – файловая система Linux для оставшегося пространства в образе. Вывод команды gdisk p после указанных операций представлен ниже. Я также запускаю
sudo mkfs.ext4 /dev/nbd4p2
после создания разделов.
- Затем я переключаю диск на gpt с помощью команды o, а затем создаю 2 раздела: первый – это 4MiB раздел загрузки BIOS, а второй – файловая система Linux для оставшегося пространства в образе. Вывод команды gdisk p после указанных операций представлен ниже. Я также запускаю
Сканирование таблицы разделов:
MBR: защитный
BSD: не присутствует
APM: не присутствует
GPT: присутствует
Найдена действительная GPT с защитным MBR; используется GPT.
Команда (? для помощи): p
Диск /dev/nbd5: 409600 секторов, 200.0 МиБ
Размер сектора (логический/физический): 512/512 байт
Идентификатор диска (GUID): 4AF5DA38-30C9-4094-949A-60663B89B865
Таблица разделов вмещает до 128 записей
Основная таблица разделов начинается с сектора 2 и заканчивается на секторе 33
Первый доступный сектор - 34, последний доступный сектор - 409566
Разделы будут выровнены по границам в 2048 секторов
Всего свободного пространства - 2014 секторов (1007.0 КиБ)
Номер Начало (сектор) Конец (сектор) Размер Код Имя
1 2048 10239 4.0 МиБ EF02 Раздел загрузки BIOS
2 10240 409566 195.0 МиБ 8300 Файловая система Linux
- Установить grub2 BIOS в образ qcow2 с помощью grub-install, находящегося в папке grub2.06.
- sudo mount /dev/nbd4p2 /mnt
- sudo ./grub-install –target=i386-pc –boot-directory=/mnt/boot –directory=./grub-core/ /dev/nbd4
- После выполнения команды grub-install я получаю следующий вывод
-
Установка для платформы i386-pc. ../grub/grub-2.06/grub-install: предупреждение: не удается открыть директорию `/usr/local/share/locale': Нет такого файла или директории. Установка завершена. Ошибок не обнаружено.
- Когда образ qcow2 готов, я конвертирую его в сырой образ с помощью команды qemu-img, а затем запускаю сырой образ с помощью следующей команды
qemu-system-x86_64 -m 4096 -cpu max -drive file=cloud_grub2bios.raw,if=virtio,format=raw -display none -nographic
Здесь я могу правильно увидеть командную строку grub2.
- Но когда я загружаю этот образ qcow2 в OCI или AWS, настраиваю образ для запуска с использованием BIOS firmware и проверяю последовательную консоль, я ничего не получаю. Экран полностью пустой.
Примечание
- Я скачал облачный образ Jammy с https://cloud-images.ubuntu.com/jammy/20240912/jammy-server-cloudimg-amd64.img и загрузил его обратно в OCI. Затем в моем загруженном образе я установил прошивку только BIOS, снимя отметку с опции UEFI. Мне пришлось вручную загрузить и сделать это вместо использования уже опубликованного изображения ubuntu в OCI, так как по умолчанию опубликованная в OCI ubuntu поддерживает как BIOS, так и UEFI, и предпочтительнее UEFI. Когда я запускаю экземпляр, он всегда появляется с прошивкой UEFI. Образ облака jammy, который я загрузил в OCI и принуждаю к запуску с BIOS firmware, успешно загружается в OCI.
- Я пробовал использовать boot.img, core.img и файлы .mod из облачного образа jammy, который работает в OCI, при создании моего qcow2. Даже с этим мой образ не попал ни в командную строку grub, ни в команду grub rescue и продолжал показывать пустой экран.
- Я пробовал обширно гуглить и использовать AI-инструменты, такие как Chatgpt, Gemini и т.д., но не нашел ни одного рабочего решения. Ближайшее, что я нашел для создания нового облачного образа, это https://github.com/mvallim/cloud-image-ubuntu-from-scratch, но это использование grub2 в режиме UEFI, и они не компилируют grub2 с нуля, как я это делаю.
Ответ или решение
Проблема загрузки qcow2 с установленным только Grub2 BIOS в публичном облаке
Введение
Виртуализация и загрузка операционных систем в публичных облачных платформах, таких как OCI (Oracle Cloud Infrastructure) и AWS (Amazon Web Services), могут иногда вызывать сложности, особенно когда речь идет о нестандартных конфигурациях загрузчиков. В данной статье мы рассмотрим ситуацию, когда созданное вами QCOW2-изображение с установленным только Grub2 в режиме BIOS работает в QEMU, но не загружается в общеоблачной среде.
Этапы создания QCOW2-образа
-
Компиляция Grub2
Вы начали с компиляции Grub2 в BIOS-режиме, выполнив подробные шаги для настройки среды. Это, безусловно, правильный подход, однако убедитесь, что все пути и настройки верны. -
Создание QCOW2-образа
При выполнении следующим шагов вы успешно создали QCOW2-образ и настроили его с помощьюgdisk
для создания загрузочного раздела GPT. Обратите внимание на правильность создания BIOS-загрузочного раздела. -
Установка Grub2
Установка Grub2 в образ была выполнена, но возникла предупреждение относительно отсутствия директории локализации, которое не должно влиять на основную функциональность, однако стоит обратить на это внимание и проверить корректность всех путей. -
Тестирование в QEMU
Используя QEMU, вы проверили работоспособность вашего образа, где Grub2 успешно загрузился, что подтверждает, что созданный образ в целом корректен.
Проблемы при загрузке в публичных облаках
Несмотря на успешные локальные тесты, ваша загрузка в OCI и AWS оказалась неудачной, и вы столкнулись с пустым экраном. Причины могут быть следующими:
-
Различия в аппаратной виртуализации
Облачные провайдеры могут иметь другие настройки виртуализации, которые могут не поддерживать определенные конфигурации BIOS, такие какmsdos
или GPT. Проверьте документацию вашего облачного провайдера на предмет рекомендаций по загрузочным образам. -
Неверные настройки образа
Возможно, ваш образ требует дополнительных конфигураций в области BIOS, чтобы правильно распознать загрузчик. Убедитесь, что информация о загрузочном разделе указана верно, и что вы правильно настроили параметры VM. -
Отсутствие необходимых файлов
Вы упоминали, что пытались использовать boot.img и core.img из другого образа, но если эти файлы несовместимы с вашим текущим образом или не имеют необходимых модулей, это может привести к сбоям. -
Ошибки в конфигурации облака
Проверьте параметры настройки вашего экземпляра в OCI или AWS. Убедитесь, что все параметры BIOS настроены правильно, и попробуйте использовать другой тип виртуализации, если это возможно.
Рекомендации по устранению проблемы
-
Пересоздание образа
Попробуйте пересоздать QCOW2-образ, убедившись, что вы точно соблюдаете все этапы установки Grub2 и возможности настройки системы, включая все необходимые модули. -
Дополнительные тесты в QEMU
Перед загрузкой в облаке используйте QEMU с различными параметрами, имитирующими настройки облака, чтобы выявить потенциальные проблемы заранее. -
Обратитесь к сообществу или поддержке
Поищите более узкоспециализированные форумы и сообщества, которые могут предложить вам дополнительные инструменты или советы по устранению проблем с загрузкой в облаке.
Заключение
Загрузка QCOW2 с Grub2 в режиме BIOS в облаках, таких как OCI и AWS, представляет собой задачу, требующую повышенного внимание к деталям. Несмотря на то, что ваш образ показывал успешные результаты в локальной среде QEMU, наличие различий в конфигурациях и настройках серверов публичного облака может стать причиной проблем. Пересмотрите ваши шаги, протестируйте с другими параметрами и не стесняйтесь обращаться за помощью к сообществу.