众所周知,cpu架构有x86和arm,由于公司在搞国产化arm飞腾芯片,组内也没有申请arm的板子,每次需要arm环境都要向测试同事申请,于是乎查了一下能否在windows x86上来模拟一个arm的linux环境,还真可以,记录一下配置过程

安装qemu

参考 《windows下qemu的下载及安装》

下载arm镜像

镜像自行选择发行版,我这里选择的是 debian-12.2.0-arm64-netinst.iso

链接:https://cdimage.debian.org/debian-cd/current/arm64/iso-cd/

下载虚拟化的ARM64 BIOS

链接:https://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/

安装

将上面下载的两个文件放在一个文件夹里

在当前文件夹打开cmd,执行命令

1
qemu-img create -f qcow2 debian12.qcow2 64G

执行完成后会生成 debian12.qcow2 文件

  • 64G为虚拟机磁盘最大大小,也即 debian12.qcow2 不会超过64G
1
qemu-system-aarch64.exe -m 8192 -cpu cortex-a72 -smp 4 -M virt -bios QEMU_EFI.fd  -drive if=none,file=debian12.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,file=debian-12.2.0-arm64-netinst.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom  -net nic -net tap,ifname=tap0,script=no,downscript=no -device VGA -device nec-usb-xhci -device usb-kbd -device usb-mouse
  • smp 表示CPU数量
  • m 表示内存大小
  • bios BIOS文件位置
  • -drive if=none,file=debian12.qcow2,id=hd0 虚拟机虚拟磁盘位置,也就是qemu-img创建的磁盘位置。
  • -drive if=none,file=debian-12.2.0-arm64-netinst.iso,id=cdrom,media=cdrom 操作系统安装镜像位置,根据实际情况替换file=的内容
  • -net nic -net tap,ifname=tap0,script=no,downscript=no tap0为网卡名

如果提示 Device 'tap' could not be initialized,自行安装一下openvpn,并重命名TAP-Windows Adapter V9 这个虚拟网卡名字为tap0。

然后将物理网卡的网络共享给tap0

之后一路按linux常规安装步骤进行选择,安装完成就好了

启动

理论上安装完成后会让你自动重启,选择yes重启后就能够进入系统了,为了方便关闭后再次启动,新建start.bat脚本,写入以下内容

1
qemu-system-aarch64.exe -m 8192 -cpu cortex-a72 -smp 8,sockets=4,cores=2 -M virt -bios QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -boot c -hda debian12.qcow2 -device virtio-scsi-device -net nic -net tap,ifname=tap0

以后只需启动该脚本就可以

启动不了解决办法

如果遇到启动后卡住,给出的错误信息为 "press esc in 5 seconds to skip startup.nsh or any other key to continue",如下图

原因在于未能找到efi文件

方案一:

挂载fs0磁盘

1
Shell> fs0:

然后可用cd ls 命令查找.efi文件位置

比如我这里路径为\EFI\debian\grubaa64.efi

1
FS0:\> edit startup.nsh

写入\EFI\debian\grubaa64.efi后,Ctrl+Q 保存退出

1
FS0:\> exit

continue 重启就能自动进入系统了

方案二:

进入bios

1
Shell> exit

依次选择 Boot Maintenance Manger –> Boot From File 同样找到grubaa64.efi回车进入系统

然后

1
vim /boot/efi/startup.nsh

写入\EFI\debian\grubaa64.efi

验证

1
arch

输出确实是aarch64

后续

一切顺利的话 debian-12.2.0-arm64-netinst.iso 文件就可以删掉了

无网络解决办法

如果ip addr能够看到enp0s1网卡,但是没有ip信息,说明网卡是存在的,只是没有配置好ip

配置静态ip

1
nano /etc/network/interfaces

写入

1
2
3
4
5
6
# static
auto enp0s1
iface enp0s1 inet static
address 192.168.137.254
netmask 255.255.255.0
gateway 192.168.137.1

Ctrl+x 保存退出

配置DNS

1
echo "nameserver 114.114.114.114" >> /etc/resolv.conf

重启网络

1
/etc/init.d/networking restart

启动网卡

1
ifup enp0s1

此时再ping baidu.com应该就ping得通了