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