之前對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*
