我正在尝试使用 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,无法启动。
如果我使用最新的 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 支持-boot
自r13683,并支持-kernel -append -initrd
自r13923。
- 下载
OVMF-0.1+r14071-1.1.x86_64.rpm
或更新版本。 bios.bin
从转速中提取:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
- 指定 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/OVMF和https://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