之前对dpdk编译了解得较少,之前直接就把centos yum update了,造成测试经理部署的centos 6.5升级为6.9,造成dpdk编译出错。
先说说centos 6.9下编译的心得:
1. 安装DPDK,解压缩DPDK
2.配置编译 config/common_base CONFIG_RTE_BUILD_SHARED_LIB =y
3.编译
gcc 版本需要用 4.4.7的来编译,208开发机上的/usr/bin/gcc是这个版本,/opt/rh...下和/usr/local/gcc-6.x ..下的gcc版本太高了,是不能编译dpdk16.04这个版本的。如果不是4.4.7这个版本,可以:
export PATH=/usr/bin:$PATH 来指定gcc用/usr/bin/gcc这个版本。
尝试过用高版本的来编译,提示说不存在compiler-gcc5.h,把compiler-gcc5.h拷贝到类似于/usr/src/kernels/2.6.32-696.10.1.el6.x86_64/include/linux
这样的目录下,但是因为部分dpdk代码不规范,高版本的会发现更多的错误。
用4.4.7这个编译,发现KNI模块提示出错,原因在http://dev.dpdk.narkive.com/Tmz3Gv1z/dpdk-dev-can-t-build-dpdk-16-04-on-centos-6-8 给出了答案。根据http://www.jianshu.com/p/bc2bde0e4442,我们可以禁掉KNI模块,否则按照前一个链接,需要编译内核,比较麻烦。修改config/。这个问题,dpdk QQ开发群也有同感:“是的,6.5可以,升级以后各种问题。”
近点KNI,需要修改文件,config/common_linuxapp,搜索关键字“KNI”,置为“n”。
主要问题是CentOS 6.x太老了,dpdk官方懒得全面支持。
运行/tools/dpdk-setup.sh 选择x86_64-native-linuxapp-gcc (avx 指令不支持)
#
# Compile librte_acl
#
CONFIG_RTE_LIBRTE_ACL=n
CONFIG_RTE_LIBRTE_ACL_DEBUG=n
重新编译DPDK 重新编译应用程序
编译完,说编译成功,但是“Installation cannot run with T defined and DESTDIR undefined”,提示你没有指定安装路径,这里我们只需要编译,本来也不需要安装,所以忽略,不影响使用。
按照http://dpdk-docs.readthedocs.io/en/latest/linux_gsg/sys_reqs.html#dpdk 这个网页,说要求Kernel version >= 2.6.34,我们的centos6.x都是2.6.32的内核,不符合要求。这个问题有待以后研究。
调整过参数(disable KNI和ACL)的dpdk 16.07.02在这里: https://192.168.1.91/svn/sourceev/trunk/dpdk-16.07.2-adjustParmeter.tar.gz
ACL是针对特定网卡禁掉的,别的网卡未必需要对acl禁掉。
2. 当然最简单的方式是启动时,回退到原来的内核版本。修改/boot/grub/grub.conf,把default改为6.5的那个内核(2.32-431...)。
如果原来没有原来的内核,可以参考https://iforday.com/86.html,来安装6.5的内核。
后来,发现内核更新后,程序没法跑,不能确定是程序的问题,还是dpdk的问题。
禁止内核更新,需要这么做。
方法如下:
方法1:
# vim /etc/yum.conf
exclude=kernel*
在 [main]配置段下,追加或修改以上内容。
可通过下面的命令查看是否生效:
# yum update | grep -i kernel
方法2:
在yum命令行中加上-x参数,来跳过指定的更新。如:
# yum -x ‘kernel*’ update
Linux禁止系统内核Kernel升级的方法就介绍到这里了,方法2是通过在yum命令行中加入参数来实现的,相较于方法1简单了很多。
- #禁止更新内核
- exclude=kernel*
- # 禁止更新系统
- exclude=centos-release*