共计 3741 个字符,预计需要花费 10 分钟才能阅读完成。
title: 可信计算_Qemu02_VMWare上使用Qemu7.0.0 实现X86_64系统上运行ARM架构虚拟机 date: 2022-05-19 18:52:48.023 updated: 2022-06-06 18:15:00.265 url: /archives/kxjsqemu02 categories:
- 可信计算 tags:
- 可信计算
- 虚拟化
1 上一篇回顾
在上一篇中,我们已经实现了在X86系统上跑起来了ARM架构的虚拟机,虽然有些小插曲,但无伤大雅。我们本此的目的就是,解决Qemu虚拟机不能访问外网的问题。 在 https://wiki.archlinux.org/title/QEMU#Running_virtualized_system 中给出了很多种访问外网的方式,我们使用桥接的方式实现。
网上的设置方法主要有两种:NAT和桥接,也叫做user mode network和tap/tun network。
NAT 就是虚拟机里的guestOS通过host的物理网卡eth0,连接上网。该方法方便设置,缺点是其他机器难以访问到guest。要求host机器创建虚拟网卡tap0,guest机器和该网卡tap0设置为统一网段,并以tap0的地址作为网关,host机器上的物理网卡eth0为该tap0做NAT。
因此需要安装Uml-utilites以生成虚拟网卡tap0,tunctl -t tap0
桥接:基本思想是host机器上,物理网卡eth0和虚拟网卡tapN建立网桥,guestOS通过tapN连接上网,这样guestOS和host都处于物理局域网内,其他机器也可以访问guestOS。 需要安装以下两个包,bridge-tils和Uml-utilites,前者用于建立桥接,后者用于生成虚拟网卡。
虚拟机启动命令:
qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=ubuntu16.04-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0
2 系统环境
- 主机:X86_64,win 11,安装了VMWare,
- VMWare安装了CentOS 7虚拟机,X86_64版本,能访问外网NAT模式
- CentOS中安装了Qemu 7.0.0,Qemu中运行的是Ubuntu 16.04 Server ARM64架构版虚拟机,不能访问外网
接下来我们称CentOS为宿主机,Qemu中的Ubuntu 16.04为虚拟机:
- 宿主机ip配置:
- Qemu虚拟机配置:
因为我们的启动命令没有添加网络访问方式,Qemu虚拟机目前状况:无法访问百度,开始使用桥接方式联通虚拟机:
3 宿主机配置
- 安装工具包
yum install uml-utilities bridge-utils -y
- 使用TAP后端前,需要确认你的宿主机的内核支持TAP网络接口: /dev/net/tun 文件存在则说明支持。
[root@centos7 ~]# ls /dev/net tun
如果没有这样的文件,可以尝试手工创建:
sudo mkdir /dev/net sudo mknod /dev/net/tun c 10 200 sudo /sbin/modprobe tun
- 创建网桥br0网桥可以理解为就是一个交换机,我们现在要做的就是创建交换机,并且将Centos上的物理网卡ens32绑定在br0上,我们可以使用brctl命令来进行创建,也可以通过编辑配置文件手动配置桥接网卡。 配置文件修改参考:CentOS 网桥配置,静态IP配置、brctl创建虚拟网卡详解
systemctl stop NetworkManager # 先关闭networkmanager cp /etc/sysconfig/network-scripts/ifcfg-ens32 /etc/sysconfig/network-scripts/ifcfg-br0 #根据自己的网卡进行替换ens32 vim /etc/sysconfig/network-scripts/ifcfg-ens32 # 编辑ens32 修改 ifcfg-ens32 的以下几项: TYPE="Ethernet" BRIDGE=br0 //添加这一行 BOOTPROTO="none" #IPADDR="192.168.134.129" //注释掉这几行 #PREFIX="24" #GATEWAY="192.168.134.2" #DNS1="8.8.8.8" vim /etc/sysconfig/network-scripts/ifcfg-br0 # 编辑br0 修改 ifcfg-br0 的以下几项: TYPE="Bridge" //这一行修改为Bridge BOOTPROTO="none" NAME="br0" //修改设备名称为br0 # UUID="xxxx" //这一行注释 DEVICE="br0" //修改设备为br0 IPADDR="192.168.134.129" PREFIX="24" GATEWAY="192.168.134.2" DNS1="8.8.8.8" # 重启网络 systemctl restart network
查看网卡配置
ip addr
可以看到ens32已经没有ip了,ping一下百度看能不能访问外网,可以看到没有问题。
- 配置 qemu-ifup文件 这个文件在我创建的过程中,并没有生成,我们自己创建: 该文件用于后续启动虚拟机时,指定执行的脚本。
vim /etc/qemu-ifup #创建文件,添加以下内容 ------------ #!/bin/sh sudo tunctl -t $1 -u root #创建tap,每一个虚拟机对应一个tap sudo ifconfig $1 up #启动tap sudo brctl addif br0 $1 #将tap绑定到我们创建的网桥上 ----------- 或者,如果tunctl不存在 #!/bin/sh sudo ip tuntap add dev $1 mode tun user root sudo ifconfig $1 up sudo brctl addif br0 $1
- 配置 qemu-ifdown文件 这个文件在我创建的过程中,并没有生成,我们自己创建: 该文件用于后续关闭虚拟机时,指定执行的脚本。
vim /etc/qemu-ifdown #创建文件,添加以下内容 ------------ #!/bin/sh sudo ifconfig $1 down # 关闭tap sudo brctl delif br0 $1 # 断开与br0的连接 -----------
- 赋予脚本执行权限
sudo chmod +x /etc/qemu*
- 启动虚拟机,在之前的启动参数上添加
-net nic -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
完整的启动命令如下:qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=ubuntu16.04-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 -net nic -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
- 虚拟机启动后,我们查看虚拟机网络配置变化:
可以看到,Qemu虚拟机ubuntu ip地址已经变成了192.168.134.128,变成了与宿主机CentOS的br0同网段的ip地址。我们再看一下宿主机CentOS网络配置有什么变化,应该是要生成一个tap设备。
果然生成了一个tap设备tap0,我们查看网桥br0的接口:
brctl show br0
可以看到,tap0已经绑定到br0上。
- 最后测试,是否成功:虚拟机目前已经获得ip地址:192.168.134.128 1)虚拟机Ubuntu访问外网:
2)虚拟机访问VMware上CentOS宿主机(192.168.134.129):
3)虚拟机访问本机Win11(192.168.134.1):
4)VMWare上宿主机CentOS访问Qemu虚拟机ubuntu:
5)本机Win11 访问Qemu虚拟机ubuntu:
通过上述测试,发现已经能正常访问外网、VMware上的宿主机以及最终的Win11 宿主机。都能互相访问,网络配置成功。
4 扩展
我们查看虚拟机ubuntu的网络配置文件: cat /etc/network/interfaces
发现他是自动配置ip,我们也可以设置为静态ip,是可以设置的,效果如下,需要修改DNS等,不然无法访问外网。这里面需要重启,不然网络设置不会生效。参考:https://www.likecs.com/show-203632114.html