i4box’s Blog

What, Why, How ?

Dpdk + Ovs安装详解与问题记录(上)

安装步骤

安装步骤参考官方文档http://docs.openvswitch.org/en/latest/intro/install/dpdk/

问题记录

1、dpdk编译找不到内核文件

uname -a查看自己内核版本号, 下载对应内核版本文件(yum install能够安装指定版本内核也可以) rpm -ivh kernel-devel-3.10.0-327.el7.x86_64.rpm // 我的内核版本未3.10.0-327

2、ovs与dpdk版本问题

注意选择ovs与dpdk版本对应,我这边刚开始选择的是ovs最新稳定版2.7.2,DPDK最新稳定版本17.05.1,结果编译ovs时候出错,找不到头文件rte_virtio_net.h,最后发现是17.05.1更新说明中:‘’‘The vhost public header file rte_virtio_net.h is renamed to rte_vhost.h’‘’,于是将DPDK替换为16.11.2版本编译通过。 ovs与内核、DPDK版本对应关系可以参考http://docs.openvswitch.org/en/latest/faq/releases/

3、VT-d(intel IO虚拟化)在BIOS是否开启确认

只能判断cpu是否支持VT-d,一般默认都是开启的

egrep -o "vmx" /proc/cpuinfo     
dmesg | grep -e DMAR -e IOMMU     // 判断是否开启

若未开启的话,比较麻烦,可以参考网上一些文档尝试进行开启。

4、kernel中开启VT-d

判断是否开启

    # cat /proc/cmdline | grep iommu=pt
    # cat /proc/cmdline | grep intel_iommu=on

未开启,则开启:

# vim /etc/default/grub

修改

# GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"

# GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet iommu=pt intel_iommu=on"

更新grub

# grub2-mkconfig > /boot/grub2/grub.cfg
# reboot

5、网卡PCI号

当dpdk和ovs都安装完成后,进行验证将dpdk驱动的网卡绑定到ovs port上时,会进行如下操作

# ovs-vsctl add-port br0 myportnameone -- set Interface myportnameone \
type=dpdk options:dpdk-devargs=0000:06:00.0

对于dpdk-devargs这个参数指的是网卡设备的PCI号,这里指的是绑定到DPDK上网卡的PCI号,可以通过dpdk tools目录下dpdk-devbind.py工具查看:

[root@compute1 tools]# ./dpdk-devbind.py -s

Network devices using DPDK-compatible driver
============================================
0000:01:00.1 'NetXtreme BCM5720 Gigabit Ethernet PCIe' drv=vfio-pci unused=tg3,igb_uio
0000:02:00.0 'NetXtreme BCM5720 Gigabit Ethernet PCIe' drv=vfio-pci unused=tg3,igb_uio

Network devices using kernel driver
===================================
0000:01:00.0 'NetXtreme BCM5720 Gigabit Ethernet PCIe' if=em1 drv=tg3 unused=igb_uio,vfio-pci *Active*
0000:02:00.1 'NetXtreme BCM5720 Gigabit Ethernet PCIe' if=em4 drv=tg3 unused=igb_uio,vfio-pci

Other network devices
=====================
<none>

Crypto devices using DPDK-compatible driver
===========================================
<none>

Crypto devices using kernel driver
==================================
<none>

Other crypto devices
====================
<none> 

如上所示,0000:01:00.0和0000:02:00.0即为我们绑定到dpdk上的两张网卡的PCI号,且使用的驱动为drv=vfio-pci。

6、绑定网卡到ovs port报错

报错日志信息如下:

2017-08-24T03:29:45.325Z|00070|netdev_dpdk|WARN|Error attaching device ‘0000:01:00.1’ to DPDK 2017-08-24T03:29:45.325Z|00071|netdev|WARN|dpdk-p0: could not set configuration (Invalid argument)

错误信息非常简单,各种重试只会错误依旧,最后再一些高手的指点下,确定编译dpdk时,默认网卡的PMD driver(由于我的网卡是Broadcom的,默认未开启)。

6.1、网卡PMD驱动未开启

查看网卡型号

[root@compute1 dpdk-stable-16.11.2]# lspci -vvv | grep Eth
01:00.0 Ethernet controller: Broadcom Limited NetXtreme BCM5720 Gigabit Ethernet PCIe
        Product Name: Broadcom NetXtreme Gigabit Ethernet
01:00.1 Ethernet controller: Broadcom Limited NetXtreme BCM5720 Gigabit Ethernet PCIe
        Product Name: Broadcom NetXtreme Gigabit Ethernet
02:00.0 Ethernet controller: Broadcom Limited NetXtreme BCM5720 Gigabit Ethernet PCIe
        Product Name: Broadcom NetXtreme Gigabit Ethernet
02:00.1 Ethernet controller: Broadcom Limited NetXtreme BCM5720 Gigabit Ethernet PCIe
        Product Name: Broadcom NetXtreme Gigabit Ethernet

开启dpdk中该类型网卡PMD驱动

编辑vim config/common_base文件,找到Broadcom PMD驱动位置,如下:
修改CONFIG_RTE_LIBRTE_BNX2X_PMD=y(默认未n)。
# Compile burst-oriented Broadcom PMD driver
#
CONFIG_RTE_LIBRTE_BNX2X_PMD=y
CONFIG_RTE_LIBRTE_BNX2X_DEBUG=n
CONFIG_RTE_LIBRTE_BNX2X_DEBUG_INIT=n
CONFIG_RTE_LIBRTE_BNX2X_DEBUG_RX=n
CONFIG_RTE_LIBRTE_BNX2X_DEBUG_TX=n
CONFIG_RTE_LIBRTE_BNX2X_MF_SUPPORT=n
CONFIG_RTE_LIBRTE_BNX2X_DEBUG_PERIODIC=n

重新编译,测试后,错误依旧。

6.2、dpdk驱动对网卡类型的支持

各种重新编译测试后,仍然报错,于是重新阅读官网文档,总觉的是哪里漏设置了,于是乎看到dpdk支持的网卡http://dpdk.org/doc/nics,接着看到对Broadcom网卡的支持如下图,没有看到我使用的BCM5720,至此,问题原因已经清晰,等后面换了intel 82599或x710网卡再进行测试。  dpdk broadcom nic support png

后面等支持dpdk的intel网卡机器到位后,再进行测试记录。