Jak uruchomić jądro EFI przy użyciu QEMU (kvm)?


21

Próbuję emulować środowisko EFI przy użyciu QEMU (kmv); virtualbox potrzebuje 15 minut na uruchomienie w trybie EFI przy użyciu archboot.

Korzystając ze starszego trybu BIOS, mogę uruchomić za pomocą tego polecenia:

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

i działa z moim niestandardowym jądrem i systemem plików.

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

ma także wsparcie EFI.

Próbuję zrobić to samo z plikami EFI, które pobrałem stąd

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"

I jestem wrzucony do powłoki EFI, nie mogę uruchomić.

QEMU + EFI + LINUX KERNEL + SHELL

Jeśli korzystam z najnowszej wersji Ubuntu przy użyciu tego samego środowiska 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"

... proces uruchamiania działa poprawnie.

wprowadź opis zdjęcia tutaj

Próbowałem zastąpić pliki rozruchowe Ubuntu moimi, ale może nie do końca rozumiem jego funkcjonalność. Kiedy wymieniam pliki po zamontowaniu 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 

pojawia się ta sama powłoka EFI. Czy to jest w porządku? initrd.lz i rootfs.gz są wymienne, prawda? Co powiesz na bzImage i vmlinuz?

czego mi brakuje?

Odpowiedzi:


21

OVMF obsługuje -bootod r13683 i obsługuje -kernel -append -initrdod r13923 .

  1. Pobierz OVMF-0.1+r14071-1.1.x86_64.rpm lub nowszą wersję.
  2. Wyciąg bios.binz rpm:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Podaj parametr oprogramowania układowego dla QEMU: qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso(Testowane przy użyciu boot.iso Fedory utworzonych za pomocą specjalnych środków )

Testowałem również qemu -kernel -append -initrdz jądrem 3.5, 3.6 i 3.8.


Oprogramowanie EFI ma wymagania dotyczące formatu i hierarchii plików, aby obraz ISO był bootowalny ( 1 ), a inne dla dysków. Zmodyfikowany obraz ISO prawdopodobnie nie spełniał wymagań, więc oprogramowanie układowe go nie rozpoznało. Oprogramowanie układowe EFI ma również wymagania dotyczące formatu do uruchomienia pliku binarnego, więc bzImage lub jakikolwiek obraz jądra musi zostać zbudowany za pomocą EFISTUB.

Możesz uruchomić jądro z powłoki EFI z ręcznie określonymi parametrami. Przykłady: 2 . Możesz stworzyć startup.nshdo zapisania trochę pisania. Za pomocą programów ładujących można uzyskać pełniejsze zarządzanie. Musisz się tego nauczyć: 2

Oprogramowanie EFI zapisuje opcje uruchamiania w NVRAM. QEMU obecnie nie zachowuje pamięci NVRAM, więc opcje uruchamiania są tracone po zamknięciu QEMU. Bez opcji rozruchu firmare próbuje znaleźć \EFI\BOOT\BOOTX64.EFIdo wykonania, ale nie ma go tutaj, więc nie wie, co uruchomić i pozostawia kontrolę. Aby uruchomić jądro w powłoce EFI, wystarczy wejść do systemu plików, przejść do właściwej ścieżki i uruchomić plik binarny.

fs0:
    cd EFI\fedora
    grub.efi

lub

vmlinuz.efi ...

Obsługa OVMF virtio-scsi od EDK2 r13867 .


Link OVFM nie działa.
jcoffland

@jcoffland Nie jest tak naprawdę martwy, katalogi można przeglądać, po prostu usunięto folder z nieaktualną wersją. Przejdź do download.opensuse.org/repositories/home:/jejb1:/UEFI i wybierz najnowszą dostępną wersję zgodną ze wzorcem z oryginalnego łącza.
LiveWireBT,

1
W nowoczesnym Ubuntu możesz od czasu apt install ovmfdo czasukvm -bios OVMF.fd ...
Tobia


1

Nie jest to bezpośrednia odpowiedź, ale ponieważ nie ma, być może zainteresuje Cię ten raport o błędach xorriso - ja też tam skomentuję, ale w skrócie, xorriso-1.2.4 z wersją upstream 1044 działa dobrze dla mnie i mój sprzęt działa z dokładnie ten skrypt (jest to rosyjskojęzyczna wiki, ale część skryptu powinna być wystarczająco czytelna; zwróć uwagę efiboot.img).

Zauważ, że /usr/lib/syslinux/isohdpfx.binpochodzi z syslinux i wygląda na to, że najnowsza 4.06 ma odpowiednie zmiany w dziale EFI.

Oto kolejna przydatna wiedza na temat (U) EFI , a także dziękuję za skryptlet w pytaniu :)


1

Korzystanie z tego skryptu , cdw drzewie źródłowym jądra i wykonaj:

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

skąd OVMF.fdzostał pobrany z https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/download

Skrypt generuje minimalny system plików za pomocą BusyBox, kompiluje jądro i uruchamia go w QEMU z:

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

Możemy teraz zweryfikować, czy UEFI został użyty z wnętrza QEMU, jak wspomniano w tym poście :

ls /sys/firmware/efi

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

4
Witam i witam na stronie. Dodaj kilka szczegółów do swojej odpowiedzi. Co to za polecenie? Gdzie powinien być uruchomiony? Czy powinien zostać dodany do konfiguracji bootlaodera? W jaki sposób? Gdzie? O ile nie wyjaśnisz, co to jest, obawiam się, że nie jest to przydatna odpowiedź.
terdon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.