2020年5月25日 星期一

[教學] DPDK在Ubuntu虛擬機上編譯方式

大家好啊~~
最近在研究DPDK的套件
想了解這些範例程式跑起來的樣子是什麼
但手邊沒有支援DPDK的實體網卡
後來看到網路上說
可以使用虛擬機模擬出支援的網卡!!!
於是手刀部建虛擬機&編譯環境了

以下是整理過的筆記
以DPDK-18.11.6版本+Ubuntu 16.04.3 with 4.4.0-87-generic+VMware Workstation 15當作範例

撰寫日期:2020.05.20

1. 首先建立好虛擬機並安裝好作業系統

2. 把虛擬機關機,再去設定檔這邊添加2張網卡(mode設NAT即可)

3. 修改.vmx,把你要設定網卡的"virtualDev"的值,設定為"e1000"
(否則網卡會無法給DPDK使用)

4. 開機後去官網下載dpdk的原始碼,並解壓縮出來後,進入該資料夾

5. 使用指令
sudo apt-get install make gcc python libpcap-dev libnuma-dev pkg-config -y
安裝這幾個dpdk編譯會用到的套件
./usertools/dpdk-devbind.py --status
去看網卡類型是否變為
drv=e1000
有的話就成功模擬出支援的網卡囉

6. 環境變數DESTDIR指定程式build出來的位置(名字位置任意,本範例會在dpdk目錄底下的myinstall資料夾內,建立所有範例的binary)
還有DPDK編譯相關的環境變數
export DESTDIR=myinstall
export RTE_SDK=/home/john/dpdk-stable-18.11.6/ export RTE_TARGET=x86_64-native-linuxapp-gcc

7. 執行官方設置腳本,包含載入igb_uio模組以及綁定網卡給DPDK使用
./usertools/dpdk-setup.sh
依序選擇
[15] x86_64-native-linuxapp-gcc(根據作業系統、使用的編譯器決定)
[18] Insert IGB UIO module
[24] Bind Ethernet/Crypto device to IGB UIO module(綁定指定網卡給DPDK)
[21/22] Setup hugepage mappings for (non-)NUMA systems(設定Hugeopage給DPDK使用)

8. 手動編譯範例make test,發現ImportError: No module named pexpect
補上解法
sudo apt-get install python-setuptools
sudo easy_install pip
sudo -E pip install pexpect
9. 因為在虛擬機上面執行程式,虛擬出來的網卡會有一些問題
如圖所示

要去修改library的程式碼解決問題
vim kernel/linux/igb_uio/igb_uio.c : 259
修改完畢後要重新編譯DPDK,並且重新載入igb_uio模組

10. 再去執行範例程式,以Helloworld來說存在於myinstall/share/dpdk/examples/helloworld/build/app底下

我的虛擬機有4顆Core,3張網卡(後兩張有綁給DPDK)
使用sudo ./helloworld執行範例
執行結果如下
-------------------------------------------------------------------------
john@ubuntu:~/dpdk-stable-18.11.6/myinstall/share/dpdk/examples/helloworld/build/app$ sudo ./helloworld
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: PCI device 0000:02:01.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:07.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
hello from core 1
hello from core 2
hello from core 3
hello from core 0
john@ubuntu:~/dpdk-stable-18.11.6/myinstall/share/dpdk/examples/helloworld/build/app$
-------------------------------------------------------------------------

以上!
有問題歡迎留言討論
後續再來寫命令列參數的使用

沒有留言:

張貼留言