如何使用QEMU(kvm)引导EFI内核?


21

我正在尝试使用QEMU(kmv)模拟EFI环境;使用archboot,virtualbox需要15分钟才能以EFI模式启动。

使用旧版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内核+外壳

如果我使用同一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"

...启动过程正常。

在此处输入图片说明

我试图用我的替换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怎么样?

我想念什么?

Answers:


21

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,引导选项将丢失。如果没有引导选项,公司将尝试\EFI\BOOT\BOOTX64.EFI执行,但它不在此处,因此它不知道引导什么并将控制权留给您。在EFI Shell中引导内核所需要做的只是输入文件系统,导航至正确的路径并执行二进制文件。

fs0:
    cd EFI\fedora
    grub.efi

要么

vmlinuz.efi ...

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


OVFM链接已死。
jcoffland 2015年

@jcoffland并没有真的死,只有带有过时发行版的文件夹已被删除,目录才可浏览。转到download.opensuse.org/repositories/home:/jejb1:/UEFI,然后选择与原始链接中的模式匹配的最新版本。
LiveWireBT

1
在现代的Ubuntu中,您可以apt install ovmf然后kvm -bios OVMF.fd ...
Tobia


1

不是直接的答案,但由于您可能对此xorriso错误报告没有兴趣,我也将对此发表评论,但总而言之,带有上游修订版1044的 xorriso-1.2.4 对我来说很好用,我的硬件也可以正是这个脚本(这是俄语口语Wiki,但是脚本部分应该足够清晰;请注意efiboot.img)。

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

这是关于(U)EFI的另一种有用的知识,也感谢您提供问题中的脚本:)


1

使用此脚本,将其cd放入内核源代码树并运行:

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

其中OVMF.fd从萃取https://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

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

4
嗨,欢迎来到该网站。请在您的答案中添加一些详细信息。这是什么命令?应该在哪里运行?是否应该将其添加到bootlaoder配置中?怎么样?哪里?除非您解释这是什么,否则恐怕这不是一个有用的答案。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.