编译qemu/arm64的uefi

在arm64上启动qemu虚拟机有两种方式,一种是通过-kernel 的方式boot kernel,另一种是先启动uefi再boot kernel。本文记录一下怎么编译qemu/arm64 的uefi。

uefi可以大概理解为bios的升级版。它是一个开放的标准,并没有官方的实现。目前用的比较多的实现是intel开源的https://github.com/tianocore/edk2。这个edk2是一个可以跨平台编译uefi的项目,arm64也是用的这个代码。

编译主要是参照arm的开发者文档:https://developer.arm.com/tools-and-software/open-source-software/firmware/edkii-uefi-firmware/building-edkii-uefi-firmware-for-arm-platforms/set-up-the-development-environment。 我就翻译整理一下。由于编译过程比较繁琐,直接写脚本了。

这个脚本要在ubuntu 18.04 for x86上运行。

mkdir source
cd source
export WORKSPACE=$PWD

git clone https://github.com/tianocore/edk2-platforms.git
git clone https://github.com/acpica/acpica.git
git clone https://github.com/tianocore/edk2.git

cd edk2
git submodule update --init
cd ..

sudo apt install python -y
sudo apt install python3 python3-distutils -y
sudo apt install uuid-dev -y

sudo apt install build-essential -y 
sudo apt install bison -y
sudo apt install flex -y

mkdir $WORKSPACE/toolchain
cd $WORKSPACE/toolchain
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf.tar.xz
tar xf gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf.tar.xz

cd $WORKSPACE
make -C $WORKSPACE/acpica


#build edk2
export GCC5_AARCH64_PREFIX=$WORKSPACE/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-
export PACKAGES_PATH=$WORKSPACE/edk2:$WORKSPACE/edk2-platforms
export IASL_PREFIX=$WORKSPACE/acpica/generate/unix/bin/

export PYTHON_COMMAND=/usr/bin/python
source edk2/edksetup.sh
make -C edk2/BaseTools

#build for qemu/virt
build -a AARCH64 -t GCC5 -p edk2/ArmVirtPkg/ArmVirtQemu.dsc -b DEBUG
build -a AARCH64 -t GCC5 -p edk2/ArmVirtPkg/ArmVirtQemu.dsc -b RELEASE

在Build目录下可以找到QEMU_EFI.fd文件:

find Build/ -name "QEMU_EFI.fd"

这个文件就是uefi 镜像,可以把它当作-bios的参数或者pflash的参数。可以参考https://wiki.ubuntu.com/ARM64/QEMU

更详细的信息可参考上面的链接。

### 准备工作 为了能够在 x86 环境下的 Ubuntu 22.04 上成功使用 QEMU 模拟 ARM64 架构并安装和运行 Ubuntu 22.04,需先完成一系列准备工作。 #### 安装必要的软件包 确保主机已更新至最新状态,并安装所需的工具: ```bash sudo apt update && sudo apt upgrade -y sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager gcc-aarch64-linux-gnu gdb-multiarch -y ``` 上述命令会安装 KVM、libvirt 及其客户端、桥接实用程序以及用于编译 ARM64 的 GCC 工具链和多架构 GDB 调试器[^3]。 #### 配置环境变量 编辑 `/etc/profile` 文件,在文件末尾追加以下两行来设置交叉编译环境变量: ```bash export CROSS_COMPILE=/usr/bin/aarch64-linux-gnu- export ARCH=arm64 ``` 使更改生效: ```bash source /etc/profile ``` ### 创建虚拟硬盘镜像 创建一个新的 qcow2 格式的磁盘映射文件作为目标系统的根文件系统存储空间: ```bash qemu-img create -f qcow2 ubuntu-22.04-arm64.qcow2 20G ``` 此操作将生成一个大小为 20GB 的稀疏文件 `ubuntu-22.04-arm64.qcow2`,它将在后续过程中充当虚拟机的主要磁盘设备[^2]。 ### 下载 ISO 映像 获取适用于 ARM64 平台的 Ubuntu Server 版本 ISO 文件: ```bash wget https://cdimage.ubuntu.com/ubuntu-legacy-server/releases/20.04/release/ubuntu-20.04.1-legacy-server-arm64.iso ``` 注意这里下载的是针对较旧硬件优化过的版本;对于现代服务器级硬件,则应考虑官方发布的标准版 ISO 文件[^1]。 ### 启动虚拟机进行安装 利用之前准备好的资源启动 QEMU/KVM 来引导进入 LiveCD 或者直接开始操作系统安装过程: ```bash qemu-system-aarch64 \ -machine type=virt,accel=kvm,gic-version=max \ -cpu max \ -smp cpus=4 \ -m size=4G \ -bios ./EDKII_AARCH64_CODE.fd \ -drive file=./ubuntu-22.04-arm64.qcow2,if=none,id=disk0 \ -device virtio-blk-device,drive=disk0,bus=virtio-bus.0 \ -netdev user,id=mynet0 \ -device virtio-net-pci,netdev=mynet0 \ -cdrom ./ubuntu-20.04.1-legacy-server-arm64.iso \ -boot d ``` 以上参数指定了机器类型、CPU 类型、核心数、内存容量等选项。其中 `-bios` 参数指定 UEFI 固件路径(如果有的话),而 `-drive` 和 `-device` 组合定义了虚拟磁盘及其连接方式。最后通过 `-cdrom` 加载 ISO 映像并通过光驱启动[-^2]。 ### 网络配置 默认情况下,QEMU 使用 NAT 方式提供网络访问功能。若要实现更复杂的联网模式比如桥接网卡共享物理接口或者端口转发等功能,则需要进一步调整网络子系统的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值