Como inicializar o kernel do EFI usando o QEMU (kvm)?

19

Estou tentando emular um ambiente EFI usando o QEMU (kmv); O virtualbox leva 15 minutos para inicializar no modo EFI usando o archboot.

Usando o modo de BIOS legado, posso inicializar 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"

e funciona com o meu kernel e sistema de arquivos personalizados.

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

tem suporte EFI também.

Estou tentando fazer o mesmo com os arquivos EFI que baixei aqui

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 eu estou solto em um shell EFI, não habilitado para inicializar.

SeeuusaraúltimaversãodoUbuntuusandoomesmoambienteEFI

root@citsnmaiko-deb:/home/maiko/uefi/ovmf#qemu-system-x86_64-L.-bootd-cdrom../ubuntu-12.10-desktop-amd64.isopci_add_option_rom:failedtofindromfile"pxe-e1000.bin"

... o processo de inicialização funciona bem.

Eu tentei substituir os arquivos de inicialização do Ubuntu pelo meu, mas talvez eu não entenda completamente sua funcionalidade. Quando eu apenas substituir os arquivos depois de montar o 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 

o mesmo EFI Shell aparece. Está bem? initrd.lz e rootfs.gz são intercambiáveis, certo? Que tal bzImage e vmlinuz?

O que estou perdendo?

    
por MaikoID 26.10.2012 / 20:15

4 respostas

17

OVMF suporta -boot desde r13683 e suporta -kernel -append -initrd desde r13923 .

  1. Faça o download OVMF-0.1+r14071-1.1.x86_64.rpm ou a versão mais recente.
  2. Extraia bios.bin do rpm: rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Especifique o parâmetro de firmware para o QEMU: qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso (testado com o boot.iso do Fedora criado com medidas especiais )

Eu também testei qemu -kernel -append -initrd com o kernel 3.5, 3.6 e 3.8.

O firmware EFI tem requisitos de formato e hierarquia de arquivos para que a imagem ISO seja inicializável ( 1 ), e outros para discos. Sua imagem ISO modificada provavelmente não atendeu aos requisitos, portanto, o firmware não a reconheceu. O firmware EFI também possui requisitos de formato para que o binário seja executado, portanto, sua imagem do kernel bzImage ou qualquer outra que precise ser construída com EFISTUB.

Você pode inicializar o kernel a partir do shell EFI com os parâmetros especificados manualmente. Exemplos: 2 . Você pode criar um startup.nsh para salvar um pouco de digitação. Você pode usar bootloaders para ter um gerenciamento mais completo. Você precisa aprender: 2

O firmware EFI salva as opções de inicialização na NVRAM. No momento, o QEMU não preserva a NVRAM, portanto, as opções de inicialização são perdidas quando você fecha o QEMU. Sem opções de inicialização, o firmare tenta encontrar \EFI\BOOT\BOOTX64.EFI para executar, mas não está aqui, então ele não sabe o que inicializar e deixa o controle para você. O que você precisa fazer para inicializar o kernel no shell EFI é apenas entrar em um sistema de arquivos, navegar para um caminho apropriado e executar um binário.

fs0:
    cd EFI\fedora
    grub.efi

ou

vmlinuz.efi ...

OVMF suporta o virtio-scsi desde o EDK2 r13867 .

    
por 30.11.2012 / 10:35
1

Não é uma resposta direta, mas como não há nenhuma, você pode estar interessado em este relatório de bug do xorriso - - Vou comentar lá também, mas resumindo, o xorriso-1.2.4 com o upstream A revisão 1044 funciona bem para mim e para meu suporte de hardware com exatamente este script (é um wiki falado em russo, mas o parte script deve ser legível o suficiente, preste atenção em efiboot.img ).

Note que /usr/lib/syslinux/isohdpfx.bin vem do syslinux e parece que o último 4.06 tem mudanças relevantes no departamento da EFI.

Aqui está outro poço de conhecimento útil sobre (U) EFI , e obrigado pelo roteiro em a pergunta também:)

    
por 09.11.2012 / 19:37
1

Usando este script , cd em uma árvore de código-fonte do kernel e execute:

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

em que OVMF.fd foi extraído do link

O script gera um sistema de arquivos mínimo com o BusyBox, compila o kernel e o executa no QEMU com:

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

Agora podemos verificar se o UEFI foi usado dentro do QEMU como mencionado neste post :

ls /sys/firmware/efi
    
por 07.09.2015 / 15:16
0
qemu-system-x86_64  -kernel xxx.elf -serial /dev/stdout -monitor stdio
    
por 15.10.2018 / 08:48