<-- Home

Vagrant与DPDK开发环境

实验室的那台电脑我远程控制太卡了,但我实在不想去实验室(太远了,_(:з」∠)_ ),于是想着在自己笔记本电脑上搭一个DPDK的开发环境。因为种种原因,不能装Win10和Ubuntu双系统,只能用虚拟机了。

这里安利一下Vagrant 一个简单好用的虚拟化开发环境。

关于Vagrant的使用很简单,网上也有很多教程。只要安装好Virtual Box,选好Vagrant的box,写好Vagrantfile(很多时候不用写),然后几条简单的命令就可以使用啦。在Windows下编写代码,在虚拟机中编译运行!

然后因为DPDK开发的要求比较特殊,需要有支持DPDK的网卡才能测试程序,于是我需要改写Vagrantfile。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "xenial"

  # 先设置好Vagrant初始化后运行的脚本
  config.vm.provision :shell, privileged: false, :path => "provision.sh"

  # 创建一个专用网络,只允许主机访问机器
  # 使用特定的ip
  # 这个选项不设定的话Intel DPDK会接管整个网络适配器
  config.vm.network "private_network", ip: "10.0.0.10"

  # VirtualBox虚拟机配置
  config.vm.provider "virtualbox" do |vb|
      # VM名称
      vb.name = "ubuntu-16.04-dpdk"
      # 先分2GB内存
      vb.memory = 2048
      # 2个核心
      vb.cpus = 2

      # 让VirtualBox支持SSE 4.1 and SSE 4.2指令集
      # 参考 https://www.virtualbox.org/manual/ch09.html#sse412passthrough
      # 没有这些指令集DPDK无法构建
      # 可以用cat /proc/cpuinfo查看CPU flags中是否有sse4_1和sse4_2
      vb.customize ["setextradata", :id, "VBoxInternal/CPUM/SSE4.1", "1"]
      vb.customize ["setextradata", :id, "VBoxInternal/CPUM/SSE4.2", "1"]
  end

end

然后在同一目录下创建Vagrant初始化虚拟机后执行的脚本,主要是为了换国内源、更新、安装一些必要的工具和库。

# 自己写sources.list文件替换掉原来的
sudo cp /vagrant/sources.list /etc/apt/sources.list
sudo apt-get update
sudo apt-get upgrade -y -q
sudo apt-get -y -q install git clang doxygen hugepages build-essential linux-headers-`uname -r`

接着一个vagrant up命令,Vagrant就会帮你配置好虚拟机啦。

接着ssh登陆到虚拟机,可以查看相应配置。使用ifconfigcat /proc/cpuinfo查看网卡和cpuflag都没问题,就可以开始编译DPDK啦。

默认用户名和密码都是vagrant,可以在users\.vagrant\boxes文件夹里面查找默认的Vagrantfile配置看看有没有改动。

获取DPDK,运行自带脚本来编译

git clone http://dpdk.org/git/dpdk
cd dpdk
sudo ./tools/dpdk-setup.sh

如果想在Virtual Box的共享文件夹下编译DPDK,需要以管理员权限运行vagrant upvagrant reload,因为VirtualBox安全权限的问题,这样很有可能编译失败。目前没有找到解决方法。

接下来是配置DPDK的运行环境,还是用dpdk-setup.sh,要做的是插入IGB UIO module、设置巨页内存、绑定网卡虚拟设备。

为了运行脚本更方便,我把RTE_SDK和RTE_TARGET路径直接写入到/etc/environment中。
如果网卡处于active状态,不能绑定,需要先用ifconfig 设备名 down命令停用该网卡。

接下来是运行测试例子helloworld

ubuntu@ubuntu-xenial:~/dpdk$ sudo ./examples/helloworld/build/helloworld -c3
EAL: Detected 2 lcore(s)
EAL: Probing VFIO support...
EAL: PCI device 0000:00:03.0 on NUMA socket -1
EAL:   probe driver: 8086:100e net_e1000_em
EAL: PCI device 0000:00:08.0 on NUMA socket -1
EAL:   probe driver: 8086:100e net_e1000_em
hello from core 1
hello from core 0

我们收到了2个cpu core的回复,测试成功。