有些场景下需要使用ARM环境,于是学习下在没有预算或者没有ARM硬件的条件下如何在X86_64平台通过QEMU部署ARM架构虚拟机。
环境准备
这里使用了一台8C 12G Vmware虚拟机,环境是Ubuntu 2204桌面版。
1 | Disk /dev/sda: 60 GiB, 64424509440 bytes, 125829120 sectors |
桌面版默认使用NetworkManager管理网络,但因为后续有一些网络配置,这里禁用NetworkManager。
1 | systemctl status NetworkManager |
进入/etc/netplan,编辑yaml配置网络信息,类似如下:
1 | root@develop:/etc/netplan# cat 00-installer-config.yaml |
键入netplan apply
后配置生效。
启用systemd-networkd管理网络:
1 | systemctl status systemd-networkd |
安装基本工具和qemu相关组件:
1 | apt install openssh-server net-tools vim -y |
创建armspace目录后,通过qemu-img
创建一个ubuntu2204_arm64.img文件,格式为raw:
1 | mkdir /armspace && cd /armspace/ |
下载UEFI固件和ubuntu-22.04.4-live-server-arm64.iso文件放在armspace目录:
1 | wget https://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd |
QEMU创建ARM虚拟机
启动安装
1 | qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=ubuntu-22.04.4-live-server-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -drive if=none,file=ubuntu2204_arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 |
启动后等待ISO加载,过程会比较慢,不要退出或者中断:
等待即可进行正常的文本安装配置流程。但安装过程也会比较长,需要耐心等待,我这里等待了近1个小时。
安装完成后需要unmounting /cdrom
,可以通过kill -15
关闭QEMU安装进程。
1 | root@develop:/etc/netplan# ps -ef | grep qemu |
搭建网桥
1、新创建一个qemu0网桥
1 | brctl addbr qemu0 |
2、将00-installer-config.yaml通过改名的方式取消配置
1 | mv 00-installer-config.yaml 00-installer-config.yaml.bak |
3、同时新创建01-qemu.yaml配置,配置中qemu0将用到ens33网卡,该配置启用后,qemu0网桥将成为工作网卡,外部主机可以直接SSH访问,具体为如下内容:
1 | root@develop:/etc/netplan# cat 01-qemu0.yaml |
键入netplan apply
后可能遇到类似如下警告:
1 | ** (generate:2496): WARNING **: 05:24:24.943: Permissions for /etc/netplan/01-network-manager-all.yaml are too open. Netplan configuration should NOT be accessible by others. |
解决方案:
1 | chmod 600 /etc/netplan/your_config_file.yaml |
tun/tap网络设备
Tun/tap设备提供的虚拟网卡驱动,从tcp/ip协议栈的角度而言,它与真实网卡驱动并没有区别。这里需要通过TAP的方式进行网络通信。具体TAP的理解可以查看文末参考部分列出的文章《【云原生虚拟化】一文读懂网络虚拟化之 tun/tap网络设备》。这里先借用文章中的一张图,便于理解。
将tap0和qemu0关联起来:
1 | ip tuntap add dev tap0 mode tap |
上述这几步会在Vmware虚拟机关闭或者重启后失效,如有需要编写脚本进行自动化。qume支持类似如下配置在启动时携带脚本:
1 | -net nic -net tap,ifname=tap0,script=no,downscript=no |
启动虚拟机
1 | qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios QEMU_EFI.fd -nographic -device virtio-scsi-device -drive if=none,file=ubuntu2204_arm64.img,format=raw,index=0,id=hd0 -device virtio-blk-device,drive=hd0 -net nic -net tap,ifname=tap0,script=no,downscript=no |
开机后默认会自动获取DHCP IP,通过netplan设置静态IP即可:
1 | root@develop-qemu-arm:/etc/netplan# cat 00-installer-config.yaml |
注:到此处配置完成后,Ubuntu 2204 X86_64的Vmware虚拟机192.168.0.220和QEMU模拟的ARM环境虚拟机192.168.0.226都是可以直接在宿主机192.168.0.106上进行SSH操作的,非常方便。
查看一些系统信息:
1 | develop@develop-qemu-arm:~$ df -h |
这里安装一个最新版本的docker后,查看docker版本信息:
1 | root@develop-qemu-arm:/home/develop# docker version |
使用完通过shutdown -h now
关机,完成后qemu程序会自动退出。
参考
1、https://blog.csdn.net/v6543210/article/details/124276623
2、https://quard-star-tutorial.readthedocs.io/zh-cn/latest/ext3.html
3、https://mp.weixin.qq.com/s/bGY7BJdIz3SE491SclKRMQ
4、https://blog.csdn.net/u011011827/article/details/129771760