web-dev-qa-db-ja.com

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 KERNEL + Shell

同じEFI環境を使用する最新のUbuntuリリースを使用する場合

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"

...ブートプロセスは正常に動作します。

enter image description here

私は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はどうですか?

何が欠けていますか?

22
MaikoID

OVMFは r1368 以降の-bootをサポートし、 r1392 以降の-kernel -append -initrdをサポートしています。

  1. ダウンロードOVMF-0.1+r14071-1.1.x86_64.rpm以降のバージョン。
  2. Rpmから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でテスト)

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


EFIファームウェアには、ISOイメージをブート可能( 1 )にするためのフォーマットとファイル階層の要件、およびディスクのその他の要件があります。変更されたISOイメージはおそらく要件を満たしていないため、ファームウェアはそれを認識しませんでした。 EFIファームウェアには、バイナリを実行するためのフォーマット要件もあります。そのため、bzImageまたはEFISTUBを使用して構築する必要のあるカーネルイメージを作成します。

パラメータを手動で指定して、EFI Shellからカーネルを起動できます。例: 2startup.nshを作成して、少しタイプする手間を省くことができます。ブートローダーを使用して、より完全な管理を行うことができます。これらを学ぶ必要があります: 2

EFIファームウェアは、ブートオプションをNVRAMに保存します。 QEMUは現在NVRAMを保持しないため、QEMUを閉じると起動オプションは失われます。起動オプションがない場合、ファームウェアは実行する\EFI\BOOT\BOOTX64.EFIを見つけようとしますが、ここにはないため、何を起動するかわからず、制御はユーザーに委ねられます。 EFI Shellでカーネルを起動するために必要なことは、ファイルシステムに入り、適切なパスに移動し、バイナリを実行することだけです。

fs0:
    cd EFI\Fedora
    grub.efi

または

vmlinuz.efi ...

EDK2以降のOVMFはvirtio-scsiをサポートしています r13867

24
Lingzhu Xiang

直接的な回答ではありませんが、興味のあるものはないため、 this xorriso bugreport -私もそこでコメントしますが、簡単に言えば、xorriso-1.2.4に pstreamリビジョン1044 私と私のハードウェアスタンドで問題なく動作します このスクリプト (ロシア語のwikiですが、スクリプトの部分は十分に読みやすいはずです。efiboot.imgに注意してください)。

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

(U)EFIに関する有用な知識 の別のウェルがあります。質問のスクリプトレットにも感謝します:)

1

このスクリプトcdをカーネルソースツリーに使用して実行します。

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

どこ OVMF.fdhttps://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.Zip/download から抽出されました

このスクリプトは、BusyBoxを使用して最小限のファイルシステムを生成し、カーネルをコンパイルして、次のコマンドでQEMUで実行します。

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

これで、QEMU内からUEFIが使用されたことを確認できます この投稿で述べたように

ls /sys/firmware/efi
qemu-system-x86_64  -kernel xxx.elf -serial /dev/stdout -monitor stdio
0
leesagacious