Как загрузить ядро ​​EFI с использованием QEMU (kvm)?


21

Я пытаюсь эмулировать среду EFI, используя QEMU (kmv); Виртуальный ящик занимает 15 минут для загрузки в режиме EFI с использованием Archboot.

Используя устаревший режим BIOS, я могу загрузиться с помощью этой команды:

root@citsnmaiko-deb:/home/maiko/uefi/ovmf# qemu-system-x86_64 -kernel  ../bzImage -initrd ../rootfs.gz -append "rw root=/dev/ram0  ramdisk_size=40960"

и это работает с моим собственным ядром и файловой системой.

file ../bzImage 
../bzImage: Linux kernel x86 boot executable bzImage, version 3.6.1 (root@citsnmaiko-deb) #4 , RO-rootFS, swap_dev 0x3, Normal VGA

у него также есть поддержка EFI.

Я пытаюсь сделать то же самое с файлами EFI, которые я скачал отсюда

wget http://ufpr.dl.sourceforge.net/project/edk2/OVMF/OVMF-X64-r11337-alpha.zip -P ovmf
cd ovmf/
unzip -x OVMF-X64-r11337-alpha.zip
# rename the files for QEMU find them
mv OVMF.fd bios.bin
mv CirrusLogic5446.rom vgabios-cirrus.bin
# start QEMU
root@citsnmaiko-deb:/home/maiko/uefi/ovmf# qemu-system-x86_64 -L .  -kernel  ../bzImage -initrd ../rootfs.gz -append "rw root=/dev/ram0  ramdisk_size=40960" 
Could not open option rom 'linuxboot.bin': No such file or directory
pci_add_option_rom: failed to find romfile "pxe-e1000.bin"

И я упал в оболочке EFI, не включить загрузку.

QEMU + EFI + LINUX KERNEL + SHELL

Если я использую последнюю версию Ubuntu, используя ту же среду EFI

root@citsnmaiko-deb:/home/maiko/uefi/ovmf# qemu-system-x86_64 -L . -boot d -cdrom ../ubuntu-12.10-desktop-amd64.iso
pci_add_option_rom: failed to find romfile "pxe-e1000.bin"

... процесс загрузки работает нормально.

введите описание изображения здесь

Я пытался заменить загрузочные файлы Ubuntu моими, но, возможно, я не до конца понимаю их функциональность. Когда я просто заменяю файлы после монтирования ISO:

mkdir tmp
bsdtar xf ubuntu-12.10-desktop-amd64.iso -C tmp
cp bzImage tmp/casper/vmlinuz
cp rootfs.gz tmp/casper/initrd.lz 
genisoimage -o customUbuntu.iso tmp/
qemu-system-x86_64 -L . -boot d -cdrom customUbuntu.iso 

появляется тот же EFI Shell. Это нормально? initrd.lz и rootfs.gz являются взаимозаменяемыми, верно? Как насчет bzImage и vmlinuz?

Чего мне не хватает?

Ответы:


21

OVMF поддерживает -bootначиная с r13683 и поддерживает -kernel -append -initrdначиная с r13923 .

  1. Скачать OVMF-0.1+r14071-1.1.x86_64.rpm или более новую версию.
  2. Выписка bios.binиз об / мин:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Укажите параметр прошивки для QEMU: qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso(протестировано с помощью boot.iso Fedora, созданного со специальными мерами )

Я также тестировал qemu -kernel -append -initrdс ядром 3.5, 3.6 и 3.8.


Микропрограмма EFI имеет требования к формату и иерархии файлов для загрузочного образа ISO ( 1 ) и других для дисков. Возможно, ваш измененный образ ISO не соответствует требованиям, поэтому микропрограмма не распознает его. Микропрограмма EFI также имеет требования к формату для выполнения двоичного файла, поэтому ваш bzImage или любой другой образ ядра должен быть собран с EFISTUB.

Вы можете загрузить ядро ​​из оболочки EFI с параметрами, указанными вручную. Примеры: 2 . Вы можете создать, startup.nshчтобы сохранить немного набрав. Вы можете использовать загрузчики, чтобы иметь более полное управление. Вы должны изучить это: 2

Прошивка EFI сохраняет параметры загрузки в NVRAM. QEMU в настоящее время не сохраняет NVRAM, поэтому параметры загрузки теряются при закрытии QEMU. Без параметров загрузки, firmare пытается найти \EFI\BOOT\BOOTX64.EFIвыполнение, но его здесь нет, поэтому он не знает, что загружать, и оставляет вам управление. Чтобы загрузить ядро ​​в оболочке EFI, вам нужно просто войти в файловую систему, перейти по правильному пути и выполнить двоичный файл.

fs0:
    cd EFI\fedora
    grub.efi

или

vmlinuz.efi ...

OVMF поддерживают virtio-scsi начиная с EDK2 r13867 .


Ссылка на OVFM не работает.
jcoffland

@jcoffland На самом деле он не умер, каталоги доступны для просмотра, просто удалена папка с устаревшей версией. Перейдите по адресу download.opensuse.org/repositories/home:/jejb1:/UEFI и выберите последний выпуск, который вы можете найти, который соответствует шаблону из исходной ссылки.
LiveWireBT

1
В современной Ubuntu вы можете просто apt install ovmfи сразуkvm -bios OVMF.fd ...
Tobia


1

Не прямой ответ, но так как нет никого, вас может заинтересовать этот отчет об ошибках в xorriso - я тоже собираюсь комментировать, но вкратце, xorriso-1.2.4 с вышестоящей версией 1044 прекрасно работает для меня, и мое оборудование поддерживает именно этот скрипт (это русская вики, но часть скрипта должна быть достаточно разборчивой; обратите внимание efiboot.img).

Обратите внимание, что это /usr/lib/syslinux/isohdpfx.binsyslinux, и похоже, что в последней версии 4.06 произошли соответствующие изменения в отделе EFI.

Вот еще одна полезная информация по (U) EFI , и спасибо за скриптлет в вопросе :)


1

Используя этот скрипт , cdв дерево исходников ядра и запустите:

runlinux -- -bios ~/path/to/OVMF.fd

где OVMF.fdбыл извлечен из https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/download

Скрипт генерирует минимальную файловую систему с BusyBox, компилирует ядро ​​и запускает его в QEMU с:

qemu-system-x86_64 -enable-kvm -kernel bzImage \
                   -initrd ../rootfs.gz -bios ~/path/to/OVMF.fd

Теперь мы можем проверить, что UEFI был использован внутри QEMU, как упомянуто в этом посте :

ls /sys/firmware/efi

0
qemu-system-x86_64  -kernel xxx.elf -serial /dev/stdout -monitor stdio

4
Привет и добро пожаловать на сайт. Пожалуйста, добавьте некоторые детали в ваш ответ. Что это за команда? Где это должно быть запущено? Должно ли это быть добавлено в конфигурацию загрузчика? Как? Где? Если вы не объясните, что это такое, я боюсь, что это не полезный ответ.
Тердон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.