QEMU安装
1. 如果系统中没有,请安装以下软件
$ sudo apt-get install git libglib2.0-dev libfdt-dev
libpixman-1-dev zlib1g-dev
2. 从源代码获取QEMU软件。
3. 切换到QEMU目录并准备一个本机生成的目录。
4. 配置并构建QEMU。
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 accelera
tion 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。
3. 下载适用于QEMU的virt机器类型的UEFI镜像。 为此使用从Linaro派生的EDK II快照镜像。 下载后将UEFI镜像解压缩。
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镜像
6. 启用KVM运行QEMU。 执行以下命令后,Ubuntu安装程序将自动boot并完成标准的Ubuntu安装过程。
上面命令中的选项将在下面说明。 有关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: 定义驱动器连接在哪种接口上,可用的类型有ide, scsi, sd, mtd, floppy, pflash, virtio以及none.
7. 安装完成后,使用以下命令用QEMU重新启动guest VM。 本质以下命令与之前的命令完全相同,但删除了最后的-drive 选项。 安装后的默认boot设备记录在varstore.img中,而Ubuntu安装则在ubuntu1804.img中进行。
8. 在guest VM中安装基本软件包。
9. 下载并在guest VM中安装DPDK。使用“arm64-armv8a-linuxapp-gcc”通用配置文件构建DPDK。QEMU可能无法完全模拟主机,因此可能仅支持主机平台的某些功能。
在shell中关闭QEMU进程:按Ctrl + a,然后按x。
PHY-VM-PHY设置
1. 添加user space网桥。ovs-vsctl 命令可用于此目的。 使用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的套接字。
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来解决这个问题:
如果您遇到另一个错误,例如“ no alternatives for python”,则需要使用以下命令来解决:
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模式。
至此,PHY-VM-PHY测试的设置已全部完成,您需要做的就是配置流量生成器将流量发送到DUT。
结束语
本文提供了有关如何为PHY-VM-PHY测试使用DPDK设置OvS的分步教程。这是一个非常全面的指南。
除了OvS和DPDK设置之外,还介绍了如何在Arm平台上安装guest VM。 同时详细说明了QEMU命令行选项来帮助用户了解它的含义,让他们可以根据自己的要求进行自定义设置。本文另一个值得注意的地方是显示了如何为guest VM中的vhost-user 界面加载和使用vfio驱动程序而不是uio驱动程序。