侧边栏壁纸
博主头像
landery博主等级

行李箱里装不下我想去的远方

  • 累计撰写 45 篇文章
  • 累计创建 26 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

可信计算_Qemu02_VMWare上使用Qemu7.0.0 实现X86_64系统上运行ARM架构虚拟机

landery
2022-05-19 / 0 评论 / 0 点赞 / 94 阅读 / 1,793 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-06-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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配置:
    image-1652955528279

  • Qemu虚拟机配置:
    image-1652955566653

因为我们的启动命令没有添加网络访问方式,Qemu虚拟机目前状况:无法访问百度,开始使用桥接方式联通虚拟机:
image-1652955603701

3 宿主机配置

  1. 安装工具包
    yum install uml-utilities bridge-utils -y

  2. 使用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
    
  3. 创建网桥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
    image-1654505805970

    可以看到ens32已经没有ip了,ping一下百度看能不能访问外网,可以看到没有问题。
    image-1654505865053

  4. 配置 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绑定到我们创建的网桥上
    -----------
    
  5. 配置 qemu-ifdown文件
    这个文件在我创建的过程中,并没有生成,我们自己创建:
    该文件用于后续关闭虚拟机时,指定执行的脚本。

    vim /etc/qemu-ifdown #创建文件,添加以下内容
    ------------
    #!/bin/sh
    sudo ifconfig $1 down # 关闭tap
    sudo brctl delif br0 $1 # 断开与br0的连接
    -----------
    
  6. 赋予脚本执行权限
    sudo chmod +x /etc/qemu*

  7. 启动虚拟机,在之前的启动参数上添加-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
    
  8. 虚拟机启动后,我们查看虚拟机网络配置变化:
    image-1654507697809
    可以看到,Qemu虚拟机ubuntu ip地址已经变成了192.168.134.128,变成了与宿主机CentOS的br0同网段的ip地址。

    我们再看一下宿主机CentOS网络配置有什么变化,应该是要生成一个tap设备。
    image-1654507812414
    果然生成了一个tap设备tap0,我们查看网桥br0的接口:brctl show br0
    image-1654507870957
    可以看到,tap0已经绑定到br0上。

  9. 最后测试,是否成功:虚拟机目前已经获得ip地址:192.168.134.128
    1)虚拟机Ubuntu访问外网:
    image-1654507960066
    2)虚拟机访问VMware上CentOS宿主机(192.168.134.129):
    image-1654508045445
    3)虚拟机访问本机Win11(192.168.134.1):
    image-1654508094252
    4)VMWare上宿主机CentOS访问Qemu虚拟机ubuntu:
    image-1654510106910
    5)本机Win11 访问Qemu虚拟机ubuntu:
    image-1654510091312

    通过上述测试,发现已经能正常访问外网、VMware上的宿主机以及最终的Win11 宿主机。都能互相访问,网络配置成功。

4 扩展

我们查看虚拟机ubuntu的网络配置文件: cat /etc/network/interfaces
image-1654508798316
发现他是自动配置ip,我们也可以设置为静态ip,是可以设置的,效果如下,需要修改DNS等,不然无法访问外网。这里面需要重启,不然网络设置不会生效。参考:https://www.likecs.com/show-203632114.html
image-1654509688295

参考链接:

0

评论区