如何使用 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 shell,无法启动。

QEMU + EFI + Linux 内核 + shell

如果我使用最新的 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 Shell。可以吗? initrd.lz 和 rootfs.gz 可以互换吗? bzImage 和 vmlinuz 怎么样?

我缺少什么?

答案1

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

  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 shell 启动内核。例子:2。您可以创建一个startup.nsh来节省一点打字时间。您可以使用引导加载程序进行更完整的管理。你需要学习这些:2

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

fs0:
    cd EFI\fedora
    grub.efi

或者

vmlinuz.efi ...

自 EDK2 起 OVMF 支持 virtio-scsir13867

答案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/OVMFhttps://wiki.ubuntu.com/UEFI/EDK2截至本文发布时,已在 Ubuntu 20.04 上进行了测试。

答案3

不是直接答案,但因为没有您可能感兴趣的答案这个 xorriso 错误报告-- 我也会在那里发表评论,但简而言之,xorriso-1.2.4 与上游修订版 1044对我来说效果很好,我的硬件支架完全符合这个脚本(这是一个俄语口语维基,但脚本部分应该足够清晰;注意efiboot.img)。

请注意,/usr/lib/syslinux/isohdpfx.bin来自 syslinux,最新的 4.06 似乎在 EFI 部门有相关更改。

这是另一口井(U)EFI 的有用知识,也感谢您提供问题中的 scriptlet :)

答案4

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

相关内容