Як завантажувати ядро ​​EFI за допомогою QEMU (kvm)?


21

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

Використовуючи застарілий режим 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?

Що я пропускаю?

Відповіді:


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.binпоходить від syslinux, і, здається, останній 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.