centos7.4+vmware12安装dpdk环境

centos7.4+vmware12安装dpdk环境

编译dpdk

cd /home/ych/
wget https://fast.dpdk.org/rel/dpdk-18.05.1.tar.xz
tar -xvf dpdk-18.05.1.tar.xz

export DPDK_DIR=/home/ych/dpdk-stable-18.05.1
export DPDK_TARGET=x86_64-native-linuxapp-gcc
export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
export RTE_SDK=/home/ych/dpdk-stable-18.05.1
cd $DPDK_DIR
sudo rm -rf x86_64-native-linuxapp-gcc install
sudo make -j30 install T=$DPDK_TARGET DESTDIR=install

绑定网口到dpdk驱动

  1. 使用vfio驱动绑定网口
#for vfio
sudo modprobe vfio-pci
sudo /usr/bin/chmod a+x /dev/vfio
sudo /usr/bin/chmod 0666 /dev/vfio/*
sudo ifconfig ens38 down
sudo $DPDK_DIR/usertools/dpdk-devbind.py --bind=vfio-pci ens38
sudo $DPDK_DIR/usertools/dpdk-devbind.py --status
sudo mount -t hugetlbfs none /dev/huge
  1. 使用uio驱动绑定网口
#for igb_uio
sudo modprobe uio
sudo insmod $DPDK_DIR/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko

sudo ifconfig ens38 down
sudo $DPDK_DIR/usertools/dpdk-devbind.py --bind=igb_uio ens38
sudo $DPDK_DIR/usertools/dpdk-devbind.py --status
sudo mount -t hugetlbfs none /dev/huge

这里的网口名ens38是在vmware配置的虚拟网口,内核驱动是e1000,dpdk驱动对支持的硬件是有要求的,具体可以查看dpdk官网 dpdk支持的硬件类型

$ethtool -i ens38
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version: 
expansion-rom-version: 
bus-info: 0000:02:06.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

修改dpdk源码,才能支持虚拟机的虚拟网卡

执行test程序时输出:

EAL: Error reading from file descriptor 23: Input/output error

原因:在虚拟机添加的网卡,dpdk不支持导致的。需要修改一行代码,跳过dpdk pci 检查修改代码行
lib/librte_eal/linuxapp/igb_uio/igb_uio.c

找到
	case RTE_INTR_MODE_LEGACY:
		if (pci_intx_mask_supported(udev->pdev)) {
			dev_dbg(&udev->pdev->dev, "using INTX");
			udev->info.irq_flags = IRQF_SHARED | IRQF_NO_THREAD;
			udev->info.irq = udev->pdev->irq;
			udev->mode = RTE_INTR_MODE_LEGACY;
			break;
		}
		dev_notice(&udev->pdev->dev, "PCI INTX mask not supported\n");


这行代码,然后修改为
	case RTE_INTR_MODE_LEGACY:
//		if (pci_intx_mask_supported(udev->pdev)) {
			dev_dbg(&udev->pdev->dev, "using INTX");
			udev->info.irq_flags = IRQF_SHARED | IRQF_NO_THREAD;
			udev->info.irq = udev->pdev->irq;
			udev->mode = RTE_INTR_MODE_LEGACY;
			break;
//		}
//		dev_notice(&udev->pdev->dev, "PCI INTX mask not supported\n");

重新编译后
rmmod igb_uio

然后再
insmod igb_uio

运行dpdk的测试例子

cd $DPDK_DIR/examples/l2fwd
make
sudo $DPDK_DIR/examples/l2fwd/build/l2fwd -l 0-1 -w 01:00.0 – -p 0x1

你可能感兴趣的:(dpdk)