说明
windows x86架构安装部署arm架构的虚拟机。
准备
下载QEMU
https://qemu.weilnetz.de/w64/2022/qemu-w64-setup-20220831.exe
下载qemu启动项
下载网络驱动
安装qemu和tap驱动
qemu
直接双击安装,配置默认,安装位置可选择。我这装在D盘下。D:\Program Files\qemu
安装tap驱动
一路默认安装。C:\Program Files\TAP-Windows
装完可以看到PC网络适配器中多了个“以太网3”,这名字不重要,主要看到制造商是:“TAP-Windows Provider V9”。
安装虚拟机
efi准备
efi是启动时需要,在安装目录下创建一个efi目录,将下载的efi放进去,随后创建虚拟机指定bios会用到。
D:\qvm\
完成后可看到
D:\qvm\QEMU_EFI.fd
镜像准备
按照下边目录结构放好镜像,实际位置无所谓
D:\qvm\Kylin-Desktop-V10-Build1-20220402-arm64.iso
制作磁盘
制作一个磁盘,cmd打开,执行以下:
首先在安装目录下建立vm文件,用来放虚拟机文件,其中建立kylin10serversp1目录,该目录存储该虚拟机的所有文件。
D:\qvm> qemu-img.exe create -f qcow2 d:/qvm/kylin_arm64.qcow2 80G
安装镜像
# 创建安装 qemu-system-aarch64.exe -m 8192 -cpu cortex-a72 -smp 8,sockets=4,cores=2 -M virt -bios D:\qvm\QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -drive if=none,file=D:\qvm\kylin_arm64.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,file=D:\qvm\Kylin-Desktop-V10-Build1-20220402-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -net nic -net tap,ifname=tap0 # 启动 qemu-system-aarch64.exe -m 8192 -cpu cortex-a72 -smp 8,sockets=4,cores=2 -M virt -bios D:\qvm\QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -drive if=none,file=D:\qvm\kylin_arm64.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 -device virtio-scsi-device -net nic -net tap,ifname=tap0
补充网络
在以上中tap设备加入了一个网卡在虚拟机,该tap网卡需要配置IP,如下。
本地无线网卡通信,则选择网络适配器 - 更多适配选项-共享(选择允许tap0共享此无线网络)
此时查看tap0 - 默认IP为192.168.137.1/24, 虚拟机内部网卡重激活后看到IP为192.168.137.212, 虚拟机内部ping baidu正常。
注意有时候虚拟机启动,连接外网又失效,此时按照以上步骤,将外网网卡共享重新开关一次。
tap网络通信原理说明
和其他虚拟机一样,比如VMware支持nat、网桥等模式,而qemu虚拟机也有类似支持的网络模式,包括如类似nat网络的user和tap网络等。
tap是一个虚拟网卡,是一个链路层的虚拟,类似的还有tun,这个不重要。重要的是它是一个虚拟网卡。这种一般用在如vpn等场景。
虚拟网卡和物理网卡最大的区别是,
物理网卡:从外接网线进行网络流量的IO。
tap虚拟网卡:从指定用户层接口(比如某些应用程序,如vpn的server程序)负责模拟外接的网线进行网络流量的IO。
以上二者网卡,收到流量的处理,在内核中是无处理差异的,该转发、共享或上应用处理都是一样的流程。
综上,tap虚拟网卡,一端被一个程序拿着(模拟外接的网线),一端被系统内核拿着。
在qemu使用的tap网络中,qemu这个程序就拿捏了tap虚拟网卡的模拟网线的一端,并且将这一端的模拟IO转换到虚拟机内部的虚拟网卡中反映出来。用下边的图简单示意下:
宿主机内核协议栈 ------io------- 宿主机tap -------io------ qemu ------io------虚拟机内部网卡 -------io-------虚拟机内核协议栈
上图中qemu就像个网线对接头,将断开的网线衔接上。从而打通网络。
这种类似的在linux还有veth-pair,实际就是实现两个网口是一对,在不同的名字空间下,实现跨容器(空间)的通信。