一、前言
我们使用的电脑一般都是x64架构的CPU及系统,如果需要使用arm架构的操作系统,我们无法使用主流的虚拟机软件(vmware workstation等) 进行安装,因为此类软件只能安装和宿主机CPU相同架构的系统。不过,我们可以使用qemu进行模拟运行。
本文简单介绍了如何在x64 windows系统中安装并使用qemu安装arm架构的ubuntu18系统(其它类似的操作系统也可以参考,仅仅是安装时使用的ISO镜像不同),以便在windows上可以使用其它cpu架构的操作系统进行开发、调试、安全测试等操作。
二、qemu和vmware区别
QEMU和VMware的核心区别在于功能定位、性能表现和适用场景,QEMU是开源的多架构模拟器,适合跨平台开发和测试,而VMware作为商业虚拟化平台,提供高性能的企业级解决方案。
QEMU 是 Quick Emulator的缩写。
VMware是Virtual Machine (虚拟机)和Ware(软件)的组合缩写,指代虚拟化软件
- QEMU :
- 通过二进制翻译实现指令转换,可运行未修改的客户机操作系统,但模拟性能较低。45
- 开源跨平台仿真器,支持x86、ARM、MIPS等多种架构的硬件模拟,兼具虚拟机监视器功能。
- 纯软件模拟导致性能损耗较大,运行速度较慢,适合轻量级开发调试
- VMware :
- 商业虚拟化软件,专注x86/x64架构,支持硬件辅助虚拟化(如Intel VT-x),指令直接执行效率更高。16
- 提供图形化管理界面及快照、迁移等高级功能,适合复杂的企业级应用。
- 动态二进制翻译技术优化指令执行,资源调度效率高,性能接近物理机
三、QEMU_EFI.fd 文件的作用是什么
简单来说,QEMU_EFI.fd
是一个模拟的固件文件,它的作用是在 QEMU 虚拟机中扮演真实电脑主板上的 UEFI BIOS
的角色。
核心类比
想象一下您要启动一台真实的电脑:
-
按下电源键。
-
主板上的 UEFI/BIOS 固件 开始工作。它负责初始化硬件(检查CPU、内存、硬盘、显卡等)。
-
UEFI/BIOS 按照配置的启动顺序 ,找到硬盘、U盘或网络上的启动引导程序(如 GRUB、Windows Boot Manager)。
-
将控制权交给引导程序,从而开始加载操作系统(如 Windows 或 Linux)。
在 QEMU 虚拟机的世界里,QEMU_EFI.fd
就是第 2 步和第 3 步的执行者。它模拟了物理硬件上的那块 UEFI 固件芯片。
详细作用解析
-
提供 UEFI 启动环境:
-
现代操作系统(如 Windows 11、最新的 Linux 发行版、macOS)都要求运行在 UEFI 启动模式下,而不是传统的 Legacy BIOS 模式。
-
QEMU_EFI.fd
为虚拟机提供了一个完整的、符合 UEFI 标准的启动环境,使得这些现代操作系统能够在虚拟机中正常安装和启动。
-
-
模拟硬件初始化:
- 就像真实 BIOS 一样,这个文件包含了初始化虚拟硬件(虚拟CPU、虚拟内存、虚拟磁盘控制器等)所必需的代码。虚拟机"上电"后,首先运行的就是这个文件中的代码。
-
读取并启动操作系统:
-
它能够识别并读取虚拟机中的虚拟磁盘 (如
qcow2
、raw
镜像文件)。 -
它会在虚拟磁盘上寻找 EFI 系统分区 (ESP),并加载该分区中的引导程序(通常是
\EFI\BOOT\BOOTAA64.EFI
或BOOTARM.EFI
之类的文件),从而启动客户机操作系统。
-
-
提供 UEFI 设置界面:
-
大多数
QEMU_EFI.fd
文件都集成了一个简化版的 UEFI 设置界面(通常是由 EDK2 项目提供的)。 -
在 QEMU 启动时,你可以按特定键(如
ESC
、F2
或F12
,具体取决于编译设置)进入这个界面,在这里可以配置虚拟机的启动顺序、查看设备信息等,就像在真实电脑上按Del
键进入 BIOS 设置一样。
-
为什么需要它?/ 使用场景
在以下情况下,你必须使用 QEMU_EFI.fd
:
-
模拟 ARM 架构的虚拟机 : 这是最常见的用途。x86 平台的 QEMU 通常内置了 BIOS 和 UEFI 支持,但对于 ARM (
aarch64
或arm
)架构的虚拟机,必须 通过-bios
参数手动指定这个固件文件。 -
安装和运行要求 UEFI 的操作系统 : 例如,在 x86 平台上,如果你想安装一个必须从 UEFI 启动的OS,也可以使用一个 x86 版本的
OVMF.fd
(功能等同于QEMU_EFI.fd
,但用于 x86_64 架构)来启动虚拟机。
如何使用它?
在启动 QEMU 的命令行中,通过 -bios
参数来指定该文件:
# 示例:启动一个 aarch64 虚拟机
qemu-system-aarch64 \
-machine virt \
-cpu cortex-a72 \
-smp 4 \
-m 4G \
-bios /path/to/QEMU_EFI.fd \ # 关键参数:指定UEFI固件
-device virtio-gpu-pci \
-drive file=ubuntu-22.04-server-arm64.img,format=raw,if=virtio \
-device virtio-net-device,netdev=net0 \
-netdev user,id=net0
从哪里获取?
-
通常,它随您的发行版或 QEMU 软件包一起安装。
-
Debian/Ubuntu : 安装
qemu-efi
或qemu-efi-aarch64
包后,可以在/usr/share/qemu-efi/
或/usr/share/AAVMF/
目录找到它(AAVMF
代表 ARM Architecture Virtual Machine Firmware)。 -
Arch Linux : 安装
edk2-armvirt
包。 -
直接下载: 你也可以从 EDK2 的官方源码仓库编译或找到预编译的版本。
-
四、操作步骤
1、物理机安装qemu
QEMU for Windows -- Installers (64 bit)
2、添加qemu到环境变量
来到设置->高级系统设置->环境变量->系统变量->path,新建一条,添加qemu路径:

此时打开cmd,输入qemu-system-aarch64,有内容说明qemu安装成功:

3、安装tap网卡
qemu里的系统若要连接互联网,需要通过tap网卡进行通信。最简单的办法可以借用openvpn的tap网卡驱动。下载并安装:
https://build.openvpn.net/downloads/releases/OpenVPN-2.6_rc2-I001-amd64.msi
将出现的网卡改名为tap0,方便后续操作:

把联网的真实网卡设共享。来到控制面板->更改适配器设置,右键已联网的网卡->属性,勾选允许共享,并选择tap网卡。

4、下载arm 镜像
https://www.debian.org/distrib/netinst
5、下载EFI
http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd
创建虚拟命令
qemu-system-arm -machine virt -cpu cortex-a8 -smp 1 -m 4G -bios QEMU_EFI.fd -device virtio-gpu-pci -drive file=debian_arm.img,format=raw,if=virtio -device virtio-net-device,netdev=tap0 -netdev user,id=tap0
qemu-system-arm -machine virt -cpu cortex-a7 -smp 1 -m 4G -bios QEMU_EFI.fd -device virtio-gpu-pci -drive file=debian_arm.img,format=raw,if=virtio -device virtio-net-device,netdev=tap0 -netdev user,id=tap0
安装虚拟机命令
qemu-system-arm.exe -m 8192 -cpu cortex-a7 -smp 1,sockets=1,cores=1 -M virt -bios QEMU_EFI.fd -net nic -net tap,ifname=tap0 -device VGA -drive if=none,file=./debian-13.0.0-armhf-netinst.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -drive if=none,file=./debian_arm.img,id=hd0,format=raw
-device virtio-blk-device,drive=hd0 -device nec-usb-xhci -device usb-ehci -device usb-kbd -device usb-mouse -accel tcg,thread=multi
启动虚拟机命令
qemu-system-arm.exe -m 8192 -cpu cortex-a7 -smp 1 -M virt -bios ./QEMU_EFI.fd -net nic -net tap,ifname=tap0 -device VGA -drive if=none,file=./debian_arm.img,id=hd0,format=raw
-device virtio-blk-device,drive=hd0 -device usb-ehci -device usb-kbd -device usb-mouse
qemu虚拟机ID
在使用 qemu-system-arm.exe
时,虚拟机ID并不是由一个像 --id
这样的独立命令行字段来指定的。
这个概念源于像 libvirt
(如 virt-manager
或 virsh
)这样的高级管理工具,它们会为管理的每个虚拟机分配一个唯一的ID(UUID)。而qemu-system-arm.exe本身是一个底层的模拟器,它直接启动虚拟机,并不内置这种虚拟机管理功能。
最接近的替代:进程ID (PID)
当你在命令行中启动 qemu-system-arm.exe
后,操作系统会为它分配一个唯一的进程ID (PID)。这个PID就是该QEMU虚拟机实例在宿主机Windows系统中最直接的"身份标识"。
-
如何获取? 启动QEMU后,你可以在Windows任务管理器的"详细信息"选项卡中找到
qemu-system-arm.exe
对应的PID。 -
有什么用? 你可以使用
taskkill /pid <PID>
命令来强制关闭这个特定的虚拟机实例。
用于管理的标识符:-name
参数
虽然不是一个严格的ID,但你可以使用 -name
参数为你的虚拟机指定一个友好名称。这个名称会在QEMU的窗口标题栏中显示,并且如果你使用了VNC或SPICE等图形化控制台,这个名称也会作为其标识。