web-dev-qa-db-fra.com

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

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 abandonné dans un shell EFI, pas activé pour 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.

enter image description here

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?

22
MaikoID

OVMF prend en charge -boot depuis r1368 , et prend en charge -kernel -append -initrd depuis r1392 .

  1. TéléchargerOVMF-0.1+r14071-1.1.x86_64.rpm ou version plus récente.
  2. Extrait bios.bin à partir du rpm: rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Spécifiez le paramètre du micrologiciel 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 mesures spéciales )

J'ai aussi testé qemu -kernel -append -initrd avec 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 d'EFI Shell avec des paramètres spécifiés manuellement. Exemples: 2 . Vous pouvez créer un startup.nsh pour économiser un peu de frappe. Vous pouvez utiliser des chargeurs de démarrage pour avoir une gestion plus complète. Vous devez les apprendre: 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.EFI à exécuter mais il n'est pas là, donc il ne sait pas quoi démarrer et vous laisse le contrôle. Ce que vous devez faire pour démarrer le noyau dans EFI Shell 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 .

24
Lingzhu Xiang

Pas une réponse directe mais comme il n'y en a aucune qui pourrait vous intéresser ce rapport de bug xorriso - Je vais commenter là aussi mais en bref, xorriso-1.2.4 avec le en amont révision 1044 fonctionne bien pour moi et mon matériel avec exactement ce script (c'est un wiki parlé russe mais la partie script devrait être suffisamment lisible; faites attention à efiboot.img).

Notez que /usr/lib/syslinux/isohdpfx.bin vient 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
Michael Shigorin

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

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

OVMF.fd a é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 cet article :

ls /sys/firmware/efi
qemu-system-x86_64  -kernel xxx.elf -serial /dev/stdout -monitor stdio
0
leesagacious