¿Cómo arrancar el kernel EFI usando QEMU (kvm)?

21

Estoy tratando de emular un entorno EFI usando QEMU (kmv); virtualbox tarda 15 minutos en arrancar en modo EFI usando archboot.

Usando el modo BIOS heredado, puedo iniciar usando este 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"

y funciona con mi kernel personalizado y sistema de archivos.

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

También tiene soporte EFI.

Estoy tratando de hacer lo mismo con los archivos EFI que descargué desde aquí

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"

Y me dejo caer en un shell EFI, no habilito para arrancar.

QEMU + EFI + LINUX KERNEL + SHELL

Si uso la última versión de Ubuntu usando el mismo entorno 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"

... el proceso de arranque funciona bien.

ingrese la descripción de la imagen aquí

Intenté reemplazar los archivos de arranque de Ubuntu con los míos, pero tal vez no entiendo completamente su funcionalidad. Cuando acabo de reemplazar los archivos después de montar el 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 

aparece el mismo EFI Shell. ¿Está bien? initrd.lz y rootfs.gz son intercambiables ¿verdad? ¿Qué tal bzImage y vmlinuz?

¿Qué me estoy perdiendo?

MaikoID
fuente

Respuestas:

21

OVMF admite -bootdesde r13683 y admite -kernel -append -initrddesde r13923 .

  1. Descarga OVMF-0.1+r14071-1.1.x86_64.rpm o versión más reciente.
  2. Extracto bios.binde las rpm:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Especifique el parámetro de firmware para QEMU: qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso(Probado con el boot.iso de Fedora creado con medidas especiales )

También probé qemu -kernel -append -initrdcon el kernel 3.5, 3.6 y 3.8.


El firmware EFI tiene requisitos de formato y jerarquía de archivos para que la imagen ISO sea de arranque ( 1 ) y otra para los discos. Su imagen ISO modificada probablemente no cumplió con los requisitos, por lo que el firmware no la reconoció. El firmware EFI también tiene requisitos de formato para que el binario se ejecute, por lo que su bzImage o cualquier otra imagen del núcleo debe construirse con EFISTUB.

Puede arrancar el núcleo desde el shell EFI con parámetros especificados manualmente. Ejemplos: 2 . Puede crear una startup.nshpara guardar un poco escribiendo. Puede usar cargadores de arranque para tener una administración más completa. Necesita aprender estos: 2

El firmware EFI guarda las opciones de arranque en NVRAM. QEMU actualmente no conserva NVRAM, por lo que las opciones de arranque se pierden una vez que cierra QEMU. Sin opciones de arranque, el firmare intenta encontrar la \EFI\BOOT\BOOTX64.EFIejecución, pero no está aquí, por lo que no sabe qué arrancar y le deja el control. Lo que debe hacer para arrancar el núcleo en el shell EFI es simplemente ingresar a un sistema de archivos, navegar a una ruta adecuada y ejecutar un binario.

fs0:
    cd EFI\fedora
    grub.efi

o

vmlinuz.efi ...

OVMF admite virtio-scsi desde EDK2 r13867 .

Lingzhu Xiang
fuente
El enlace OVFM está muerto.
jcoffland
@jcoffland No está realmente muerto, los directorios son navegables solo la carpeta con la versión obsoleta ha sido eliminada. Vaya a download.opensuse.org/repositories/home:/jejb1:/UEFI y elija la última versión que pueda encontrar que coincida con el patrón del enlace original.
LiveWireBT
1
En Ubuntu moderno, puede simplemente apt install ovmfy luegokvm -bios OVMF.fd ...
Tobia
El enlace download.opensuse.org/repositories/home:/jejb1:/UEFI/… está muerto
MUY Bélgica
1

No es una respuesta directa, pero como no hay ninguna, puede que le interese este informe de errores de xorriso : voy a comentar allí también, pero en resumen, xorriso-1.2.4 con la revisión aguas arriba 1044 funciona bien para mí y mi hardware es compatible con exactamente este script (es un wiki hablado en ruso, pero la parte del script debe ser lo suficientemente legible; preste atención efiboot.img).

Tenga en cuenta que /usr/lib/syslinux/isohdpfx.binproviene de syslinux y parece que el último 4.06 tiene cambios relevantes en el departamento de EFI.

Aquí hay otro conocimiento útil sobre (U) EFI , y gracias por el scriptlet en la pregunta también :)

Michael Shigorin
fuente
1

Usando este script , cden un árbol fuente del núcleo y ejecute:

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

donde OVMF.fdse extrajo de https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/download

El script genera un sistema de archivos mínimo con BusyBox, compila el núcleo y lo ejecuta en QEMU con:

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

Ahora podemos verificar que UEFI se utilizó desde dentro de QEMU como se menciona en esta publicación :

ls /sys/firmware/efi
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
0
qemu-system-x86_64  -kernel xxx.elf -serial /dev/stdout -monitor stdio
legagaz
fuente
44
Hola y bienvenidos al sitio. Agregue algunos detalles a su respuesta. ¿Qué es este comando? ¿Dónde se debe ejecutar? ¿Debería agregarse a la configuración del bootlaoder quizás? ¿Cómo? ¿Dónde? A menos que explique qué es esto, me temo que no es una respuesta útil.
terdon