需要安装 Virtual Box 和 Vagrant。
$ sudo apt-get install virtualbox
$ sudo apt-get install https://releases.hashicorp.com/vagrant/2.1.2/vagrant_2.1.2_x86_64.deb
如果是使用Vagrant2.1.2版本那么要求VirtualBox的版本要小于等于5.2,否则无法正常使用。
如果要安装VirtualBox5.2版本,在Ubuntu18.04上可以正常安装,在Ubuntu20.04上需要额外安装libvpx5(>=1.6)、python2.7以及python。
如果是vagrant版本为2.2.19版本,那么VirtualBox版本可以为6.1
$ mkdir vpp-tutorial
$ cd vpp-tutorial
创建一个名为Vagrantfile的文件,其内容如下:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.box_check_update = false
vmcpu=(ENV['VPP_VAGRANT_VMCPU'] || 2)
vmram=(ENV['VPP_VAGRANT_VMRAM'] || 4096)
config.ssh.forward_agent = true
config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--ioapic", "on"]
vb.memory = "#{vmram}"
vb.cpus = "#{vmcpu}"
#support for the SSE4.x instruction is required in some versions of VB.
vb.customize ["setextradata", :id, "VBoxInternal/CPUM/SSE4.1", "1"]
vb.customize ["setextradata", :id, "VBoxInternal/CPUM/SSE4.2", "1"]
end
end
VPP 在用户空间中运行。在生产环境中,您通常会使用 DPDK 运行它以连接到真实的 NIC 或使用 vhost 来连接到 VM。m在这些情况下,您通常运行 VPP 的单个实例。
就本教程而言,运行多个 vpp 实例并将它们相互连接以形成拓扑将非常有用。幸运的是,VPP 支持这一点。
当运行多个 VPP 实例时,每个实例都需要指定一个“名称”或“前缀”。在下面的示例中,“名称”或“前缀”是“vpp1”。请注意,只有一个实例可以使用 dpdk 插件,因为该插件正在尝试获取文件锁定。
默认vagrant up的时候,vagrant检测到本地没有box的话,会自动去官网下载,
但是下载太慢了,可以自己把链接复制到谷歌浏览器下载,或者用其他下载软件下载:(科学上网下载会快很多)
https://vagrantcloud.com/puppetlabs/boxes/ubuntu-16.04-64-nocm/versions/1.0.0/providers/virtualbox.box
https://app.vagrantup.com/generic/boxes/ubuntu1804/versions/3.1.8/providers/virtualbox.box
如果是通过自己去下载的box才需要执行这步
$ vagrant box add bento/ubuntu-18.04 virtualbox.box
注意:添加box的命令中最后的 ‘virtualbox.box’ 必须是上个步骤5下载下来的box实际的文件名
设置 Vagrant 后,在 Vagrant 目录上使用以下命令启动 VM:
$ vagrant up
$ vagrant ssh
$ sudo bash
# apt-get update
# reboot -n
$ # Wait for the VM to reboot
$ vagrant ssh
现在 VM 已更新,我们将安装 VPP 包。
有关安装 VPP 的更多信息,请参阅下载和安装 VPP。
我们将通过修改文件 /etc/apt/sources.list.d/99fd.io.list来安装 VPP 。
我们用以下内容编写这个文件:
$ sudo bash
# echo "deb [trusted=yes] https://packagecloud.io/fdio/release/ubuntu bionic main" > /etc/apt/sources.list.d/99fd.io.list
拿到钥匙。
# curl -L https://packagecloud.io/fdio/release/gpgkey | sudo apt-key add -
然后执行以下命令。
# apt-get update
# apt-get install vpp vpp-plugin-core vpp-plugin-dpdk
若出现依赖问题,需要下载:
libmbedcrypto1_2.8.0-1_amd64.deb
libmbedtls10_2.8.0-1_amd64.deb
libmbedx509-0_2.8.0-1_amd64.deb
停止本教程的 VPP。我们将创建自己的 VPP 实例。
# service vpp stop
我们将创建一些启动文件供本教程使用。通常,将修改 /etc/vpp/startup.conf 中的 startup.conf 文件。有关此文件的更多信息,请参阅配置参考。
当运行多个 VPP 实例时,每个实例都需要指定一个“名称”或“前缀”。在下面的示例中,“名称”或“前缀”是“vpp1”。请注意,只有一个实例可以使用 dpdk 插件,因为该插件正在尝试获取文件锁定。我们创建的这些启动文件将禁用 dpdk 插件。
同样在我们的启动文件中注意api-segment。api-segment {prefix vpp1} 告诉 FD.io VPP 如何以不同于默认的方式为您的 VPP 实例命名 /dev/shm/ 中的文件。**unix {cli-listen /run/vpp/cli-vpp1.sock}**告诉 vpp 在被 vppctl 寻址时使用非默认套接字文件。
现在创建两个名为 startup1.conf 和 startup2.conf 的文件,其内容如下。这些文件可以位于任何地方。我们在启动 VPP 时指定位置。
startup1.conf:
unix {cli-listen /run/vpp/cli-vpp1.sock}
api-segment { prefix vpp1 }
plugins { plugin dpdk_plugin.so { disable } }
startup2.conf:
unix {cli-listen /run/vpp/cli-vpp2.sock}
api-segment { prefix vpp2 }
plugins { plugin dpdk_plugin.so { disable } }
使用我们刚刚创建的文件,我们现在将启动并运行 VPP。
VPP 在用户空间中运行。在生产环境中,通常会使用 DPDK 运行它以连接到真实的 NIC 或使用 vhost 来连接到 VM。在这些情况下,通常会运行一个 VPP 实例。
就本教程而言,运行多个 VPP 实例并将它们相互连接以形成拓扑将非常有用。幸运的是,VPP 支持这一点。
使用我们在设置中创建的文件,我们将启动 VPP。
$ sudo /usr/bin/vpp -c startup1.conf
vlib_plugin_early_init:361: plugin path /usr/lib/vpp_plugins:/usr/lib/vpp_plugins
load_one_plugin:189: Loaded plugin: abf_plugin.so (ACL based Forwarding)
load_one_plugin:189: Loaded plugin: acl_plugin.so (Access Control Lists)
load_one_plugin:189: Loaded plugin: avf_plugin.so (Intel Adaptive Virtual Function (AVF) Device Plugin)
.........
$
如果 VPP 没有启动,您可以尝试将nodaemon添加到 unix部分的 startup.conf 文件中。这应该在输出中提供更多信息。
带有 nodaemon 的 startup.conf 示例:
unix {nodaemon cli-listen /run/vpp/cli-vpp1.sock}
api-segment { prefix vpp1 }
plugins { plugin dpdk_plugin.so { disable } }
命令vppctl将启动一个 VPP shell,您可以使用它以交互方式运行 VPP 命令。
我们现在应该能够执行 VPP shell 并显示版本。
$ sudo vppctl -s /run/vpp/cli-vpp1.sock
_______ _ _ _____ ___
__/ __/ _ \ (_)__ | | / / _ \/ _ \
_/ _// // / / / _ \ | |/ / ___/ ___/
/_/ /____(_)_/\___/ |___/_/ /_/
vpp# show version
vpp v21.10.1-release built by root on 4f6ead0c141f at 2021-11-17T14:25:30
vpp#
使用 ctrl-d 或 q 退出 VPP shell。
如果您要以这种方式运行多个 VPP 实例,请务必在完成后将其杀死。
$ ps -eaf | grep vpp
root 2067 1 2 05:12 ? 00:00:00 /usr/bin/vpp -c startup1.conf
vagrant 2070 903 0 05:12 pts/0 00:00:00 grep --color=auto vpp
$ kill -9 2067
$ ps -eaf | grep vpp
vagrant 2074 903 0 05:13 pts/0 00:00:00 grep --color=auto vpp
sudo apt-get remove --purge "vpp*"