LINUX.ORG.RU

Как запустить загрузочный диск MBR/BIOS в QEMU в режиме UEFI

 , , , ,


0

2

Есть загрузочные диски: disk1.qcow2 и disk2.qcow2. Первый диск:

kirl@debn:~/start_qemu$ sudo fdisk -l /dev/nbd0
Disk /dev/nbd0: 4 GiB, 4294967296 bytes, 8388608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x503e2391

Device      Boot  Start     End Sectors  Size Id Type
/dev/nbd0p1 *      2048  395263  393216  192M 83 Linux
/dev/nbd0p2      395264 8388607 7993344  3.8G 83 Linux

Внутри раздела nbd0p1 первого диска находятся файлы bzImage, initramfs, папка grub и еще немного файлов.

Второй диск:

kirl@debn:~/start_qemu$ sudo qemu-nbd --connect /dev/nbd0 disk2.qcow2 
kirl@debn:~/start_qemu$ sudo fdisk -l /dev/nbd0
Disk /dev/nbd0: 80 GiB, 85899345920 bytes, 167772160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt

Device        Start       End   Sectors  Size Type
/dev/nbd0p1    2048   5322751   5320704  2.5G Linux filesystem
/dev/nbd0p2 5322752 167772126 162449375 77.5G Linux filesystem
kirl@debn:~/start_qemu$ 

Внутри раздела nbd0p1 второго диска находятся папки: boot, etc, opt, var. Внутри boot находятся bzImage, initramfs, grub и другие.

Как я могу запустить эту машину в режиме EFI в QEMU. Щас команда примерно выглядит так. Я напрямую передаю QEMU ядро и initramfs:

#!/bin/bash

qemu-system-x86_64 \
        -m 2G \
        -machine q35 \
        -smp 2 \
        -drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
        -drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd \
        -device qemu-xhci \
        -drive file=/home/kirl/start_qemu/usb.raw,format=raw,if=none,id=usbdisk \
        -device usb-storage,drive=usbdisk \
        -kernel ./kernel \
        -initrd ./initramfs \  
        -serial mon:stdio \
        -nographic \
        -drive file=disk1.qcow2,if=virtio,format=qcow2 \
        -drive file=disk2.qcow2,if=virtio,format=qcow2 \
        -append "root=/dev/vda2 ro console=ttyS0" \   


Последнее исправление: kirill2005 (всего исправлений: 1)
Ответ на: комментарий от Aceler

А Qemu поддерживает CSM? Для этого надо, чтобы OVMF поддерживал, а он не поддерживает.

Да, не поддерживает, и не планируют поддерживать: https://github.com/tianocore/tianocore.github.io/wiki/OVMF-FAQ#does-ovmf-support-legacy-booting-legacy-option-roms-csm

Есть другой способ?

Да, создать виртуалку с Q35, но в BIOS-режиме.

Dimez ★★★★★
()

Попробовать запустить какой-нибудь efi, умеющий CSM.
Зачем это нужно, правда не понятно. Если тебе нужно эмулировать bios - так возьми seabios и эмулируй его, с CSM и mbr системой от efi никакой пользы, только лишний оверхед. Единственное применение вижу - отлаживать эту самую реализацию CSM

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)

Какой смысл всех этих манипуляций? У qemu есть же дефолтный режим работы где он поддерживает нормальную загрузку, но ты его зачем-то отключаешь, при этом желая чтобы он продолжал работать.

firkax ★★★★★
()
Ответ на: комментарий от kirill2005

Зачем? Это выглядит как проблема XY – «проблема, возникающая при обращении в службу поддержки и в других похожих ситуациях, когда обратившийся за помощью человек ставит не проблему Y напрямую, а спрашивает решение проблемы X, которая, по его мнению, позволит решить изначальную проблему Y.»

Серьезно, в чем конечный смысл запускать ОС, установленную в ВМ в BIOS режиме, в той же ВМ, но в UEFI?

Vsevolod-linuxoid ★★★★★
()

Если пойти таким путём? взять твою текущую конфигурацию виртуалки и изменить так как нужно, нюанс: после изменения конфигурации добавить RescueCD и загрузится с него; пройти процедуру восстановления загрузчика в желаемом виде; PROFIT? ЗЫ: что бы не скрипеть полушариями и более менее технологичное исполнение

anonymous
()
Ответ на: комментарий от Vsevolod-linuxoid

Мне надо пробросить плису в QEMU. При запуске из Bios qemu крашится, все драйвера vfio слетают и хост машина уходит в ребут. Запуск из под uefi должен помочь.

kirill2005
() автор топика
Ответ на: комментарий от kirill2005

EFI Shell FS0:/efi/some-name-file.efi Жмакаем enter и идёт загрузка

Но проблема же в том, что образ изначально был под mbr и нужно его дошпиговать до EFI А это нужна и партиция в FAT32, где файлики самой EFI лежат и что бы об этом была запись у виртуалке/либо при ее отсутствии через EFI Shell

anonymous
()
Ответ на: комментарий от kirill2005

Мои данные наверное устарели, но я всегда считал что с момента передачи управления (запуска) ядру, больше нет никакой системы загрузки, есть только ядро

При запуске из Bios qemu крашится

Падает qemu. На каком этапе?

futurama ★★★★★
()
Ответ на: комментарий от futurama

Видимо на этапе Bios, тоесть управление еще не передано kernel, потому что логи на экран никакие не выведены и потом просто зависает хост полностью и уходит в ребут. Плюс, еще читал на форуме у человека была похожая проблема, только с GPU. Он поменял Bios на Uefi и проблема решилась

kirill2005
() автор топика
Ответ на: комментарий от kirill2005

на этапе Bios, тоесть управление еще не передано kernel…

И кто по твоему должен передать это управление? Уж не ЕФИ-загрузчик, которому там неотуда было взяться…

andytux ★★★★★
()
Последнее исправление: andytux (всего исправлений: 1)
Ответ на: комментарий от anonymous

Подключи просто ещё один накопитель (диск) в ВМ и сделай на нём EFI раздел, поставь туда EFI загрузчик и запускай ядро через него.

Во-первых, чтобы ядро могло сам по себе загружаться напрямую в EFI оно должно быть собрано с опцией EFI Boot Stub.

Во-вторых, ядру для монтирования коря нужно передавать параметр root= или прописать его при сборке ядра или изменить сценарии в initramfs, чтобы они сами его находили.

kostik87 ★★★★★
()
Ответ на: комментарий от andytux

должен передать это управление?

ТС же пишет про запуск без uEFI, то есть BIOS в виртуалке должен передать управление загрузчику из MBR и далее. А у него падает qemu и хост уходит в ребут, не виртуалка, а хост...

mky ★★★★★
()
Ответ на: комментарий от masa

потом просто зависает хост полностью и уходит в ребут. Плюс, еще читал на форуме у человека была похожая проблема, только с GPU. Он поменял Bios на Uefi и проблема решилась

mky ★★★★★
()
Ответ на: комментарий от masa

В qemu надо пробросить плису и запустить линукс, который на загрузочных дисках. Этот линукс есть только на этих дисках формата MBR. Пока что при пробросе через Биос qemu крашится. Предположительно запуск из Uefi может помочь с проблемой

kirill2005
() автор топика
Ответ на: комментарий от kirill2005

Тут проблема может быть не столько в BIOS / UEFI, хотя это тоже, но в режиме BIOS загрузки ВМ я думаю шансы выше.

В целом всё ещё зависит от поддержки виртуализации твоей материнской платой, включенных параметров проброса устройств. Но в случае USB устройства думаю меньше проблем.

Другой нюансы - ядро Linux, дистрибутива и версия QEMU.

Пробуй другой дистрибутив / версию QEMU, обнови прошивку (BIOS / UEFI) твоей материнской платы.

kostik87 ★★★★★
()