windows 10系统安装arm虚拟机

一、前言

我们使用的电脑一般都是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 的角色。

核心类比

想象一下您要启动一台真实的电脑:

  1. 按下电源键。

  2. 主板上的 UEFI/BIOS 固件 开始工作。它负责初始化硬件(检查CPU、内存、硬盘、显卡等)。

  3. UEFI/BIOS 按照配置的启动顺序 ,找到硬盘、U盘或网络上的启动引导程序(如 GRUB、Windows Boot Manager)。

  4. 将控制权交给引导程序,从而开始加载操作系统(如 Windows 或 Linux)。

在 QEMU 虚拟机的世界里,QEMU_EFI.fd 就是第 2 步和第 3 步的执行者。它模拟了物理硬件上的那块 UEFI 固件芯片。

详细作用解析

  1. 提供 UEFI 启动环境

    • 现代操作系统(如 Windows 11、最新的 Linux 发行版、macOS)都要求运行在 UEFI 启动模式下,而不是传统的 Legacy BIOS 模式。

    • QEMU_EFI.fd 为虚拟机提供了一个完整的、符合 UEFI 标准的启动环境,使得这些现代操作系统能够在虚拟机中正常安装和启动。

  2. 模拟硬件初始化

    • 就像真实 BIOS 一样,这个文件包含了初始化虚拟硬件(虚拟CPU、虚拟内存、虚拟磁盘控制器等)所必需的代码。虚拟机"上电"后,首先运行的就是这个文件中的代码。
  3. 读取并启动操作系统

    • 它能够识别并读取虚拟机中的虚拟磁盘 (如 qcow2raw 镜像文件)。

    • 它会在虚拟磁盘上寻找 EFI 系统分区 (ESP),并加载该分区中的引导程序(通常是 \EFI\BOOT\BOOTAA64.EFIBOOTARM.EFI 之类的文件),从而启动客户机操作系统。

  4. 提供 UEFI 设置界面

    • 大多数 QEMU_EFI.fd 文件都集成了一个简化版的 UEFI 设置界面(通常是由 EDK2 项目提供的)。

    • 在 QEMU 启动时,你可以按特定键(如 ESCF2F12,具体取决于编译设置)进入这个界面,在这里可以配置虚拟机的启动顺序、查看设备信息等,就像在真实电脑上按 Del 键进入 BIOS 设置一样。

为什么需要它?/ 使用场景

在以下情况下,你必须使用 QEMU_EFI.fd

  1. 模拟 ARM 架构的虚拟机 : 这是最常见的用途。x86 平台的 QEMU 通常内置了 BIOS 和 UEFI 支持,但对于 ARMaarch64arm)架构的虚拟机,必须 通过 -bios 参数手动指定这个固件文件。

  2. 安装和运行要求 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-efiqemu-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-managervirsh)这样的高级管理工具,它们会为管理的每个虚拟机分配一个唯一的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等图形化控制台,这个名称也会作为其标识。

相关推荐
亿道电子Emdoor2 天前
【ARM】PACK包管理
arm开发
wypywyp3 天前
基于arm芯片的驱动开发——温湿度传感器dht11
arm开发·驱动开发
亿道电子Emdoor3 天前
【ARM】MDK如何实现使用Hex文件完成程序烧录
arm开发·stm32·单片机
彻骨寒风4 天前
在麒麟 ARM (aarch64)安装OpenJDK11和elasticsearchkibana
运维·arm开发·jenkins
2301_1472583694 天前
ARM - GPIO 标准库开发
arm开发
Yeats_Liao4 天前
X86、X64 与 ARM:架构的剖析与比较
arm开发·架构
ShiMetaPi5 天前
【GM3568JHF】FPGA+ARM异构开发板 使用指南:显示与触摸
arm开发·嵌入式硬件·fpga开发·rk3568
亿道电子Emdoor5 天前
【ARM】MDK出现:Unable to find ARM libraries
arm开发·stm32·单片机
2004v20045 天前
交叉编译 手动安装 libzip 库 移植ARM 需要 zlib的
linux·运维·arm开发