Deploying Intel DPDK in Oracle VirtualBox

August 22, 2014
Deploying Intel DPDK in Oracle VirtualBox

In this article we are going to investigate Intel DPDK bring up in Oracle VirtualBox, namely:

  • Configuring a virtual machine in Oracle VirtualBox to allow running Intel DPDK applications.
  • Compiling and configuring Intel DPDK in the virtual machine.
  • Compiling and running a simple Intel DPDK application in the virtual machine.

There are a number of reasons why someone might want to use Intel DPDK libraries set. Generally, it all comes down to the fact that networking has always been striving for fast packet processing, and of course for using minimum CPU resources. For more details, visit or Intel website.

Actually, only a limited number of NIC models of are supported by Intel DPDK, and they are quite expensive. Generally, it’s useful to have a possibility to develop and run Intel DPDK applications without a physical NIC. Running Intel DPDK in Oracle VirtualBox virtual machine allows anyone to play with DPDK, and to start developing DPDK applications even without having a network adapter supported by it.

Configuring a virtual machine in Oracle VirtualBox

First of all, create a new virtual machine in Oracle VirtualBox and install Linux on it (we used Ubuntu 12.04 and 14.04). Further, configure the virtual machine as follows:

1. Add two more virtual network adapters with “Intel PRO/1000 MT Server (82545EM)” type in order to provide virtual network hardware to the virtual machine that is supported by Intel DPDK.

2. Attach the newly created virtual network adapters to the physical NIC of the host OS as “Bridged Adapter”.

3. Add one more logical CPU core for the virtual machine. You can use it later for separating tx and rx packet processing.

4. Enable hardware virtualization in BIOS.

5. Enable CPU flags (SSE 4.1 / SSE 4.2) in VirtualBox virtual machine. To provide SSE 4.1 / SSE 4.2 support to guest OS, the host CPU has to support these instruction sets. Starting with Oracle VirtualBox 4.3.8, it is possible to enable these instructions for certain guest OSes using the following commands:

                            $ VBoxManage setextradata "VM name" VBoxInternal/CPUM/SSE4.1 1
$ VBoxManage setextradata "VM name" VBoxInternal/CPUM/SSE4.2 1                        

Note: These are per-VM settings and they are turned off by default.

Download and unpack Intel DPDK

You can execute these commands from console in order to download and unpack Intel DPDK:

$ tar -xzvf dpdk-1.6.0r2.tar.gz
$ cd dpdk-1.6.0r2/                        

Build and configure Intel DPDK script, located in the “tools” subdirectory, allows the user to build and configure Intel DPDK.

Note: script is to be run with root privileges.

Compiling Intel DPDK binaries: Possible issues

If during compilation you observe errors related to SSE flags (for example “SSE 4.2 instruction is not enabled”), try adding TOOLCHAIN_CFLAGS option for make tool. For example, edit script as follows:

make TOOLCHAIN_CFLAGS=”-msse4.2 -mpopcnt” install T=${RTE_TARGET}

Note: To avoid L3 hash-related compilation error, do not use kernel version higher than and lower than 3.14.X.X (for example, No such issues are observed on kernel and 3.14.X.X.

Use case for quick start setup script

The following example shows how to use the script.

Before executing the script, shut down interfaces which you are going to use by Intel DPDK.

                            $ ifconfig
eth1 Link encap:Ethernet HWaddr 08:00:27:c5:d3:68
inet addr: Bcast: Mask:
inet6 addr: fe80::a00:27ff:fec5:d368/64 Scope:Link
eth2 Link encap:Ethernet HWaddr 08:00:27:5d:86:7b
inet addr: Bcast: Mask:
inet6 addr: fe80::a00:27ff:fe5d:867b/64 Scope:Link
$ sudo ifconfig eth1 down
$ sudo ifconfig eth2 down                        

Run the script to build and configure Intel DPDK.

                            $ sudo ./tools/
RTE_SDK exported as /home/user/projects/dpdk-1.6.0r2
Step 1: Select the Intel DPDK environment to build
[1] i686-default-linuxapp-gcc
[2] i686-default-linuxapp-icc
[3] x86_64-default-bsdapp-gcc
[4] x86_64-default-linuxapp-gcc
[5] x86_64-default-linuxapp-icc
[6] x86_64-ivshmem-linuxapp-gcc
[7] x86_64-ivshmem-linuxapp-icc
Step 2: Setup linuxapp environment
[8] Insert IGB UIO module
[9] Insert KNI module
[10] Setup hugepage mappings for non-NUMA systems
[11] Setup hugepage mappings for NUMA systems
[12] Display current Ethernet device settings
[13] Bind Ethernet device to IGB UIO module
Step 3: Run test application for linuxapp environment
[14] Run test application ($RTE_TARGET/app/test)
[15] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
Step 4: Other tools
[16] List hugepage info from /proc/meminfo
Step 5: Uninstall and system cleanup
[17] Uninstall all targets
[18] Unbind NICs from IGB UIO driver
[19] Remove IGB UIO module
[20] Remove KNI module
[21] Remove hugepage mappings
[22] Exit Script

The following option illustrates the creation of the x86_64-default-linuxapp-gcc Intel DPDK library.

                               Option: 4

   ================== Installing x86_64-default-linuxapp-gcc
   Build complete
   RTE_TARGET exported as x86_64-default-linuxapp-gcc

   Press enter to continue ...

This option demonstrates how to load Intel DPDK UIO kernel module.

                               Option: 8

   Unloading any existing Intel DPDK UIO module
   Loading uio module
   Loading Intel DPDK UIO module

   Press enter to continue ...                        

This option demonstrates how to setup hugepage mapping.

                               Option: 10

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

    Input the number of 2MB pages
    Example: to have 128MB of hugepages available, enter '64' to
    reserve 64 * 2MB pages
   Number of pages: 64
   Reserving hugepages
   Creating /mnt/huge and mounting as hugetlbfs

   Press enter to continue ...                        

The following option illustrates binding Ethernet device to IGB UIO kernel module.

                               Option: 13

   Network devices using IGB_UIO driver

   Network devices using kernel driver
   0000:00:03.0 '82540EM Gigabit Ethernet Controller' if=eth0 drv=e1000 unused=igb_uio *Active*
   0000:00:08.0 '82545EM Gigabit Ethernet Controller (Copper)' if=eth1 drv=e1000 unused=igb_uio 
   0000:00:09.0 '82545EM Gigabit Ethernet Controller (Copper)' if=eth2 drv=e1000 unused=igb_uio 

   Other network devices

   Enter PCI address of device to bind to IGB UIO driver: eth1 eth2

   Press enter to continue ...                        

Compiling and running sample applications

When compiling an application in the Linux environment, the following variables must be exported:

  • RTE_SDK – points to the Intel DPDK installation directory.
  • RTE_TARGET – points to the Intel DPDK target environment directory.

Here is an example of compiling and running a simple “helloworld” application.

                               $ cd examples/helloworld
   $ export RTE_SDK=/home/user/projects/dpdk-1.6.0r2
   $ export RTE_TARGET=x86_64-default-linuxapp-gcc
   $ make
    CC main.o
    LD helloworld
    INSTALL-APP helloworld
   $ sudo ./build/helloworld -c 0x03 -n 1                        

Finally the environment is ready, and you can go into deep network development using Intel DPDK. What’s nice is that you can run your VM on various host machines without any major issues.

Volodymyr Samotiy
Latest posts by Volodymyr Samotiy (see all)