Wie starte ich den EFI-Kernel mit QEMU (kvm)?

21

Ich versuche, eine EFI-Umgebung mit QEMU (kmv) zu emulieren. Das Booten von virtualbox im EFI-Modus mit archboot dauert 15 Minuten.

Im alten BIOS-Modus kann ich mit folgendem Befehl booten:

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

und es funktioniert mit meinem benutzerdefinierten Kernel und Dateisystem.

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

Es hat auch EFI-Unterstützung.

Ich versuche dasselbe mit EFI-Dateien zu tun, die ich von hier heruntergeladen habe

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"

Und ich bin in eine EFI-Shell gefallen, nicht zum Booten aktivieren.

QEMU + EFI + LINUX KERNEL + SHELL

Wenn ich die neueste Ubuntu-Version mit derselben EFI-Umgebung verwende

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"

... der Bootvorgang funktioniert einwandfrei.

Bildbeschreibung hier eingeben

Ich habe versucht, die Ubuntu-Bootdateien durch meine zu ersetzen, aber ich verstehe die Funktionalität möglicherweise nicht vollständig. Wenn ich nur die Dateien nach dem Mounten der ISO ersetze:

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 

Die gleiche EFI-Shell wird angezeigt. Ist es o.k? initrd.lz und rootfs.gz sind austauschbar, oder? Wie wäre es mit bzImage und vmlinuz?

Was vermisse ich?

MaikoID
quelle

Antworten:

21

OVMF unterstützt -bootseit r13683 und unterstützt -kernel -append -initrdseit r13923 .

  1. Download OVMF-0.1+r14071-1.1.x86_64.rpm oder neuere Version.
  2. Auszug bios.binaus der Drehzahl:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Geben Sie den Firmware-Parameter für QEMU an: qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso(Getestet mit Fedoras boot.iso, das mit speziellen Maßnahmen erstellt wurde. )

Ich habe auch qemu -kernel -append -initrdmit Kernel 3.5, 3.6 und 3.8 getestet .


Für die EFI-Firmware gelten Format- und Dateihierarchieanforderungen, damit das ISO-Image bootfähig ist ( 1 ), und für Festplatten andere Anforderungen . Ihr modifiziertes ISO-Image entsprach wahrscheinlich nicht den Anforderungen, sodass die Firmware es nicht erkannte. Die EFI-Firmware hat auch Formatanforderungen für die Ausführung der Binärdatei, sodass Ihr bzImage oder ein beliebiges Kernel-Image mit EFISTUB erstellt werden muss.

Sie können den Kernel von der EFI-Shell mit manuell festgelegten Parametern booten. Beispiele: 2 . Sie können startup.nshein wenig tippen, um zu speichern. Sie können Bootloader verwenden, um eine umfassendere Verwaltung zu erhalten. Sie müssen diese lernen: 2

Die EFI-Firmware speichert die Startoptionen im NVRAM. QEMU behält NVRAM derzeit nicht bei, sodass die Startoptionen verloren gehen, sobald Sie QEMU schließen. Ohne Boot-Optionen versucht die Firma, die Ausführung zu finden \EFI\BOOT\BOOTX64.EFI, aber sie ist nicht hier, sodass sie nicht weiß, was sie booten soll, und die Kontrolle Ihnen überlässt. Zum Booten des Kernels in der EFI-Shell müssen Sie lediglich ein Dateisystem eingeben, zu einem geeigneten Pfad navigieren und eine Binärdatei ausführen.

fs0:
    cd EFI\fedora
    grub.efi

oder

vmlinuz.efi ...

OVMF unterstützt virtio-scsi seit EDK2 r13867 .

Lingzhu Xiang
quelle
OVFM-Verbindung ist tot.
Jcoffland
@jcoffland Es ist nicht wirklich tot, die Verzeichnisse sind durchsuchbar, nur der Ordner mit der veralteten Version wurde entfernt. Gehen Sie zu download.opensuse.org/repositories/home:/jejb1:/UEFI und wählen Sie die neueste Version aus, die dem Muster unter dem ursprünglichen Link entspricht.
LiveWireBT
1
In modernen Ubuntu können Sie nur apt install ovmfund dannkvm -bios OVMF.fd ...
Tobia
1

Keine direkte Antwort, aber da es keine gibt, könnte Sie dieser xorriso-Bugreport interessieren - ich werde das auch kommentieren, aber kurz gesagt, xorriso-1.2.4 mit der Upstream-Revision 1044 funktioniert gut für mich und meine Hardware steht mit genau dieses Skript (es ist ein russisch gesprochenes Wiki, aber der Skriptteil sollte gut lesbar sein; achten Sie darauf efiboot.img).

Beachten Sie, dass dies /usr/lib/syslinux/isohdpfx.binvon Syslinux stammt und die neueste Version 4.06 anscheinend relevante Änderungen in der EFI-Abteilung aufweist.

Hier ist ein weiteres nützliches Wissen zu (U) EFI und vielen Dank für das Scriptlet in der Frage :)

Michael Shigorin
quelle
1

Verwenden Sie dieses Skript , um cdeinen Kernel-Quelltextbaum zu erstellen, und führen Sie Folgendes aus:

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

wo OVMF.fdwurde aus https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/download extrahiert

Das Skript generiert mit BusyBox ein minimales Dateisystem, kompiliert den Kernel und führt ihn in QEMU aus mit:

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

Wir können jetzt überprüfen, ob UEFI innerhalb von QEMU verwendet wurde, wie in diesem Beitrag erwähnt :

ls /sys/firmware/efi
Ciro Santilli ist ein Schauspieler
quelle
0
qemu-system-x86_64  -kernel xxx.elf -serial /dev/stdout -monitor stdio
leesagacious
quelle
4
Hallo und willkommen auf der Seite. Bitte fügen Sie Ihrer Antwort einige Details hinzu. Was ist dieser Befehl? Wo soll es laufen? Sollte es vielleicht zur Bootlaoder-Konfiguration hinzugefügt werden? Wie? Woher? Ich fürchte, es ist keine nützliche Antwort, es sei denn, Sie erklären, was dies ist.
Terdon