对于实验室服务器使用的Mellanox Connect-X3 Pro网卡来说,不仅在编译DPDK时需要修改响应的编译设置,而且在编译OVS-DPDK时,也同样需要指定特殊的依赖库。此前的博客中已经介绍了修改automake.mk的方式,经过一段时间的实践,还有两种方式可以添加依赖库。

为什么要添加依赖库

根据我对ovs-discuss邮件列表的研究,大家认为,DPDK在使用Mellanox网卡与Intel网卡行为有差异。Mellanox网卡不需要绑定到VFIO或uio_generic或igb_uio内核模块上,也就不需要运行dpdk-devbind.py脚本。DPDK直接通过VERBS接口poll Mellanox网卡,因此,这个libibverbs的库文件对于编译OVS-DPDK而言是必要的。不修改直接编译是会报错的。

第一种方法:export LIBS=”-libverbs”

这种方法最为简单,在执行configure脚本之前先执行这个命令,不需要修改源文件。

编译流程为:

export LIBS="-libverbs"

./configure --with-dpdk=$DPDK_BUILD

make

make install

第二种方法:修改acinclude.m4

acinclude.m4是自动编译工具aclocal的配置文件,它可以定义宏来指定编译时需要的库文件。

首先在OVS 2.6.0源文件目录下使用grep搜索DPDK库文件的定义位置:

grep -nr DPDK_LIB ./

结果为:

./configure:20774:        DPDK_LIB_DIR="$with_dpdk/lib"
./configure:20778:    DPDK_LIB="-ldpdk"
./configure:20785:      LDFLAGS="$LDFLAGS -L${DPDK_LIB_DIR}"
./configure:20994:        LIBS="$DPDK_LIB $extras $save_LIBS $DPDK_EXTRA_LIB"
./configure:21023:        as_fn_error $? "Could not find DPDK libraries in $DPDK_LIB_DIR" "$LINENO" 5
./configure:21029:      OVS_LDFLAGS="$OVS_LDFLAGS -L$DPDK_LIB_DIR"
./configure:21077:    DPDK_vswitchd_LDFLAGS=-Wl,--whole-archive,$DPDK_LIB,--no-whole-archive
./acinclude.m4:186:        DPDK_LIB_DIR="$with_dpdk/lib"
./acinclude.m4:190:    DPDK_LIB="-ldpdk"
./acinclude.m4:197:      LDFLAGS="$LDFLAGS -L${DPDK_LIB_DIR}"
./acinclude.m4:246:        LIBS="$DPDK_LIB $extras $save_LIBS $DPDK_EXTRA_LIB"
./acinclude.m4:263:        AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
./acinclude.m4:269:      OVS_LDFLAGS="$OVS_LDFLAGS -L$DPDK_LIB_DIR"
./acinclude.m4:282:    DPDK_vswitchd_LDFLAGS=-Wl,--whole-archive,$DPDK_LIB,--no-whole-archive

其中,configure脚本是由aclocal和autoconf生成的,因此只需要修改acinclude.m4文件即可。

在第191行的DPDK_EXTRA_LIB配置项中添加”-libverbs”:

DPDK_EXTRA_LIB="-libverbs"

在编译之前首先运行自动配置工具更新编译配置文件:

aclocal

autoconf

automake

然后按照标准流程编译即可:

./configure --with-dpdk=$DPDK_BUILD

make

make install

第三种方法:修改automake.mk

第三种方法是修改vswitchd/automake.mk文件,修改vswitchd/automake.mk文件,将原来的链接设置:

vswitchd_ovs_vswitchd_LDADD = \
    ofproto/libofproto.la \
    lib/libsflow.la \
    lib/libopenvswitch.la 

修改为下述形式:

vswitchd_ovs_vswitchd_LDADD = \
    ofproto/libofproto.la \
    lib/libsflow.la \
    lib/libopenvswitch.la \
    /usr/lib64/libibverbs.a \
    /usr/lib64/libnl.so

在链接ovs-vswitchd时就会使用libibverbs、libnl库文件,可以编译成功。