共计 2202 个字符,预计需要花费 6 分钟才能阅读完成。
CentOS使用ovmf作为qemu的uefi启动虚拟机
介绍
我们通常使用QEMU启动虚拟机都是使用SeaBIOS,这是一种BIOS的开源实现,UEFI作为BIOS的发展,那有没有UEFI的呢?答案是有-那就是OVMF。
chatgpt:OVMF是一种UEFI(统一固件接口)实现,它是一个用于在虚拟环境中运行EFI(可扩展固件接口)固件的开源项目。OVMF被广泛用于虚拟机监视器(例如QEMU)中,以提供更现代和灵活的UEFI固件支持,以代替传统的BIOS。OVMF源代码托管在GitHub上,由EDK II(UEFI开发工具包)维护和开发。OVMF支持多种虚拟化平台,包括QEMU、VirtualBox、VMware和Xen等。如果您需要在虚拟环境中运行UEFI固件,可以考虑使用OVMF。
OVMF:官方仓库:https://github.com/tianocore/edk2
下载源码
yum install make gcc uuid-devel g++ git
yum install libuuid-devel
yum install nasm -y
yum install acpica-tools
因为我用的是CentOS7.6,默认安装的版本gcc版本是4.8.5,目前edk2仓库中最新的版本编译存在一定的问题,因此我选择了tag分支中的202008的。
git clone https://github.com/tianocore/edk2.git
cd edk2
# 查看远端tag
git ls-remote --tags
# 切换到远端tag,并新建本地分支命名202008
git checkout tags/edk2-stable202008 -b 202008
# 本地checkout
git checkout 202008
# 更新子模块
git submodule update --init
环境准备
1、准备环境
# 编译工具包
make -C BaseTools
# edk2根目录下设置环境脚本
source ./edksetup.sh
该脚本运行后,会在Conf/目录下生成target.txt配置文件,该文件对应了要生成的UEFI的目标平台架构、构建toolschain版本。
2、修改Conf/target.txt文件
vim Conf/target.txt
官方举例:Example: Conf/target.txt
values to build x64 UEFI image for OVMF using GCC5 compiler:
ACTIVE_PLATFORM = OvmfPkg/OvmfPkgX64.dsc
TARGET_ARCH = X64
TOOL_CHAIN_TAG = GCC5
我们的运行目标架构是x86,gcc4.8 做如下修改,文件其他内容保持不变。
ACTIVE_PLATFORM = OvmfPkg/OvmfPkgX64.dsc
TARGET_ARCH = X64
TOOL_CHAIN_TAG = GCC48
在Conf/tools_def.txt里,有EdkII支持的所有toolchain的详细信息。每个toolchain由一个关键字表示,比如VS2015, GCC45, CLANG38等,TOOL_CHAIN_TAG的赋值只能是这些关键字中的一个。如果开发者需要支持一个新的toolchain,则至少需要修改BaseTools/Conf里的build_rule.template和tools_def.template,他们会在edksetup步骤中被复制到Conf目录。
目前EdkII支持的GCC版本从4.4到5.x,对应的toolchain关键字是GCC44, GCC45, … GCC5。实例平台Ubuntu 14.04所带gcc版本为4.8,所以TOOL_CHAIN_TAG选择GCC48。
在target.txt设置好构建目标后,环境设置就完成了。
构建编译
准备好环境之后,直接在edk2根目录下,执行build命令就行
build
build会去读取Conf/target.txt文件,也可以不读取使用命令行的方式
build -t GCC48 -a X64 -p OvmfPkg/OvmfPkgX64.dsc -b
编译完成以后,可以在Build/OvmfX64/DEBUG_GCC48/FV/目录下找到生成UEFI文件OVMF.fd。
测试是否能通过UEFI启动虚拟机
直接将原来虚拟机运行命令的
-bios seabios-tpm/out/bios.bin
修改为:即可运行,不过需要操作系统支持UEFI启动。
--bios Build/OvmfX64/DEBUG_GCC48/FV/OVMF.fd
启动界面:
编译时启用TPM功能
添加-D TPM2_ENABLE -D TPM2_CONFIG_ENABLE
选项即可。
build -p OvmfPkg/OvmfPkgX64.dsc -a X64 -b DEBUG -t GCC5 -D TPM2_ENABLE -D TPM2_CONFIG_ENABLE