Come avviare il kernel EFI usando QEMU (kvm)?


21

Sto cercando di emulare un ambiente EFI usando QEMU (kmv); virtualbox impiega 15 minuti per avviarsi in modalità EFI usando archboot.

Utilizzando la modalità BIOS legacy, posso avviare utilizzando questo comando:

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

e funziona con il mio kernel e file system personalizzati.

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

ha anche il supporto EFI.

Sto cercando di fare lo stesso con i file EFI che ho scaricato da qui

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"

E vengo rilasciato in una shell EFI, non abilito l'avvio.

QEMU + EFI + LINUX KERNEL + SHELL

Se utilizzo l'ultima versione di Ubuntu utilizzando lo stesso ambiente 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"

... il processo di avvio funziona bene.

inserisci qui la descrizione dell'immagine

Ho provato a sostituire i file di avvio di Ubuntu con i miei, ma forse non capisco completamente la sua funzionalità. Quando ho appena sostituito i file dopo aver montato 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 

appare la stessa shell EFI. Va bene? initrd.lz e rootfs.gz sono intercambiabili giusto? Che ne dici di bzImage e vmlinuz?

Cosa mi sto perdendo?

Risposte:


21

OVMF supporta -bootdal r13683 e supporta -kernel -append -initrddal r13923 .

  1. Scarica OVMF-0.1+r14071-1.1.x86_64.rpm o versione più recente.
  2. Estratto bios.bindal numero di giri:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Specifica il parametro firmware per QEMU: qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso(testato con boot.iso di Fedora creato con misure speciali )

Ho anche testato qemu -kernel -append -initrdcon kernel 3.5, 3.6 e 3.8.


Il firmware EFI ha requisiti di gerarchia di formati e file per l'immagine ISO da avviare ( 1 ) e altri per i dischi. L'immagine ISO modificata probabilmente non ha soddisfatto i requisiti, quindi il firmware non l'ha riconosciuta. Il firmware EFI ha anche requisiti di formato per l'esecuzione del file binario, quindi bzImage o qualsiasi immagine del kernel deve essere costruita con EFISTUB.

È possibile avviare il kernel dalla shell EFI con i parametri specificati manualmente. Esempi: 2 . È possibile creare un startup.nshper salvare un po 'di battitura. È possibile utilizzare i bootloader per una gestione più completa. Devi imparare questi: 2

Il firmware EFI salva le opzioni di avvio in NVRAM. QEMU al momento non conserva la NVRAM, quindi le opzioni di avvio vengono perse una volta chiusa QEMU. Senza opzioni di avvio, il firmare tenta di trovare \EFI\BOOT\BOOTX64.EFIl'esecuzione ma non è qui, quindi non sa cosa avviare e lascia il controllo. Quello che devi fare per avviare il kernel nella shell EFI è semplicemente inserire un filesystem, navigare su un percorso corretto ed eseguire un file binario.

fs0:
    cd EFI\fedora
    grub.efi

o

vmlinuz.efi ...

Supporto OVMF virtio-scsi da EDK2 r13867 .


Il collegamento OVFM è morto.
jcoffland,

@jcoffland Non è davvero morto, le directory sono sfogliabili solo la cartella con la versione obsoleta è stata rimossa. Vai a download.opensuse.org/repositories/home:/jejb1:/UEFI e scegli l'ultima versione che puoi trovare che corrisponde allo schema dal link originale.
LiveWireBT

1
Nella moderna Ubuntu puoi solo apt install ovmfe poikvm -bios OVMF.fd ...
Tobia,


1

Non è una risposta diretta ma poiché non ce ne sono, potresti essere interessato a questo report bug xorriso - ho intenzione di commentare anche lì ma in breve, xorriso-1.2.4 con la revisione upstream 1044 funziona bene per me e il mio hardware sta con esattamente questa sceneggiatura (è una wiki parlata in russo ma la parte della sceneggiatura dovrebbe essere abbastanza leggibile; presta attenzione efiboot.img).

Si noti che /usr/lib/syslinux/isohdpfx.binproviene da syslinux e sembra che l'ultimo 4.06 abbia cambiamenti rilevanti nel dipartimento EFI.

Ecco un altro pozzo di conoscenze utili su (U) EFI , e grazie per lo scriptlet nella domanda :)


1

Usando questo script , cdin un albero dei sorgenti del kernel ed esegui:

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

dove è OVMF.fdstato estratto da https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/download

Lo script genera un filesystem minimo con BusyBox, compila il kernel ed esegue in QEMU con:

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

Ora possiamo verificare che UEFI sia stato usato dall'interno di QEMU come menzionato in questo post :

ls /sys/firmware/efi

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

4
Ciao e benvenuto nel sito. Aggiungi alcuni dettagli alla tua risposta. Cos'è questo comando? Dove dovrebbe essere eseguito? Dovrebbe forse essere aggiunto alla configurazione del bootlaoder? Come? Dove? A meno che tu non spieghi di cosa si tratta, temo che non sia una risposta utile.
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.