vhost-user测试环境搭建

DPDK是使用最广泛的vhost-user后端,这里介绍下使用DPDK、OVS、QEMU搭建vhost-user测试环境的过程。
测试环境使用的版本:
CentOS:7.8
DPDK:19.11
OVS:2.12.0
QEMU:4.0.0

1、编译DPDK

DPDK可以编译成动态库也可以编译成静态库,这里选择的是默认的静态库。

yum install numactl-devel
cd ~
wget https://fast.dpdk.org/rel/dpdk-19.11.tar.xz
tar -Jxvf dpdk-19.11.tar.xz
cd dpdk-19.11/
make install T=x86_64-native-linuxapp-gcc

生成的库文件在x86_64-native-linuxapp-gcc目录下。

将实际网口绑定到DPDK上,网卡驱动可以选择UIO也可以选择新的VFIO驱动,这里选择了UIO方式。08:00.0为网卡的PCI地址,也可以使用网卡名称。

echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
modprobe uio
insmod x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
./usertools/dpdk-devbind.py --bind=igb_uio 08:00.0

绑定后的网卡信息:

./usertools/dpdk-devbind.py --status
Network devices using DPDK-compatible driver
============================================
0000:08:00.0 ‘82576 Gigabit Network Connection 10c9’ drv=igb_uio unused=igb
Network devices using kernel driver
===================================
0000:08:00.1 ‘82576 Gigabit Network Connection 10c9’ if=enp8s0f1 drv=igb unused=igb_uio

2、编译OVS

CentOS自带的OVS不支持DPDK datapath,因此需要手动编译,在编译时需要指定DPDK路径,编译方法如下:

wget https://www.openvswitch.org/releases/openvswitch-2.12.0.tar.gz
tar -zxvf openvswitch-2.12.0.tar.gz
./configure --with-dpdk=~/dpdk-19.11/x86_64-native-linuxapp-gcc/
make
make install

这里有个编译错误:

lib/netdev-dpdk.c: In function ‘dpdk_buf_size’:
lib/netdev-dpdk.c:86:42: error: ‘ETHER_HDR_LEN’ undeclared (first use in this function)

需要修改OVS代码,修改方法如下:

sed -i “s/ ETHER_/ RTE_ETHER_/” lib/netdev-dpdk.c
sed -i “s/(ETHER_/(RTE_ETHER_/” lib/netdev-dpdk.c
sed -i “s/ ETHER_CRC/ RTE_ETHER_CRC/” lib/netdev-dpdk.c
sed -i “s/ e_RTE_METER_/ RTE_COLOR_/” lib/netdev-dpdk.c
sed -i “s/struct ether_addr/struct rte_ether_addr/” lib/netdev-dpdk.c
sed -i “s/struct ether_hdr/struct rte_ether_hdr/” lib/netdev-dpdk.c

编译成功后,可执行文件安装在/usr/local/bin/目录下。
查看版本信息:

/usr/local/bin/ovs-vsctl --version
ovs-vsctl (Open vSwitch) 2.12.0
DB Schema 8.0.0

3、编译QEMU

CentOS自带的QEMU版本较老,vhost-user需要使用2.7以上的版本,因此需要手动编译版本。

qemu-kvm --version
QEMU emulator version 1.5.3 (qemu-kvm-1.5.3-173.el7), Copyright © 2003-2008 Fabrice Bellard

编译方法如下:

wget https://download.qemu.org/qemu-4.0.0.tar.xz
tar -Jxvf qemu-4.0.0.tar.xz
./configure
make
make install

编译后生成的可执行文件为:
/usr/local/bin/qemu-system-x86_64

查看版本信息:

/usr/local/bin/qemu-system-x86_64 --version
QEMU emulator version 4.0.0
Copyright © 2003-2019 Fabrice Bellard and the QEMU Project developers

4、启动OVS

创建需要的目录

mkdir -p /usr/local/etc/openvswitch
mkdir -p /usr/local/var/log/openvswitch
mkdir -p /usr/local/var/run/openvswitch

利用ovsdb-tool创建ovsdb数据库

ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema

启动ovsdb进程

ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach

设置数据库配置

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true

启动ovs-vswitchd进程

ovs-vswitchd --pidfile --detach

检查支持DPDK是否成功:

ovs-vsctl get Open_vSwitch . dpdk_initialized
true

建立一个网桥,需要将网桥的类型指定为netdev

/usr/local/bin/ovs-vsctl add-br br1 – set bridge br1 datapath_type=netdev

将外部端口加入到网桥,网口的类型需要设置为dpdk,dpdk-devargs为网口的PCI地址。

/usr/local/bin/ovs-vsctl add-port br1 port0 – set Interface port0 type=dpdk option:dpdk-devargs=0000:08:00.0

当DPDK端口添加到网桥,一个轮询线程会持续的轮询DPDK设备,并消耗100%的处理核,可以通过top和ps命令来检查。

top -H
ps -eLo pid,psr,comm | grep pmd

查询网桥信息如下

/usr/local/bin/ovs-vsctl show
380b7b76-4049-41e3-82b5-7bf52e0a50bd
Bridge “br1”
datapath_type: netdev
Port “port0”
Interface “port0”
type: dpdk
options: {dpdk-devargs=“0000:08:00.0”}
Port “br1”
Interface “br1”
type: internal

5、启动虚拟机

OVS提供两种类型的vhost-user端口:

  • vhost-user (dpdkvhostuser)
  • vhost-user-client (dpdkvhostuserclient)

vhost-user使用客户端-服务器模型。服务端创建、管理vhost-user套接字接口,客户端连接到服务端。对于vhost-user端口,OVS作为服务端,QEMU为客户端。这意味着如果OVS进程挂掉,所有的虚拟机必须重新启动。反之,对于vhost-user-client端口,OVS作为客户端,QEMU为服务端。这意味着OVS重启不会影响虚拟机。因此vhost-user-client端口为推荐类型,vhost-user不再推荐使用。

vhost-user

添加vhost-user端口

/usr/local/bin/ovs-vsctl add-port br1 vhost-user-1 – set Interface vhost-user-1
type=dpdkvhostuser

OVS创建了一个socket文件,/usr/local/var/run/openvswitch/vhost-user-1,此文件路径需要传给QEMU。

QEMU添加vhost-user端口的格式:
-chardev socket,id=char1,path=/usr/local/var/run/openvswitch/vhost-user-1
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1

vhost-user-client

添加vhost-user-client端口需要指定vhost-server-path值,表示socket文件路径。

export VHOST_USER_SOCKET_PATH=/usr/local/var/run/sock1
/usr/local/bin/ovs-vsctl add-port br1 vhost-client-1
– set Interface vhost-client-1 type=dpdkvhostuserclient
options:vhost-server-path=$VHOST_USER_SOCKET_PATH

qemu创建vhost-user-client网口设备格式

-chardev socket,id=char1,path=$VHOST_USER_SOCKET_PATH,server
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1

DPDK需要使用巨页,因此要把巨页信息传给qemu,格式如下

-object memory-backend-file,id=mem,size=4096M,mem-path=/dev/hugepages,share=on
-numa node,memdev=mem -mem-prealloc

测试环境使用vhost-user-client端口,添加端口后网桥信息

/usr/local/bin/ovs-vsctl show 380b7b76-4049-41e3-82b5-7bf52e0a50bd
Bridge “br1”
datapath_type: netdev
Port “port0”
Interface “port0”
type: dpdk
options: {dpdk-devargs=“0000:08:00.0”}
Port “br1”
Interface “br1”
type: internal
Port “vhost-client-1”
Interface “vhost-client-1”
type: dpdkvhostuserclient
options: {vhost-server-path="/usr/local/var/run/sock1"}

启动虚拟机

/usr/local/bin/qemu-system-x86_64 -machine accel=kvm -cpu host -smp 4 --enable-kvm -hda /home/tecs/centos7.8.img -m 2048M -object memory-backend-file,id=mem,size=2048M,mem-path=/dev/hugepages,share=on -numa node,memdev=mem -mem-prealloc -chardev socket,id=char1,path=$VHOST_USER_SOCKET_PATH,server -netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce -device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1 -daemonize

虚拟机启动后,使用VNC登录到虚拟机,为网口配置IP,可以通过网桥ping通外部网络。至此vhost-user测试环境搭建完成。

6、参考资料

  1. http://doc.dpdk.org/guides/linux_gsg/
  2. http://docs.openvswitch.org/en/latest/intro/install/dpdk/
  3. http://docs.openvswitch.org/en/latest/howto/dpdk/
  4. http://docs.openvswitch.org/en/latest/topics/dpdk/vhost-user/
  5. https://blog.xuegaogg.com/archives/1336.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值