Как загружать ядро ​​EFI с помощью QEMU (kvm)?

Привет, ребята, я пытаюсь подражать среде 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. Это нормально? initrd.lz и rootfs.gz взаимозаменяемы? Как насчет bzImage и vmlinuz?

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

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 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 с 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. Без параметров загрузки фирма пытается найти \EFI\BOOT\BOOTX64.EFI для выполнения, но его здесь нет, поэтому он не знает, что нужно загружать и выдает управление вам. Что нужно сделать для загрузки ядра в оболочке EFI, просто введите файловую систему, перейдите к правильному пути и выполните двоичный код.

 fs0: cd EFI\fedora grub.efi 

или

 vmlinuz.efi ... 

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

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

Обратите внимание, что /usr/lib/syslinux/isohdpfx.bin поступает из syslinux, и похоже, что последние 4,06 имеют соответствующие изменения в отделе EFI.

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

Используя этот скрипт , 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