注意,本文的示例是基於Linux x86_64環境。如果你的環境不一樣,應當將文中的x86_64-native-linuxapp-gcc 換成實際的值。
例如,32位linux環境,則換成i686-native-linuxapp-gcc
DPDK環境變量
編譯DPDK自帶的應用程序,總是需要用到兩個環境變量。
可以在 ~/.bash_profile中追加如下兩行內容。
這樣以後每次登陸,就會自動設置好。
export RTE_SDK=/opt/dpdk-2.2.0
export RTE_TARGET=x86_64-native-linuxapp-gcc
DPDK編譯安裝
dpdk的編譯腳本很複雜。
以個人經驗,最好通過如下一條命令完成。
那就是cd到dpdk源碼目錄,然後執行
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/local
dpdk運行前的配置
dpdk應用程序運行前,需要通過一序列命令準備運行環境。可以將相關命令寫到 ~/run_dpdk_prepair.sh 中,以方便運行。
run_dpdk_prepair.sh示例內容如下。
[root@localhost dpdk-2.2.0]# cat ~/run_dpdk_prepair.sh
#!/bin/sh
bind_nic(){
ifconfig $1 down
${RTE_SDK}/tools/dpdk_nic_bind.py --bind=igb_uio $1
}
modprobe uio
insmod ${RTE_SDK}/${RTE_TARGET}/kmod/igb_uio.ko
echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
if [ ! -d /mnt/huge_page_fs ]; then
mkdir /mnt/huge_page_fs
fi
mount -t hugetlbfs none /mnt/huge_page_fs
bind_nic eth1
bind_nic eth2
注意:dpdk程序中,端口的編號(即portid)從0開始。
portid與物理口的對應關係爲:物理口按pci總線地址排序,地址越小,portid就越小。
項目makefile的修改 使用dpdk庫的項目,無須將makefile修改爲dpdk自帶的應用程序的makefile風格,可以繼續使用項目自己的makefile。
但是,需要對項目的makefile做出如下修改。
編譯選項,增加如下內容。
-march=native -DRTE_CACHE_LINE_SIZE=64\
-I/usr/local/include/dpdk/ -include rte_config.h
鏈接選項,增加如下內容。
-L/usr/local/lib -Wl,--whole-archive \
-lrte_distributor -lrte_reorder -lrte_pipeline -lrte_table -lrte_port \
-lrte_timer -lrte_hash -lrte_jobstats -lrte_lpm -lrte_power \
-lrte_acl -lrte_meter -lrte_sched -lm -lrt -lrte_vhost \
-Wl,--start-group -lrte_kvargs -lrte_mbuf -lrte_mbuf_offload -lrte_ip_frag \
-lethdev -lrte_cryptodev -lrte_mempool -lrte_ring -lrte_eal \
-lrte_cmdline -lrte_cfgfile -lrte_pmd_bond -lrte_pmd_vmxnet3_uio \
-lrte_pmd_virtio -lrte_pmd_cxgbe -lrte_pmd_enic -lrte_pmd_i40e \
-lrte_pmd_fm10k -lrte_pmd_ixgbe -lrte_pmd_e1000 \
-lrte_pmd_ring -lrte_pmd_af_packet -lrte_pmd_null -lrt -lm -ldl \
-Wl,--end-group -Wl,--no-whole-archive
升級Linux內核
對於高於dpdk-2.2.0的dpdk版本,使用2.6.32及更低版本的Linux內核可能是不行的。故障現象是,無法綁定網卡到igb_uio驅動。
實際測試發現,2.6.38及以上的內核是可以的。
注意,升級內核後,需要重新編譯dpdk。因爲igb_uio的編譯是依賴於內核的。
內核升級的方法可以參考:http://blog.csdn.net/crazycoder8848/article/details/44131735
VMware虛擬機相關
1. 虛擬機網卡類型不是dpdk支持的類型
例如,在32位centos 6.5中,通過ethtool -i eth3查看網卡類型,發現driver是pcnet32。
那就需要修改虛擬機配置文件,文件名爲 虛擬機名稱.vmx。例如,共有4塊網卡,都想換成dpdk支持的e1000類型。
那就增加如下內容即可。
ethernet0.virtualDev = "e1000"
ethernet1.virtualDev = "e1000"
ethernet2.virtualDev = "e1000"
ethernet3.virtualDev = "e1000"
注意,這是個獨立問題,和前一問題沒有聯繫。
修改lib/librte_eal/linuxapp/igb_uio/igb_uio.c中igbuio_pci_probe函數(如果是dpdk-2.2.0的話,就是第509行)的一條if語句的判斷條件,一共就一行代碼。
case RTE_INTR_MODE_LEGACY:
if (pci_intx_mask_supported(dev)) {
dev_dbg(&dev->dev, "using INTX");
udev->info.irq_flags = IRQF_SHARED;
udev->info.irq = dev->irq;
udev->mode = RTE_INTR_MODE_LEGACY;
break;
}
修改爲
case RTE_INTR_MODE_LEGACY:
if (pci_intx_mask_supported(dev) || !pci_intx_mask_supported(dev) ) {
dev_dbg(&dev->dev, "using INTX");
udev->info.irq_flags = IRQF_SHARED;
udev->info.irq = dev->irq;
udev->mode = RTE_INTR_MODE_LEGACY;
break;
}