QEMU(kvm)を使用してEFIカーネルを起動するには?

QEMU(kvm)を使用してEFIカーネルを起動するには?

QEMU(kmv)を使用してEFI環境をエミュレートしようとしています。 virtualboxをArchbootを使用してEFIモードで起動するには15分かかります。

レガシー BIOS モードでは、以下を使用して起動できます。

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

私のカスタムカーネルとファイルシステムで動作します。

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

EFIもサポートしています。

ここからダウンロードしたEFIファイルで同じことをしようとしています。

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"

EFI シェルに閉じ込められて起動できません。

QEMU + EFI + Linuxカーネル + シェル

最新のUbuntuバージョンを使用し、同じ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"

...ブートプロセスが正しく機能します。

ここに画像の説明を入力してください。

Ubuntuブートファイルを私のものに置き換えようとしましたが、その機能を完全に理解していない可能性があります。 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 

同じEFIシェルが表示されます。私はできますか? initrd.lzとrootfs.gzは互いに置き換えて使用できますか? bzImageとvmlinuzはどうですか?

私は何を見逃していますか?

答え1

OVMFは-boot今後サポートしています。r13683-kernel -append -initrd自己支援r13923

  1. ダウンロード OVMF-0.1+r14071-1.1.x86_64.rpmまたは最新バージョン。
  2. bios.binタチから抽出:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. QEMUのファームウェアパラメーターを指定します。 (qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.isoテストと生成にFedoraのboot.isoを使用します。特別措置)

また、qemu -kernel -append -initrdカーネル3.5、3.6、3.8でテストしました。


EFIファームウェアには、起動可能なISOイメージのフォーマットとファイル層の要件があります(1)などのディスク。修正されたISOイメージが要件を満たしていないため、ファームウェアはそれを認識しない可能性があります。 EFIファームウェアには実行するバイナリのフォーマット要件もあるため、bzImageまたはカーネルイメージをEFISTUBとしてビルドする必要があります。

手動で指定されたパラメータを使用してEFIシェルからカーネルを起動できます。例:2startup.nshタイピング時間を少し節約するために1つを作成できます。より完全な管理のためにブートローダを使用できます。あなたは以下を学ぶ必要があります:2

EFIファームウェアは起動オプションをNVRAMに保存します。 QEMU は現在 NVRAM を保持していないため、QEMU がシャットダウンすると起動オプションが失われます。ブートオプションがない場合、ファームウェアは\EFI\BOOT\BOOTX64.EFI実行を見つけようとしますが、ここにないので、何をブートする必要があるのか​​わからず、コントロールをユーザーに任せます。 EFIシェルでカーネルを起動するために必要なのは、ファイルシステムに入り、正しいパスに移動してバイナリを実行することだけです。

fs0:
    cd EFI\fedora
    grub.efi

または

vmlinuz.efi ...

OVMFはEDK2からvirtio-scsiをサポートしています。r13867

答え2

最新のUbuntu 20.04:

sudo qemu-system-x86_64 -enable-kvm -bios /usr/share/ovmf/OVMF.fd -hda myimage.raw 

初期のUbuntuと他のLinuxの場合:

cd ~
git clone git://github.com/tianocore/edk2.git
cd edk2
git submodule init
git submodule update --depth=1
make -C BaseTools
. edksetup.sh
vi Conf/target.txt
  ACTIVE_PLATFORM       = MdeModulePkg/MdeModulePkg.dsc 
  TOOL_CHAIN_TAG        = GCC5  # or GCC49 GCC48 ... check ./Conf/tools_def.txt
  TARGET_ARCH           = X64
build
vi Conf/target.txt
  ACTIVE_PLATFORM       = OvmfPkg/OvmfPkgX64.dsc
build
sudo qemu-system-x86_64 -enable-kvm -bios ./Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd -hda myimage.raw 

説明は以下で修正されましたhttps://wiki.ubuntu.com/UEFI/OVMFそしてhttps://wiki.ubuntu.com/UEFI/EDK2出版当時、Ubuntu 20.04でテストされました。

答え3

直接の回答ではないけど、興味があるような回答がないのでこのxorrisoのバグレポート- そこにもコメントを残す予定ですが、簡単に言うとxorriso-1.2.4は次のようになります。アップストリームリビジョン1044私によく合い、私のハードウェアスタンドは完璧にフィットします。このスクリプト(これはロシア語で書かれたwikiですが、スクリプトの部分は十分に明確でなければなりません。注efiboot.img)。

syslinuxからの/usr/lib/syslinux/isohdpfx.bin最新の4.06には、EFI部門に関する変更があるようです。

これは別の井戸です(U)EFIに関する有用な知識、質問にスクリプトレットを提供していただきありがとうございます :)

答え4

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

関連情報