11

vesperW · 2020年09月22日

Arm上带DPDK的Open vSwitch:第三章PHY-VM-PHY的设置

总览

本文是“Arm上带DPDK的OpenvSwitch”系列博客的第3章。本文描述了如何使用DPDK设置OvS从而在Arm平台上运行PHY-VM-PHY 或vHost-Loopback 流量测试。 高级执行步骤的顺序如下所示:

·  前提条件

·  QEMU安装

·  QEMU设置与VM安装

·  PHY-VM-PHY设置

本文假定您已经在Arm平台的主目录中构建并安装了带有DPDK的OvS。 Arm平台被用作流量测试的被测设备(DUT)。 如果您尚未完成这些步骤,请参阅本系列博客的第1章:构建与安装。

前提条件

在继续之前,请完成本系列博客的第2章:PHY-PHY测试的设置中的内容,具体步骤列举如下:

·  前提条件:隔离CPU

·  大页内存(Hugepages)配置

·   DPDK设置

·   使用 OvS的 DPDK配置 设置OvS

QEMU安装

1. 如果系统中没有,请安装以下软件包。

$ sudo apt-get install git libglib2.0-dev libfdt-dev
libpixman-1-dev zlib1g-dev

2. 从源代码获取QEMU软件。

$ git clone git://[git.qemu.org/qemu.git](http://git.qemu.org/qemu.git)

3. 切换到QEMU目录并准备一个本机生成的目录。

$ cd $HOME/qemu

$ mkdir -p bin

4.  配置并构建QEMU。

$ cd $HOME/qemu/bin

$ ../configure --target-list=aarch64-softmmu --prefix=$HOME/usr
--enable-debug --extra-cflags='-g'

$ make -j32

QEMU设置与VM安装

1. 在继续之前,您需要检查当前的硬件是否支持必要的KVM 虚拟化扩展。 我在guest VM安装期间启用了KVM,因为在编译时启用KVM将带来更快更高效的QEMU虚拟化和性能。 您可以先在平台上安装cpu-checker ,然后在终端提示中输入sudo kvm-ok 来执行此检查。

$ sudo apt install cpu-checker

$ sudo kvm-ok

如果系统显示以下消息,则说明系统具有KVM虚拟化支持且已启用。

INFO: /dev/kvm exists

KVM acceleration can be used

如果系统显示与以下内容类似的消息,则很可能是因为以下两种原因:

•硬件不支持KVM虚拟化或

•未在BIOS设置中启用KVM虚拟化

INFO: Your CPU does not support KVM extensions

KVM acceleration can NOT be used

2. 下载.iso镜像文件。 我选择了Bionic(即Ubuntu 18.04)作为guest VM 用来安装QEMU。

$ cd $HOME/qemu/bin

$ mkdir -p isos

$ cd $HOME/qemu/bin/isos

$ wget [http://ports.ubuntu.com/ubuntu-ports/dists/bionic/main/installer-arm64/current/images/netboot/mini.iso](http://ports.ubuntu.com/ubuntu-ports/dists/bionic/main/installer-arm64/current/images/netboot/mini.iso)

 3. 下载适用于QEMU的virt机器类型的UEFI镜像。 为此使用从Linaro派生的EDK II快照镜像。 下载后将UEFI镜像解压缩。

$ cd $HOME/qemu/bin

$ mkdir -p images

$ cd $HOME/qemu/bin/images

$ wget [http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-AARCH64/RELEASE\_GCC5/QEMU\_EFI.img.gz](http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-AARCH64/RELEASE_GCC5/QEMU_EFI.img.gz)

$ gunzip QEMU_EFI.img.gz

4. 为VM创建主磁盘镜像,并创建一个较小的镜像来存储EFI变量。 这是借助qemu-img命令完成的。 磁盘的格式是通过-f参数指定的; 这个文件以qcow2的格式创建,因此仅非空扇区被写入文件中。 然后指定镜像文件的完整路径。 最后一个参数是镜像文件可以增长到的最大大小。
这个镜像被创建为稀疏文件,当磁盘填充数据时镜像会随之增长。

$ cd $HOME/qemu/bin/images 

$ ../qemu-img create -f qcow2 ubuntu1804.img 128G

$ ../qemu-img create -f qcow2 varstore.img 64M

5. 用dd命令复制从Linaro下载的QEFI镜像

$ cd $HOME/qemu/bin/images

$ dd if=QEMU_EFI.img of=varstore.img

6.  启用KVM运行QEMU。 执行以下命令后,Ubuntu安装程序将自动boot并完成标准的Ubuntu安装过程。

$ cd $HOME/qemu/bin 

$ sudo ./aarch64-softmmu/qemu-system-aarch64 \

-m 4096 -cpu host
-enable-kvm -machine virt,gic_version=host -nographic \

-drive
if=pflash,format=raw,file=./images/QEMU_EFI.img \

-drive
if=pflash,format=raw,file=./images/varstore.img \

-drive
if=virtio,file=./images/ubuntu1804.img,cache=none \

-drive
if=virtio,format=raw,file=./isos/mini.iso

上面命令中的选项将在下面说明。 有关QEMU选项的完整列表,请参阅QEMU文档。

-m: 指定内存量; 默认值为128MB。 如果要规定兆字节或千兆字节的内存,则需使用适当的后缀,M表示兆字节,G表示兆字节。

 -cpu: 指定要仿真的处理器。 建议模拟主机处理器。

 -enable-kvm: 启用完整的KVM虚拟化支持。此选项仅在编译时启用KVM支持才可用。

-machine: 指定机器类型。 对于64位的Arm,除非您知道要仿真的特定的64位Xilinx电路板,不然 “ virt” 就是最佳的选择,因为Arm QEMU仿真的电路板较少。64位Xilinx电路板被设计用于虚拟机,不对应任何实际硬件。 它支持PCI,virtio,最新的CPU和大量的RAM。

-nographic: 禁用图形输出,所以QEMU是一个简单的命令行应用程序。

-drive: 定义一个新的驱动器,包括创建块驱动程序节点(后端)和来宾设备。 该选项接受子选项,并列出以下命令中引用的子选项:

-File: 定义与此驱动器一起使用的磁盘镜像。

-Format: 指定使用哪种磁盘格式而非检测格式。 如果未指定此选项,则QEMU将显示警告。

-If: 定义驱动器连接在哪种接口上,可用的类型有idescsisdmtdfloppypflashvirtio以及none.

7. 安装完成后,使用以下命令用QEMU重新启动guest VM。 本质以下命令与之前的命令完全相同,但删除了最后的-drive 选项。 安装后的默认boot设备记录在varstore.img中,而Ubuntu安装则在ubuntu1804.img中进行。

$ cd $HOME/qemu/bin 

$ sudo ./aarch64-softmmu/qemu-system-aarch64 \ 

-m 4096 -cpu host -enable-kvm -machine virt,gic_version=host
-nographic \

-drive if=pflash,format=raw,file=./images/QEMU_EFI.img \

-drive if=pflash,format=raw,file=./images/varstore.img \

-drive if=virtio,file=./images/ubuntu1804.img 

Ubuntu 18.04.2 LTS ubuntu-aarch64 ttyAMA0

ubuntu-aarch64 login:

8. 在guest VM中安装基本软件包。

$ sudo apt-get install build-essential 

$ sudo apt-get install git numactl libnuma-dev bc
device-tree-compiler dh-autoreconf curl

9. 下载并在guest VM中安装DPDK。使用“arm64-armv8a-linuxapp-gcc”通用配置文件构建DPDK。QEMU可能无法完全模拟主机,因此可能仅支持主机平台的某些功能。

$ wget [http://fast.dpdk.org/rel/dpdk-19.11.tar.xz](http://fast.dpdk.org/rel/dpdk-19.11.tar.xz)

$ tar xf dpdk-19.11.tar.xz

$ cd $HOME/dpdk-19.11

$ make config T=arm64-armv8a-linuxapp-gcc

$ export RTE_SDK=$HOME/dpdk-19.11

$ export RTE_TARGET=arm64-armv8a-linuxapp-gcc

$ sudo make -j32 install T=$RTE_TARGET DESTDIR=install

在shell中关闭QEMU进程:按Ctrl + a,然后按x。
12.jpg

PHY-VM-PHY设置

1. 添加user space网桥。ovs-vsctl 命令可用于此目的。 使用datapath\_type=netdev创建网桥。

$ cd $HOME/usr/bin

$ sudo ./ovs-vsctl add-br dpdk-br1 -- set bridge dpdk-br1
datapath_type=netdev

2. 添加两个DPDK端口。ovs-vsctl 命令也可以用于此目的。

$ sudo ./ovs-vsctl add-port dpdk-br1 dpdk1 -- set Interface dpdk1
type=dpdk options:dpdk-devargs=
 ofport_request=1
$ sudo ./ovs-vsctl add-port dpdk-br1 dpdk2 -- set Interface dpdk2
type=dpdk options:dpdk-devargs=
 ofport_request=2

3. 添加两个DPDK vHost User 端口。这个操作在$HOME/var/run/openvswitch/vhost-user*目录创建了两个必须在QEMU命令行上提供给VM的套接字。

$ sudo ./ovs-vsctl add-port dpdk-br1 vhost-user1 -- set Interface
vhost-user1 type=dpdkvhostuser ofport_request=3

$ sudo ./ovs-vsctl add-port dpdk-br1 vhost-user2 -- set Interface
vhost-user2 type=dpdkvhostuser ofport_request=4

4.  添加测试流以便在DPDK端口与vhost-user 之间转发数据包。流被配置后可以看到传输到任一端口的流量在另一端口返回。

$ sudo ./ovs-ofctl del-flows dpdk-br1

$ sudo ./ovs-ofctl add-flow dpdk-br1 in_port=1,action=output:3

$ sudo ./ovs-ofctl add-flow dpdk-br1 in_port=2,action=output:4

$ sudo ./ovs-ofctl add-flow dpdk-br1 in_port=3,action=output:1

$ sudo ./ovs-ofctl add-flow dpdk-br1 in_port=4,action=output:2

5.    调出网桥及其接口

$ sudo ip link set dpdk-br1 up

6.    使用vhost-user1 和vhost-user2 端口启动VM guest虚拟机。

$ cd $HOME/qemu/bin

$ taskset -c 1,2,3,4 \

sudo ./aarch64-softmmu/qemu-system-aarch64 \

-cpu host -machine virt,gic-version=host -enable-kvm -nographic \

-m 2048M -numa node,memdev=mem -mem-prealloc -smp
sockets=1,cores=2 \

-drive if=pflash,format=raw,file=./images/QEMU_EFI.img \

-drive if=pflash,format=raw,file=./images/varstore.img \

-drive if=virtio,file=./images/ubuntu1804.img \

-object memory-backend-file,id=mem,size=2048M,mem-path=/dev/hugepages,share=on
\

-chardev socket,id=char1,path=$VHOST_SOCK_DIR/vhost-user1 \

-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce \

-device
virtio-net-pci,netdev=mynet1,mac=00:00:00:00:00:01,mrg_rxbuf=off \

-chardev socket,id=char2,path=$VHOST_SOCK_DIR/vhost-user2 \

-netdev type=vhost-user,id=mynet2,chardev=char2,vhostforce \

-device
virtio-net-pci,netdev=mynet2,mac=00:00:00:00:00:02,mrg_rxbuf=off

Some of the previous options have been
explained in previous sections. The remainder is explained in the following:

以上命令中的一些选项已经在之前解释过, 剩余选项的解释如下所示:

-taskset: 设置QEMU进程的CPU亲和性。

-smp: 指定允许访客使用的虚拟CPU,内核和线程的数量。 数目可以高于主机系统上可用的内核数。

-numa node:定义一个NUMA节点,并为其分配RAM和VCPU。 memdev 从给定的内存后端设备将RAM分配给节点。 内存后端设备的创建如下所述:
-object memory-backend-file: 创建一个可用于有hugepage的guest RAM备份的内存文件后端对象。id参数是唯一的ID,在配置-numa 参数时用于引用此内存区域。 size 选项提供了存储区域的大小。mem-path 提供了共享内存或hugepage文件系统挂载的路径(在这种情况下为/dev/hugepages )。share Boolean选项确定是否将内存区域标记为QEMU专用或共享。 后者允许协作的外部进程访问QEMU的内存区域。

-mem-prealloc: 使用-mem-path预分配内存。

-chardev: 指定字符设备后端。 在这种情况下由于指定了路径,所以创建了双向Unix流套接字

-netdev type=vhost-user: 建立由chardev支持的vhost-user netdev 。 chardev应该是Unix域套接字的后端。vhost-user 使用专门定义的协议将vhost
ioctl 的替换消息传递到套接字另一端的应用程序。 在非MSIX guest虚拟机上,可以用vhostforce强制使用此功能。

-device virtio 添加virtio 设备驱动程序。 有效属性取决于驱动程序。

7. VM被启动后分配并安装hugepage(如果默认情况下尚未安装)

$ sudo sysctl vm.nr_hugepages=512

$ mount | grep hugetlbfs

$ sudo mount -t hugetlbfs hugetlbfs /dev/hugepages

8. 插入vfio-pci内核模块,以便在下一步中可以将传递的vhost-user 接口绑定到vfio-pci 驱动程序中。

$ sudo modprobe -r vfio_iommu_type1

$ sudo modprobe -r vfio

$ sudo modprobe vfio enable_unsafe_noiommu_mode=1

$ cat /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

$ sudo modprobe vfio-pci

9.  将vhost-user 界面绑定到vfio-pci 驱动程序。 使用第一个命令列出guest VM当前检测到的所有网络设备。

$ sudo $HOME/dpdk-19.11/usertools/dpdk-devbind.py --status

$ sudo $HOME/dpdk-19.11/usertools/dpdk-devbind.py -b vfio-pci
 

有时,运行python可能会出现如下错误:

ubuntu /usr/bin/env: python: No such file or directory

可以通过使用以下命令行工具update-alternatives将python指向python3来解决这个问题:

$ sudo update-alternatives --config python

如果您遇到另一个错误,例如“ no alternatives for python”,则需要使用以下命令来解决:

$ sudo update-alternatives --install /usr/bin/python python
/usr/bin/python3 10

10. 在guest VM中的DPDK上编译testpmd应用程序。

$ export RTE_SDK=$HOME/dpdk-19.11

$ export RTE_TARGET=arm64-armv8a-linuxapp-gcc

$ make

11. 启动testpmd应用程序并启用I / O forwarding模式。

$ cd $HOME/dpdk-19.11/app/test-pmd

$ sudo ./testpmd -c 0x3 -n 4 -- --burst=64 -i

testpmd> set fwd io retry

testpmd> start

至此,PHY-VM-PHY测试的设置已全部完成,您需要做的就是配置流量生成器将流量发送到DUT。

结束语

本文提供了有关如何为PHY-VM-PHY测试使用DPDK设置OvS的分步教程。这是一个非常全面的指南。
除了OvS和DPDK设置之外,还介绍了如何在Arm平台上安装guest VM。 同时详细说明了QEMU命令行选项来帮助用户了解它的含义,让他们可以根据自己的要求进行自定义设置。本文另一个值得注意的地方是显示了如何为guest VM中的vhost-user 界面加载和使用vfio驱动程序而不是uio驱动程序。



本系列中的其他博客:

作者:Malvika Gupta
翻译:Khorina
原文链接:https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/open-vswitch-with-dpdk-setup-on-arm-for-phy-vm-phy-vhost-loopback-test

推荐阅读
关注数
23565
内容数
1018
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息