0%

QEMU ARMv9 虚拟机 Windows 完整指南

适用系统: Alpine Linux ARM64
CPU 架构: ARMv9 (neoverse-n2 / cortex-a710)
作者: fishmwei


前言

最近工作中遇到一个有趣的技术挑战——需要验证ARMv9架构上新增的一些处理器特性,比如SVE2和RNG指令集。但手头并没有现成的ARMv9硬件,怎么办呢?

作为一名喜欢折腾的技术人,我决定在Windows上通过QEMU虚拟机来模拟ARMv9架构。经过一番摸索和踩坑,终于搭建好了环境,今天就把我整理的这份详细指南分享给大家。

💡 核心收获: 如何在Windows上完美运行Alpine Linux ARM64虚拟机,模拟ARMv9架构特性

一、环境准备

1.1 为什么选择 Alpine Linux?

在尝试了多个Linux发行版后,我最终选择了Alpine Linux作为我的ARMv9实验平台,主要有以下几个原因:

  • 极致轻量化:基础镜像仅约130MB,对虚拟机资源要求极低,非常适合我们的测试场景
  • 安全性设计:默认启用libc硬化等安全机制,让我的实验环境更加可靠
  • 资源效率高:即使在虚拟化环境下也能保持良好的性能表现
  • 包管理系统精简:apk包管理器命令简洁高效,学习成本低
  • 云原生基因:被Docker和K8s广泛采用,生态成熟
  • 完全开源免费:不用担心许可证问题,可以放心折腾

1.2 安装 QEMU

Windows 安装指南

选择QEMU是因为它对ARM虚拟化的支持非常完善。以下是我在Windows上的安装过程:

  • 下载地址:https://www.qemu.org/download/#windows
  • 贴心提示:安装时务必勾选”添加到PATH环境变量”,避免后续手动配置麻烦
  • 验证安装是否成功:
    1
    qemu-system-aarch64 --version
    成功的话会显示类似这样的版本信息:
    1
    2
    QEMU emulator version X.X.X
    Copyright (c) 2003-XXXX Fabrice Bellard and the QEMU Project developers

1.3 下载 Alpine Linux 系统镜像

经过对比测试,我推荐使用最新的稳定版本。以下是我在实际部署中使用的版本:

版本 下载地址 说明
Alpine Linux 3.23 https://alpinelinux.org/downloads/ 我的测试环境版本,稳定可靠
Alpine Linux 3.21 https://alpinelinux.org/downloads/ LTS版本,适合生产环境
Alpine Linux 3.20 https://alpinelinux.org/downloads/ 经典稳定版本

实用小贴士:在国内下载可能会比较慢,建议使用国内镜像站点:

我的推荐(基于实际使用体验):

  • Alpine Standard: alpine-standard-3.23.3-aarch64.iso (我用的就是这个,够用)
  • Alpine Extended: alpine-extended-3.23.3-aarch64.iso (功能更全,但体积稍大)

1.4 创建虚拟磁盘

根据我的实践经验,10GB的空间对于Alpine Linux来说已经绰绰有余。创建虚拟磁盘的命令如下:

1
2
# 为Alpine Linux创建10GB虚拟磁盘(推荐大小)
qemu-img create -f qcow2 alpine-disk.qcow2 10G

💡 经验分享:使用qcow2格式有很多好处,比如支持快照、动态扩容等。如果你之前用过其他虚拟化软件,会发现这和VMware/VirtualBox的概念类似。


二、启动命令

2.1 首次安装 Alpine Linux

这是安装系统的启动命令,我已经帮你调整到了最适合ARMv9模拟的状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
qemu-system-aarch64 `
-M virt `
-cpu neoverse-n2 `
-smp 2 `
-m 1024M `
-accel tcg `
-bios "C:\Program Files\qemu\share\edk2-aarch64-code.fd" `
-cdrom .\alpine-standard-3.23.3-aarch64.iso `
-drive file=alpine-disk.qcow2,if=virtio `
-netdev user,id=net0 `
-device virtio-net-device,netdev=net0 `
-device virtio-rng-device `
-nographic

2.2 启动已安装的 Alpine 系统

当系统安装完成后,使用这个命令直接从硬盘启动:

1
2
3
4
5
6
7
8
9
10
11
qemu-system-aarch64 `
-M virt `
-cpu neoverse-n2 `
-smp 2 `
-m 1024M `
-accel tcg `
-bios "C:\Program Files\qemu\share\edk2-aarch64-code.fd" `
-drive file=alpine-disk.qcow2,if=virtio `
-netdev user,id=net0 `
-device virtio-net-device,netdev=net0 `
-nographic

重要提醒:第一次运行可能需要调整内存大小(建议2GB),因为1GB在某些情况下可能不够用。


三、参数详解与个人心得

这些参数是我经过多次测试后确定的最佳配置,让我来详细解释一下:

参数 说明 个人心得
-M virt 使用虚拟 ARM 机器类型 这是最通用的ARM虚拟机类型,兼容性好
-cpu neoverse-n2 ARMv9 架构 CPU (Alpine) 这是ARMv9的代表型号,完美支持SVE2等新特性
-cpu cortex-a710 ARMv9 架构 CPU (openEuler) 另一种ARMv9实现,可根据需求选择
-smp 2 2 个 CPU 核心 对于Alpine来说足够了,再多也提升有限
-m 1024M/4096M 内存大小 建议至少2GB,否则系统会比较卡顿
-accel tcg TCG 软件加速(无硬件虚拟化时) 在Windows上主要靠软件模拟,性能就这样了
-bios ARM64 UEFI 固件路径 注意路径要正确,否则无法启动
-cdrom ISO 安装镜像 安装完成后就不再需要了
-drive 虚拟硬盘 主要的数据存储位置
-netdev & -device 网络配置 采用用户模式网络,简单易用
-device virtio-rng-device 硬件随机数生成器 关键配置! 解决启动卡顿问题
-nographic 串口控制台模式 适合服务器场景,资源占用少
-display gtk GTK 图形界面(可选) 如果需要图形界面可以用这个
-fsdev & -device virtio-9p-pci 9P 共享目录 用于主机与虚拟机间文件交换

四、踩坑记录与解决方案

这一路走来,我也遇到了不少坑,现在把最常见和最棘手的问题都整理出来,希望能帮大家少走弯路:

4.1 找不到 QEMU_EFI.fd 固件文件

症状: 启动时报错找不到固件文件
解决: 使用正确的固件路径

  • Windows: "C:\Program Files\qemu\share\edk2-aarch64-code.fd"
  • 经验分享: 不同版本的QEMU路径可能略有不同,请根据你实际安装路径调整

4.2 启动卡在 Hardware RNG Entropy Gatherer Daemon

症状: 系统启动时长时间停在RNG相关服务处
解决: 添加 RNG 设备(这点我在参数部分特别强调了)

1
-device virtio-rng-device
  • 重要提示: 这个参数是解决启动卡顿的关键!我当初在这里卡了几个小时

4.3 网络连接超时或无法获取 IP

症状: 启动后无法上网,ping不通外网
解决: 启动后手动激活网络

1
2
3
# Alpine Linux
ip link set eth0 up
udhcpc -i eth0
  • 实战经验: 有时DHCP获取IP会有延迟,耐心等一下或者手动执行以上命令

4.6 包管理器无法找到某些包

症状: apk命令报错说找不到包
解决: 先更新包索引

1
2
# Alpine
apk update

4.7 地址超过 32 位限制

症状: 启动时出现内存地址相关的错误
解决: 减少内存分配或使用正确的机器类型参数,关闭 handoff

  • 个人建议: 尝试减少内存大小到2GB以下,或者更新QEMU版本

4.8 安装过程路径解析错误

症状: 安装过程中出现路径相关的错误
解决: 使用完整绝对路径或切换到其他发行版如 Alpine

  • 经验之谈: 这通常是由于相对路径引起的,建议使用完整路径

4.9 包管理器无法找到某些包(完整方案)

症状: 各种发行版的包管理器问题
解决: 根据不同发行版分别处理

1
2
3
4
5
6
7
8
9
10
11
# Alpine
apk update

# Ubuntu/Debian
apt update
apt upgrade

# openEuler
yum update
# 或者使用新版本的 DNF
dnf update

4.4 地址超过 32 位限制

解决: 减少内存分配或使用正确的机器类型参数,关闭 handoff

4.5 安装过程路径解析错误

解决: 使用完整绝对路径或切换到其他发行版如 Alpine

4.6 包管理器无法找到某些包

解决:

1
2
3
4
5
6
7
8
9
10
11
# Alpine
apk update

# Ubuntu/Debian
apt update
apt upgrade

# openEuler
yum update
# 或者使用新版本的 DNF
dnf update

五、Alpine Linux 系统配置实战

5.1 安装 Alpine Linux

这是我亲历的安装过程,按照以下步骤操作,成功率100%:

  1. 登录系统(默认用户:root,无密码)

  2. 启动安装向导

    1
    setup-alpine
  3. 按提示逐步配置

    • 键盘布局(一般选默认us即可)
    • 主机名(可以自定义,如alpine-armv9-test)
    • 网络配置(通常选择 DHCP 自动获取)
    • 时区(选择 Asia/Shanghai)
    • 代理设置(没有代理则留空回车)
    • SSH 服务器(强烈推荐 openssh,便于远程管理)
    • 磁盘分区(选择虚拟磁盘,如 sda)
  4. 设置 root 用户密码(一定要设个强密码)

  5. 确认安装(耐心等待安装完成)

安装完成后,系统会提示重启。重启后拔掉ISO,从硬盘启动。

5.2 网络配置(Alpine Linux)

刚安装完的系统可能网络还没完全激活,我通常会执行以下命令:

1
2
3
4
5
6
7
8
# 激活网络接口
ip link set eth0 up

# 获取 IP 地址
udhcpc -i eth0

# 验证网络连通性
ping 8.8.8.8

💡 个人经验:有时候需要等待几分钟才能联网,不要着急。

5.3 CPU 信息验证

这是我们这次实验的核心!验证ARMv9特性是否生效:

1
cat /proc/cpuinfo

期望看到的关键信息:

1
2
3
4
5
6
7
8
9
10

processor : 0
BogoMIPS : 125.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd49
CPU revision : 3

重点关注Features字段中的sve2rng,这说明ARMv9的新特性已经生效!

5.4 常用工具安装(Alpine)

刚安装的Alpine比较精简,我们先装些常用工具:

1
2
3
4
5
# 更新包索引(非常重要!)
apk update

# 安装日常开发必备工具
apk add vim nano curl wget bash gcc git htop tmux

推荐理由:这些工具在ARMv9特性的验证过程中非常有用。


六、共享主机目录(文件传输方案)

在虚拟机和主机之间传输文件是个常见需求,我总结了几种方法,各有优劣:

6.1 使用 SSH/SFTP 传输文件(我最常用的方法)

这是最简单直接的方式,几乎零配置:

  1. 确保 Alpine Linux 中 SSH 服务已启用(安装时已配置):

    1
    2
    rc-service sshd start
    rc-update add sshd
  2. 从 Windows 使用 SFTP 客户端(如 WinSCP)连接到虚拟机 IP 地址

6.3 端口转发传输文件

使用端口转发将文件传输到虚拟机:

1
-netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80
  1. 从 Windows 使用 SFTP 客户端(如 WinSCP 或 FileZilla)连接到虚拟机 IP 地址
  2. 我的经验:如果网络配置正常,直接连接虚拟机IP即可;如果遇到连接问题,可以使用端口转发

6.2 端口转发传输文件

如果需要更灵活的网络配置,可以使用端口转发:

1
-netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80

这样可以通过 localhost:2222 访问虚拟机的 SSH 服务。

6.3 使用 Samba 共享(备选方案)

虽然我更推荐SSH方案,但如果你习惯Windows文件共享,也可以考虑Samba:

Windows 不原生支持 9P 文件系统,Samba是另一种选择:

  1. 在 Windows 主机上安装 Samba 服务器(或使用现有服务器)
  2. 配置共享目录,如 \\localhost\shared
  3. 启动 QEMU 时使用以下参数:
    1
    2
    -netdev user,id=net0,hostfwd=tcp::445-:445 `
    -device virtio-net-device,netdev=net0

个人建议:除非特殊需求,否则优先使用SSH/SFTP方案,更简单可靠。


七、优雅退出虚拟机

Windows 平台

  1. Ctrl+AltGr+2 进入 QEMU 控制台
  2. 输入 quit 命令优雅退出
  3. 我的习惯:在虚拟机内先执行 poweroffshutdown -h now,再退出QEMU

温馨提示:直接关闭QEMU窗口可能导致虚拟磁盘损坏,建议养成优雅关机的习惯。


八、我的实战经验与注意事项

经过多次实践,我总结了一些重要经验,希望能帮助大家少踩坑:

💡 性能优化提醒:

  • ARM64 虚拟机运行速度相对较慢(TCG模拟器确实有性能损耗,这是正常的)
  • 我的配置建议:建议分配 2GB+ 内存以获得流畅体验
  • 如果你尝试其他带图形界面的系统(如openEuler),需要 4GB+ 内存
  • Ubuntu Desktop 等完整桌面环境建议分配 6GB+ 内存

💾 磁盘空间规划:

  • 确保主机有足够磁盘空间(建议预留 20GB+,qcow2格式会动态增长)

⏱️ 时间预期管理:

  • 系统安装过程确实需要较长等待时间(别着急,这是虚拟化的正常现象)
  • 首次启动较慢属正常现象(特别是首次系统初始化)

⌨️ 实用快捷键:

  • Windows: Ctrl+AltGr+2 进入 QEMU 控制台(这是我最常用的快捷键)

🔥 我的经验之谈:

  • 如果只是做ARMv9特性的验证,Alpine Linux + 命令行已经足够了
  • 不要在虚拟机里跑太重的应用,毕竟性能有限
  • 定期备份虚拟机镜像,避免重复劳动

九、实战速查手册(我的常用命令)

平时使用时,我会频繁参考这些命令,节省大量时间:

🚀 一键启动命令(Alpine + ARMv9)

1
qemu-system-aarch64 -M virt -cpu neoverse-n2 -m 1024M -accel tcg -bios "C:\Program Files\qemu\share\edk2-aarch64-code.fd" -cdrom .\alpine-standard-3.23.3-aarch64.iso -drive file=alpine-disk.qcow2,if=virtio -netdev user,id=net0 -device virtio-net-device,netdev=net0 -device virtio-rng-device -nographic

贴心提示:我通常会把这个命令保存为批处理脚本,方便重复使用

🌐 网络故障一键诊断

1
ip link set eth0 up && udhcpc -i eth0 && ping 8.8.8.8

使用场景:网络无法连接时的快速排查命令

✅ ARMv9 特性验证命令

1
2
cat /proc/cpuinfo | grep "CPU part"
# 正常情况应显示 0xd49 (cortex-a710),证明ARMv9模拟成功

验证要点:看到0xd49就说明你的ARMv9环境搭建成功了!

💡 我的使用习惯:把这几个命令保存在记事本里,随时查阅。


附录:Alpine Linux 实用技巧(我的私藏)

这部分是我日常使用Alpine Linux总结的小技巧,希望对你有帮助:

A.1 Alpine Linux 包管理实战

Alpine的apk包管理器虽然简洁,但功能强大,以下是我的常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 更新包索引(每次装软件前先执行)
apk update

# 安装单个软件包
apk add vim

# 安装多个软件包
apk add vim curl wget git

# 删除软件包(保留依赖)
apk del package_name

# 搜索软件包(查找你需要的工具)
apk search package_name

# 查看已安装包的详细信息
apk info package_name

# 查看软件包包含哪些文件
apk info -L package_name

# 清理APK缓存(释放空间)
apk cache clean

我的使用习惯:经常用apk search来查找需要的软件包名,非常方便。

A.2 仓库配置快速切换

如果遇到网络问题,快速切换到国内镜像源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 一键切换到阿里云镜像(推荐)
setup-apk-mirror --country CN --protocol https

# 或者手动操作(更可控)
# 备份原配置
cp /etc/apk/repositories /etc/apk/repositories.backup.$(date +%Y%m%d)

# 手动编辑仓库文件,替换为国内源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 或者重新创建仓库文件
cat > /etc/apk/repositories << EOF
https://mirrors.aliyun.com/alpine/v3.23/main
https://mirrors.aliyun.com/alpine/v3.23/community
EOF

A.3 实用运维命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 检查系统信息
uname -a
cat /etc/os-release

# 检查CPU信息(验证ARMv9特性)
cat /proc/cpuinfo | grep -i arm

# 检查内存使用
free -h

# 检查磁盘使用
df -h

# 检查网络配置
ip addr show
ip route show

💡 经验分享:这些命令在我每天的工作中频繁使用,建议收藏备用。


行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。

欢迎关注

博客地址: https://fishmwei.github.io

掘金主页: https://juejin.cn/user/2084329776486919