目錄
4.1make: *** /lib/modules/3.10.0-229.el7.x86_64/build: 沒有那個文件或目錄
4.2fatal error: numa.h: No such file or directory
4.3提示 初始值設定項裏有未知的字段‘ndo_change_mtu’
Centos7安裝DPDK
背景環境:
CentOS7.6
1系統準備工作
1.1查看Linux機器是否爲NUMA結構
Redhat 或者Centos系統中可以通過命令# grep -i numa /var/log/dmesg 查看輸出結果:
如果輸出結果爲:No NUMA configuration found,說明numa爲disable,如果不是上面的內容說明numa爲enable。下圖則表示該機器爲NUMA結構。一般我們見到的Linux服務器都是NUMA結構。
1.2大頁內存的掛載和分配
在NUMA設備中,分配應該明確指定在哪個節點上:
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
一旦預留了hugepage內存,爲了使內存可用於DPDK,請執行以下步驟:
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
通過將一下命令添加到 /etc/fstab 文件中,安裝點可以在重啓時永久保存:
nodev /mnt/huge hugetlbfs defaults 0 0
1.3加載啓動dpdk需要的uio功能
要運行任何的DPDK應用程序,需要將合適的uio模塊線加載到當前內核中。在多數情況下,Linux內核包含了標準的 uio_pci_generic 模塊就可以提供uio能力。 該模塊可以使用命令加載
sudo modprobe uio_pci_generic
區別於 uio_pci_generic ,DPDK提供了一個igb_uio模塊(可以在kmod目錄下找到)。可以通過如下方式加載:
sudo modprobe uio
sudo insmod kmod/igb_uio.ko
Note
對於一下不支持傳統中斷的設備,例如虛擬功能(VF)設備,必須使用 igb_uio 來替代 uio_pci_generic 模塊。
由於DPDK 1.7版本提供VFIO支持,所以,對於支持VFIO的平臺,可選則UIO,也可以不用。
加載vfio模塊:
sudo modprobe vfio-pci
1.4網絡端口綁定和解綁定到內核驅動模塊
從版本1.4開始,DPDK應用程序不再自動解除所有網絡端口與原先內核驅動模塊的綁定關係。 相反的,DPDK程序在運行前,需要將所要使用的端口綁定到 uio_pci_generic, igb_uio 或 vfio-pci 模塊上。 任何Linux內核本身控制的端口無法被DPDK PMD驅動所使用。
默認情況下,DPDK將在啓動時不再自動解綁定內核模塊與端口的關係。DPDK應用程序使用的任何端口必須與Linux無關,並綁定到 uio_pci_generic, igb_uio 或 vfio-pci 模塊上。
端口從Linux內核解綁,然後綁定到 uio_pci_generic, igb_uio 或 vfio-pci 模塊上供DPDK使用,可以使用腳本dpdk_nic _bind.py(位於usertools目錄下)。 這個工具可以用於提供當前系統上網絡接口的狀態圖,綁定或解綁定來自不同內核模塊的接口。請注意,要將接口綁定到uio或vfio的話,需要先將這兩個模塊加載到內核,再運行 dpdk-devbind.py 腳本。
對於網卡的綁定和解綁定,都需要root權限
./usertools/dpdk-devbind.py –status
綁定設備 eth1,``04:00.1``, 到 uio_pci_generic 驅動:
./usertools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1
或者
./usertools/dpdk-devbind.py --bind=uio_pci_generic eth1
恢復設備 82:00.0 到Linux內核綁定狀態:
./usertools/dpdk-devbind.py --bind=ixgbe 82:00.0
2.安裝依賴包
yum install libpcap libpcap-devel
yum install pciutils
yum install –y kernel-devel kernel-headers
yum install kernel.x86_64 -y
yum install net-tools.x86_64
3.解壓與編譯運行
tar -xzvf dpdk-17.05.tar.gz
cd dpdk-17.05
make config T=x86_64-native-linuxapp-gcc
sed -ri 's,(PMD_PCAP=).*,\1y,' build/.config
make
// 以上操作僅僅是解決編譯問題
// 如果需要使用dpdk來編譯運行對應的程序的話,還需要在/etc/profile裏面(或者~/bashrc)加入環境變量
export RTE_SDK=/home/yml/dpdk/dpdk-stable-16.07.2 //這個是你生成的編譯環境的路徑
export RTE_TARGET=x86_64-native-linuxapp-gcc //編譯的環境變量
export DESTDIR = /home/yml/dpdk/dpdk-stable-16.07.2/ //你的安裝路徑,就是編譯出來的文件的路徑
make install T=$RTE_TARGET
// 接下來就可以編譯運行一個簡單程序
cd examples/helloworld/
make
運行一個簡單程序
UIO驅動和hugepage必須在程序運行前設置好。
將DPDK應用程序二進制文件拷貝到目標設備,按照如下命令運行(我們假設每個平臺處理器有4個內存通道,並且存在core0~3用於運行程序):
[root@compute build]# ./helloworld -c f -n 4
此時會提示如下錯誤:
EAL: Detected 24 lcore(s)
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: Can only reserve 330 pages from 1088 requested
Current CONFIG_RTE_MAX_MEMSEG=256 is not enough
Please either increase it or request less amount of memory.
EAL: FATAL: Cannot init memory
EAL: Cannot init memory
PANIC in main():
Cannot init EAL
5: [./helloworld() [0x442236]]
4: [/lib64/libc.so.6(__libc_start_main+0xf5) [0x7f4a9bfe6505]]
3: [./helloworld() [0x43fa48]]
2: [./helloworld(__rte_panic+0xb8) [0x43a38e]]
1: [./helloworld(rte_dump_stack+0x1a) [0x47dcea]]
Aborted (core dumped)
有可能是服務器上有別的進程在使用大頁內存,此時可以在命令行後接上—socket-mem限制hugepage分配的內存大小。
4.問題與解決方法
4.1make: *** /lib/modules/3.10.0-229.el7.x86_64/build: 沒有那個文件或目錄
錯誤信息:
make -C /lib/modules/3.10.0-229.el7.x86_64/build M=/home/kpatch/kmod/core kpatch.ko
make: Entering an unknown directory
make: *** /lib/modules/3.10.0-229.el7.x86_64/build: 沒有那個文件或目錄。 停止。
make: Leaving an unknown directory
make[2]: *** [kpatch.ko] 錯誤 2
make[2]: Leaving directory `/home/kpatch/kmod/core'
make[1]: *** [all] 錯誤 2
make[1]: Leaving directory `/home/kpatch/kmod'
make: *** [build-kmod] 錯誤 2
解決思路:
- 進入/usr/src/kernels/下看有沒有相應的內核開發包,沒有,就安裝,若有跳過第一步。如果有,但是內核開發包的版本號比現有內核高。該情況如下截圖:
沒關係,我們先執行第一步。
UNAME=$(uname -r)
yum install gcc kernel-devel-${UNAME%.*}
執行完成這一步之後,我們查看一下回顯信息,即使是如下情況,也沒關係,繼續按部就班地處理
2. 進入/lib/modules/3.10.0-229.el7.x86_64,創建軟連接,要注意的是在modules目錄下,是有一個和當前版本號完全一致的路徑的,但是/usr/src/kernerls可能不一致。創建相應的軟連接
使用如下命令創建軟連接
ln -s /usr/src/kernels/3.10.0-1062.el7.x86_64/ /lib/modules/3.10.0-229.el7.x86_64/build
如果提示build文件已經存在,就rm該文件再創建軟連接。值得注意的是,這裏就算兩個內核的版本號不一致,創建軟連接也是ok的,這樣做帶來的問題以及解決方案會在下文中提及。
4.2fatal error: numa.h: No such file or directory
解決方法:yum install numactl-devel*x86_64
4.3提示 初始值設定項裏有未知的字段‘ndo_change_mtu’
這個問題,其實是由於3.1的軟連接的實際文件/目錄的內核版本號不一致導致的,新版本的內核文件對該字段進行了修改。解決方法如下
用find / -name netdevice.h 查找內核中的頭文件,找到struct net_device_ops 中的 ndo_change_mtu,
會看到ndo_change_mtu被替換成對應版本的ndo_change_mtu_rhXX,比如 ndo_change_mtu_rh74 將 /kni_net.c:704:2 中 ndo_change_mtu 用 ndo_change_mtu_rh74
重新編譯後不再報錯。
5.快速構建
可以使用腳本進行快速構建
dpdk-setup.sh
參考: