天天看點

DPDK系列之二DPDK編譯

一、DPDK下載下傳

前面把環境基本搭好,今天開始編譯DPDK。首先是下載下傳DPDK的源碼,位址是:

https://core.dpdk.org/download/

也可以從官網https://www.dpdk.org/跳過來。然後就可以看到排下載下傳的DPDK的版本:

DPDK系列之二DPDK編譯

這裡下載下傳的是DPDK 19.11.14(LTS),按網上的資料說,DPDK的編譯分為兩種情況,19.11(含)前,使用的是Gcc Make,而此後的新版本,可能是為了某些情況,使用了meson ninja。再次提醒一下,最好把環境需要的相關工具準備好,不然編譯過程被打斷挺麻煩的。

需要的主要工具有:make,gcc(g++,gdb順道一起裝上),python,libnuma-dev

另外,不同的作業系統和不同的DPDK的版本可能需要的相關庫也略有不同,根據實際報告的錯誤安裝即可。

官方的安裝說明及相關文檔位址:

http://core.dpdk.org/doc/archives/

源碼下載下傳比較慢,如果不使用鏡像,有點耐心。

二、源碼編譯

1、源碼解壓

tar -xvf dpdk-19.11.14.tar.xz
           

得到dpdk-stable-19.11.14檔案夾。

2、編譯預選項

使用如下指令進入usertools檔案夾找dpdk-setup.sh在編譯前,執行一下:

第一步:

cd dpdk-stable-19.11.14/usertools
./dpdk-setup.sh
           

會出來以下畫面:

DPDK系列之二DPDK編譯
DPDK系列之二DPDK編譯

說明整個編譯過程需要五個大的步驟,即:選擇編譯環境,設定Linux環境,運作測試程式,其它工具選項和解除安裝清理。

3、編譯

可以選擇65退出也可以CTRL C強行退出:

./dpdk-setup.sh
           

這裡說明一下,從dpdk18開始,就不用提前設定環境變量了,這個在編譯早期版本,設定環境變量的方法,網上有很好,此處不再贅述。

上來就是一個翻車現場:

/bin/sh: 2: cc: not found
cat: /home/fpc/dpdk-stable-19.11.14/x86_64-native-linuxapp-gcc/.config_tmp: No such file or directory
Configuration done using x86_64-native-linuxapp-gcc
/home/fpc/dpdk-stable-19.11.14/mk/rte.vars.mk:56: *** RTE_ARCH is not defined.  Stop.
make[2]: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkroot.mk:99: all] Error 2
make[1]: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkinstall.mk:61: pre_install] Error 2
make: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkroot.mk:77: install] Error 2
------------------------------------------------------------------------------
 RTE_TARGET exported as x86_64-native-linuxapp-gcc
------------------------------------------------------------------------------
           

無語,沒有設定CC編譯器,使用GCC -v檢視,果然沒有安裝,使用下面的指令:

sudo apt install gcc
sudo apt install g++
sudo apt install gdb
           

安裝上相關編譯器,再次招待可以向下進行。

因為是UBUNTU,是以選擇41(x86_64-native-linuxapp-gcc),就會開始編譯,這個第一次編譯可能會需要一段時間,看機器配置,完成會報告沒有錯誤,但會有如下的消息:

Build complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefined
           

這個是指需要把編譯成功的代碼拷貝到指定位置,這個可以不做,是以這裡也沒有給出錯誤,隻是一個提示。如果非要解決可以在mk檔案中修改:

dpdk-setup.sh fails to build with lack of environment variable

Build complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefined

Signed-off-by: Choonho Son <***@gmail.com>
---
usertools/dpdk-setup.sh | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/usertools/dpdk-setup.sh b/usertools/dpdk-setup.sh
index 5eebbce..5248e7a 100755
--- a/usertools/dpdk-setup.sh
+++ b/usertools/dpdk-setup.sh
@@ -65,6 +65,7 @@ setup_target()
{
option=$1
export RTE_TARGET=${TARGETS[option]}
+ export DESTDIR=${DESTDIR:-install}

compiler=${RTE_TARGET##*-}
if [ "$compiler" == "icc" ] ; then
@@ -76,7 +77,7 @@ setup_target()
fi
fi
if [ "$QUIT" == "0" ] ; then
- make install T=${RTE_TARGET}
+ make install T=${RTE_TARGET} DESTDIR=${DESTDIR}
fi
echo "------------------------------------------------------------------------------"
echo " RTE_TARGET exported as $RTE_TARGET"
           

其實就是增加兩個指定的環境變量,位址按需要來定義即可。

指令提示為:“press enter to continue …”,回車進入下一步。

第二步:

指定DPDK加載的子產品,這裡使用48(igb_uio),此處沒有什麼可說的。成功顯示:

unloading any existing DPDK UIO module
loading uio module
loading DPDK UIO module
           

VFIO:最安全的轉發方式,可以添加IOMMU功能

IGB_UIO:候補模式,都安裝不上的時候的備選

KNI:Linux系統核心自帶的方式

第三步:

設定大頁記憶體,這裡選項52(Setup hugepage mapping for NUMA systems)

NUMA,這個是用來支援多CPU效率的。大頁設定可以是64,256,這裡第一次使用了64,但是在後面測試時有錯誤,配置設定不了記憶體,不知道是不是這個原因,但後來改成了256,就沒問題了:

Removing currently reserved hugepages
Unmounting /mnt/huge and removing directory

  Input the number of 2048kB hugepages for each node
  Example: to have 128MB of hugepages available per node in a 2MB huge page system,
  enter '64' to reserve 64 * 2MB pages on each node
Number of pages for node0: 64
Reserving hugepages
Creating /mnt/huge and mounting as hugetlbfs
           

第四步:

綁定網卡,回車後可以輸入53,先檢視一下目前網卡的情況,結果報:

/usr/bin/env: ‘python’: No such file or directory

軟連結:ln -s /usr/bin/python3 /usr/bin/python

           

已經安裝了Python,但是沒有做軟連結名字改成Python,是以輸入:

sudo ln -s /usr/bin/python3  /usr/bin/python
           

再次執行:

Network devices using kernel driver
===================================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens38 drv=e1000 unused=igb_uio,vfio-pci *Active*
0000:03:00.0 'VMXNET3 Ethernet Controller 07b0' if=ens160 drv=vmxnet3 unused=igb_uio,vfio-pci *Active*
           

如果是挂在的IGB_UIO子產品,就使用54來綁定網卡

如果是 VFIO子產品,使用55來綁定網卡

這裡有一個問題,看上面,兩個網卡都是Active,在綁定時,會報綁定無效。即:

Enter PCI address of device to bind to IGB UIO driver: 03:00.0
Warning: routing table indicates that interface 0000:03:00.0 is active. Not modifying
OK
           

是以得先用ifdown指令處理一下:

sudo ifdown ens160
           

然後可以用ifconfig -a 指令看一下結果。

然後再按54,請輸入53時網卡的ID,可以不輸入前面的0000,隻輸入03:00.0即可。如果重複執行,會報已經綁定的提示。

第五步:

開始測試一下前面的配置是否成功,輸入58,在前面提到了大記憶體時輸入64,報下面的錯誤:

Enter hex bitmask of cores to execute testpmd app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0xff
Launching app
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:03:00.0 on NUMA socket -1
EAL:   probe driver: 15ad:7b0 net_vmxnet3
Interactive-mode selected
Failed to set MTU to 1500 for port 0
testpmd: create a new mbuf pool <mbuf_pool_socket_0>: n=203456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
EAL: Error - exiting with code: 1
Cause: Creation of mbuf pool for socket 0 failed: Cannot allocate memory

Press enter to continue ...
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
           

有提示,0~7輸入0xff,依次算就可以,如果是四個則是0xf.

重新輸入52,輸入256,再依次下來到58,即報成功:

Enter hex bitmask of cores to execute testpmd app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0xff
Launching app
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:03:00.0 on NUMA socket -1
EAL:   probe driver: 15ad:7b0 net_vmxnet3
Interactive-mode selected
Failed to set MTU to 1500 for port 0
testpmd: create a new mbuf pool <mbuf_pool_socket_0>: n=203456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc

Warning! port-topology=paired and odd forward ports number, the last port will pair with itself.

Configuring Port 0 (socket 0)
Port 0: 00:0C:29:98:E3:76
Checking link statuses...
Done
           

這裡仍然有一個小問題,就是設定MTU,但這個似乎沒影響測試,此處再回車,會出一些配置的資訊,這裡就沒貼出來了。下面簡單說明一下測試指令testpmd的用法:

testpmd> start :開始轉發

testpmd> stop :停止轉發,結束時會顯示轉發的彙總(收、發、drop)

testpmd> quit :退出testpmd示例

testpmd> show config fwd:顯示目前的配置(端口、核心、流)

testpmd> show port stats all :展示所有端口的收發包資訊

           

這樣,基本DPDK就安裝完成了。

三、總結

基本環境搭建和編譯是學習所有工具或者軟體的一個麻煩之處,并不在于多難,一個是大家都明白的網絡的問題,另外一個是一些小細節不同的版本和OS以及不同的機器都可能出一些莫名其妙的問題。這就需要自己去看着錯誤消息去思考和在網上查找了。比如前面第一個錯誤就報CC問題,應該一下就明白沒有編譯器。

學過JAVA的朋友可能深有體會,是以學習時這個攔路虎很膩歪,弄不好就成為放棄的理由,希望還是要堅持下去。畢竟如今不同以往,網上各種資訊還是相當多的。

繼續閱讀