ARM平台使用qemu运行OpenWrt虚拟机

时间:2024-04-04 16:21:13

 

转载:https://www.sdnlab.com/20532.html

概述

随着ARM架构的服务器越来越受到人们的关注,基于ARM架构的虚拟网络应用也逐渐走向成熟,本文主要介绍基于openwrt系统的vCPE基础系统如何在ARM64服务器上采用虚拟机的方式运行,并实际搭建环境进行验证测试。

ARM平台使用qemu运行OpenWrt虚拟机

一、QEMU工具

在ARM64服务器系统中使用qemu-system-aarch64运行虚拟机,root账户下安装命令:

Java

 

1

# apt-get install qemu-system-aarch64

关于QEMU运行OpenWrt虚拟机的支持情况,可参照OpenWrt官方网站中的介绍:http://wiki.openwrt.org/doc/howto/qemu?s[]=qemu

二、OpenWrt系统镜像

openwrt系统自身支持生成ARM64的qemu版本镜像,这里建议下载LEDE版本,openwrt原分支版本对ARM64的支持存在一些不足,本文作者基于openwrt的Chaos Calmer 15.05.1版本在编译和运行arm64虚拟机时都出现了一些问题,浪费了不少时间。

LEDE工程的下载地址:https://github.com/lede-project/source.git

make menuconfig选择QEMU ARM虚拟机系统的ARMV8平台(不同类型的网卡驱动可以在Kernel modules -> Network Devices中选择)
ARM平台使用qemu运行OpenWrt虚拟机
编译成功后,source/bin/targets/armvirt/64/openwrt-armvirt-64-Image-initramfs文件就是我们使用qemu运行的虚拟机镜像文件。

三、业务场景

本文使用openwrt虚拟机作为vCPE设备,完成LAN和WAN之间的基本转发功能,其中LAN侧接入用户PC终端,WAN侧接入服务器网络,用于完成LAN侧终端和WAN侧服务器的网络互通,组网如下图所示:
ARM平台使用qemu运行OpenWrt虚拟机
为了测试测试方便,我们可以在host上用VM代替用户接入设备和服务器设备,组网如下图所示:
ARM平台使用qemu运行OpenWrt虚拟机

四、网络配置

OpenWrt虚拟机采用tap网络方式和host主机进行网络通信,关于QEMU网络使用方法,可以参照官方文档:https://wiki.qemu.org/Documentation/Networking,因为本文实验使用tap方式,这里仅介绍tap方式的使用方法。

OpenWrt内部网络设备和host主机网络设备的结构可以构建成下图的模式,其中OpenWrt系统中的虚拟网卡WAN和LAN分别为eth0和eth1,tap0和tap1网络设备分别对应到虚拟机中的eth0和eth1网卡上,用于完成guest和host的通信,这两个tap口和host中其它物理网口(或者虚拟网口)桥接起来,这样虚拟机中的网卡就可以通过桥接方式和主机外部(或者其它虚拟机)网络互通了。
ARM平台使用qemu运行OpenWrt虚拟机

  • host创建tap网络设备

QEMU使用 “-netdev TYPE,id=NAME,...” 在host上创建一个网络backend用于和虚拟机进行数据通信,其中id指定名字后供虚拟机网卡引用,进而完成一对一的相互通信,本实验创建tap网络类型的命令如下:

Java

 

1

2

-netdev tap,id=lan;

-netdev tap,id=wan;

 

  • guest创建虚拟网络设备

QEMU使用 “-device TYPE,netdev=NAME” 在启动虚拟机时创建虚拟网络设备,其中netdev对应host中的tap网络设备,本实验创建e1000类型的网络设备,命令如下:

Java

 

1

2

-device e1000,netdev=lan;

-device e1000,netdev=wan;

五、启动命令

Java

 

1

2

3

4

5

6

7

8

#  qemu-system-aarch64 -enable-kvm \

-kernel openwrt-armvirt-64-Image-initramfs \

-smp 1 -m 2048 -cpu host -machine virt,gic_version=3 -nographic \

-append "console=ttyAMA0" \

-netdev tap,id=lan,script=qemu-lanup.sh, downscript=qemu-landown.sh \

-device e1000,netdev=lan \

-netdev tap,id=wan,script=qemu-wanup.sh,downscript=qemu-wandown.sh \

-device e1000,netdev=wan

 

  • -kernel

用于指定需要启动的虚拟机系统镜像文件,因为我们使用initramfs类型的镜像文件,它把内核和initramfs做成了一个文件,所以不再需要指定其他启动文件了;

  • script

script和downscript分别是在虚拟机启动和关闭时调用的脚本,用于完成一些用户定制的工作,如果不需要可以设置成no。本实验中使用脚本创建网桥,并把tap设备和host中的需要互通的网络设备加入到一个桥中,在虚拟机关闭时删除对应的桥设备;

QEMU运行成功后,可以在host主机上查看新建了两个网桥,这个是script脚本创建的:
ARM平台使用qemu运行OpenWrt虚拟机
新增了两个tap网络设备用于和虚拟机对应的网卡通信,这个是qemu启动虚拟机时创建的:
ARM平台使用qemu运行OpenWrt虚拟机
两个tap网络设备加入了对应的网桥中,这个在script脚本中完成:
ARM平台使用qemu运行OpenWrt虚拟机

六、运行测试

  • qemu运行openwrt虚拟机

根据上述流程的介绍,启动openwrt的虚拟机,网络配置/etc/config/network如下,其中eth1作为LAN口加入到桥中,eth0作为WAN口配置静态地址:

Java

 

1

2

3

4

5

6

7

8

9

10

11

config interface 'lan'

        option type 'bridge'

        option proto 'static'

        option ifname 'eth1'

        option netmask '255.255.255.0'

        option ipaddr '192.168.100.1'

config interface 'wan'

        option ifname 'eth0'

        option proto 'static'

option ipaddr '10.0.0.1'

        option netmask '255.255.255.0'

 

  • qemu运行linux虚拟机

为了测试方便,可以使用qemu搭建aarch64的linux虚拟机代替测试设备,本文不介绍搭建方法(感兴趣的读者可以自己网上学习),当然读者也可以采用接入物理设备进行测试。

如果是测试设备是虚拟机方式,测试终端和服务器使用的tap网口加入到上述br-lan和br-wan中,本文测试中,测试终端对应的tap2网口加入到br-lan中,测试服务器对应的tap3网口加入到br-wan中(如果采用物理接入设备的方式,就把两个接入设备的网卡加入到对应的桥中)。
ARM平台使用qemu运行OpenWrt虚拟机

  • 互通验证

测试服务器的地址配置成和openwrt的WAN相同网段地址,接入终端可以通过DHCP从获取地址(openwrt默认为LAN侧分配地址),在接入终端中ping测试服务器地址,即可验证网络是否搭建成功。

实验脚本下载地址:https://pan.baidu.com/s/1ggIDHqN