Comment démarrer le noyau EFI en utilisant QEMU (kvm)?


21

J'essaie d'émuler un environnement EFI en utilisant QEMU (kmv); virtualbox prend 15 minutes pour démarrer en mode EFI en utilisant archboot.

En utilisant le mode BIOS hérité, je peux démarrer en utilisant cette commande:

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

et cela fonctionne avec mon noyau et mon système de fichiers personnalisés.

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

il a également un support EFI.

J'essaie de faire la même chose avec les fichiers EFI que j'ai téléchargés à partir d'ici

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"

Et je suis tombé dans un shell EFI, pas permis de démarrer.

QEMU + EFI + LINUX KERNEL + SHELL

Si j'utilise la dernière version d'Ubuntu en utilisant le même environnement 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"

... le processus de démarrage fonctionne correctement.

entrez la description de l'image ici

J'ai essayé de remplacer les fichiers de démarrage d'Ubuntu par les miens mais je ne comprends peut-être pas complètement sa fonctionnalité. Quand je remplace juste les fichiers après avoir monté l'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 

le même shell EFI apparaît. Est-ce que c'est bon? initrd.lz et rootfs.gz sont interchangeables non? Que diriez-vous de bzImage et vmlinuz?

Qu'est-ce que je rate?

Réponses:


21

OVMF prend en charge -bootdepuis r13683 et prend en charge -kernel -append -initrddepuis r13923 .

  1. Téléchargement OVMF-0.1+r14071-1.1.x86_64.rpm ou version plus récente.
  2. Extrait bios.bindu rpm:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Spécifiez le paramètre du firmware pour QEMU: qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso(Testé avec le boot.iso de Fedora créé avec des mesures spéciales )

J'ai également testé qemu -kernel -append -initrdavec le noyau 3.5, 3.6 et 3.8.


Le micrologiciel EFI a des exigences de format et de hiérarchie de fichiers pour que l'image ISO soit amorçable ( 1 ) et autre pour les disques. Votre image ISO modifiée ne répondant probablement pas aux exigences, le micrologiciel ne l'a pas reconnue. Le micrologiciel EFI a également des exigences de format pour que le binaire s'exécute, donc votre bzImage ou toute autre image du noyau doit être construite avec EFISTUB.

Vous pouvez démarrer le noyau à partir du shell EFI avec des paramètres spécifiés manuellement. Exemples: 2 . Vous pouvez créer un startup.nshpour enregistrer un peu de frappe. Vous pouvez utiliser des chargeurs de démarrage pour avoir une gestion plus complète. Vous devez apprendre ces éléments: 2

Le firmware EFI enregistre les options de démarrage dans la NVRAM. QEMU ne conserve pas actuellement la NVRAM, donc les options de démarrage sont perdues une fois que vous fermez QEMU. Sans options de démarrage, le firmare essaie de trouver \EFI\BOOT\BOOTX64.EFIpour exécuter mais il n'est pas là, il ne sait donc pas quoi démarrer et vous laisse le contrôle. Ce que vous devez faire pour démarrer le noyau dans le shell EFI est simplement d'entrer un système de fichiers, de naviguer vers un chemin approprié et d'exécuter un binaire.

fs0:
    cd EFI\fedora
    grub.efi

ou

vmlinuz.efi ...

OVMF prend en charge virtio-scsi depuis EDK2 r13867 .


La liaison OVFM est morte.
jcoffland

@jcoffland Ce n'est pas vraiment mort, les répertoires sont consultables juste le dossier avec la version obsolète a été supprimé. Accédez à download.opensuse.org/repositories/home:/jejb1:/UEFI et choisissez la dernière version que vous pouvez trouver qui correspond au modèle du lien d'origine.
LiveWireBT

1
Dans Ubuntu moderne, vous pouvez juste apt install ovmfet ensuitekvm -bios OVMF.fd ...
Tobia


1

Ce n'est pas une réponse directe, mais comme il n'y en a pas, vous pourriez être intéressé par ce rapport de bogue xorriso - je vais commenter là aussi, mais en bref, xorriso-1.2.4 avec la révision en amont 1044 fonctionne bien pour moi et mon support matériel avec exactement ce script (c'est un wiki parlé russe mais la partie script doit être suffisamment lisible; faites attention à efiboot.img).

Notez que cela /usr/lib/syslinux/isohdpfx.binvient de syslinux et il semble que la dernière version 4.06 ait des changements pertinents dans le département EFI.

Voici un autre puits de connaissances utiles sur (U) EFI , et merci également pour le scriptlet dans la question :)


1

En utilisant ce script , cddans une arborescence source du noyau et exécutez:

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

où a OVMF.fdété extrait de https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/download

Le script génère un système de fichiers minimal avec BusyBox, compile le noyau et l'exécute dans QEMU avec:

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

Nous pouvons maintenant vérifier que l'UEFI a été utilisé depuis l'intérieur de QEMU comme mentionné dans ce post :

ls /sys/firmware/efi

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

4
Bonjour et bienvenue sur le site. Veuillez ajouter quelques détails à votre réponse. Quelle est cette commande? Où doit-il être exécuté? Doit-il être ajouté à la configuration de bootlaoder peut-être? Comment? Où? Sauf si vous expliquez ce que c'est, je crains que ce ne soit pas une réponse utile.
terdon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.