如何使用 QEMU (kvm) 启动 EFI 内核?

Mai*_*oID 34 ubuntu qemu linux-kernel uefi

我正在尝试使用 QEMU (kmv) 模拟 EFI 环境;使用 archboot 在 EFI 模式下启动 virtualbox 需要 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"
Run Code Online (Sandbox Code Playgroud)

它适用于我的自定义内核和文件系统。

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

它也有 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"
Run Code Online (Sandbox Code Playgroud)

我掉进了 EFI shell,无法启动。

QEMU + EFI + LINUX 内核 + 外壳

如果我使用使用相同 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"
Run Code Online (Sandbox Code Playgroud)

...启动过程工作正常。

在此处输入图片说明

我试图用我的替换 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 
Run Code Online (Sandbox Code Playgroud)

出现相同的 EFI Shell。可以吗?initrd.lz 和 rootfs.gz 是可以互换的吧?bzImage 和 vmlinuz 怎么样?

我错过了什么?

Lin*_*ang 27

OVMF支持-bootr13683,并支持-kernel -append -initrdr13923

  1. 下载 OVMF-0.1+r14071-1.1.x86_64.rpm或更新版本。
  2. bios.bin从 rpm 中提取: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 shell 引导内核。例子:2。您可以创建一个startup.nsh以节省一点打字。您可以使用引导加载程序进行更完整的管理。你需要学习这些:2

EFI 固件将引导选项保存在 NVRAM 中。QEMU 当前不保留 NVRAM,因此一旦关闭 QEMU,引导选项就会丢失。如果没有引导选项,firmare 会尝试查找\EFI\BOOT\BOOTX64.EFI执行但它不在此处,因此它不知道要引导什么并将控制权留给您。在 EFI shell 中引导内核所需要做的只是输入文件系统,导航到正确的路径,然后执行二进制文件。

fs0:
    cd EFI\fedora
    grub.efi
Run Code Online (Sandbox Code Playgroud)

或者

vmlinuz.efi ...
Run Code Online (Sandbox Code Playgroud)

从 EDK2 r13867 开始, OVMF 支持 virtio-scsi 。

  • 在现代 Ubuntu 中,你可以只用 `apt install ovmf` 然后 `kvm -bios OVMF.fd ...` (3认同)