Como inicializar o kernel EFI usando QEMU (kvm)?

21

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

Usando o modo BIOS herdado, 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 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

também tem suporte a EFI.

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

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 sou deixado cair em um shell EFI, não habilito para inicializar.

QEMU + EFI + LINUX KERNEL + SHELL

Se eu usar a versão mais recente do Ubuntu, usando o mesmo ambiente 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"

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

insira a descrição da imagem aqui

Tentei substituir os arquivos de inicialização do Ubuntu pelos meus, mas talvez eu não entenda completamente sua funcionalidade. Quando substituo 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. Tudo bem? initrd.lz e rootfs.gz são intercambiáveis, certo? Que tal bzImage e vmlinuz?

o que estou perdendo?

MaikoID
fonte

Respostas:

21

O OVMF suporta -bootdesde r13683 e -kernel -append -initrddesde r13923 .

  1. Baixe OVMF-0.1+r14071-1.1.x86_64.rpm ou versão mais recente.
  2. Extrato bios.binda 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 )

Também testei qemu -kernel -append -initrdcom o kernel 3.5, 3.6 e 3.8.


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

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

O firmware EFI salva as opções de inicialização na NVRAM. O QEMU atualmente não preserva a NVRAM; portanto, as opções de inicialização são perdidas quando você fecha o QEMU. Sem as opções de inicialização, o firmare tenta encontrar \EFI\BOOT\BOOTX64.EFIa execução, mas não está aqui; portanto, 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 adequado e executar um binário.

fs0:
    cd EFI\fedora
    grub.efi

ou

vmlinuz.efi ...

O OVMF oferece suporte ao virtio-scsi desde o EDK2 r13867 .

Lingzhu Xiang
fonte
OVFM link está morto.
Jcoffland #
@jcoffland Não está realmente morto, os diretórios são navegáveis, apenas a pasta com a versão desatualizada foi removida. Vá para download.opensuse.org/repositories/home:/jejb1:/UEFI e escolha a versão mais recente possível que corresponda ao padrão no link original.
LiveWireBT
1
No Ubuntu moderno você pode apenas apt install ovmfe depoiskvm -bios OVMF.fd ...
Tobia
1

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

Observe que /usr/lib/syslinux/isohdpfx.binvem do syslinux e parece que o mais recente 4.06 possui alterações relevantes no departamento EFI.

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

Michael Shigorin
fonte
1

Usando este script , cdem uma árvore de origem do kernel e execute:

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

onde OVMF.fdfoi extraído de https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/download

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, conforme mencionado neste post :

ls /sys/firmware/efi
Ciro Santilli adicionou uma nova foto
fonte
0
qemu-system-x86_64  -kernel xxx.elf -serial /dev/stdout -monitor stdio
leesagacious
fonte
4
Olá e bem-vindo ao site! Adicione alguns detalhes à sua resposta. O que é esse comando? Para onde deveria ser executado? Talvez deva ser adicionado à configuração do bootlaoder? Quão? Onde? A menos que você explique o que é isso, receio que não seja uma resposta útil.
terdon