PiOVS: Raspberry Pi Open vSwitch
Learning introductory SDN concept with Mininet is mostly enough. But sometimes it is nice to have a mobile, small-scale SDN lab for showcase and live demo sessions in the class. Below you'll find a short guide to 'convert' a raspberry pi (RPI2) to a 4-port OpenFlow Open vSwitch. For this purpose, you'll need 4x USB-to-RJ45 adapter.
Install Ubuntu Xenial & Preparation
# Flash
$ flash -d /dev/mmcblk0 ubuntu-16.04.3-preinstalled-server-armhf+raspi2.img
# Configure some params
$ cd /media/em/cloudimg-rootfs/
/media/em/cloudimg-rootfs$ sudo nano etc/hostname
/media/em/cloudimg-rootfs$ sudo nano etc/hosts
/media/em/cloudimg-rootfs$ sudo nano etc/network/interfaces
# Boot & SSH
$ sudo apt update
$ sudo shutdown -r now
$ sudo apt upgrade
$ nano .profile
# add these lines
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
export LANG="en_US.UTF-8"
export LANGUAGE="en_US.UTF-8"
$ source .profile
$ sudo dpkg-reconfigure locales
# Check
ubuntu@pi:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial
$ cat /proc/version
Linux version 4.4.0-1065-raspi2 (buildd@bos01-arm64-049) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) ) #73-Ubuntu SMP Thu Jul 20 22:09:48 UTC 2017
Install OVS
ubuntu@pi:~$ sudo apt install openvswitch-
openvswitch-common openvswitch-pki openvswitch-testcontroller
openvswitch-dbg openvswitch-switch openvswitch-vtep
openvswitch-ipsec openvswitch-test
ubuntu@pi:~$ sudo apt install openvswitch-switch openvswitch-common bridge-utils
ubuntu@pi:~$ sudo ovs-vsctl show
5f1756f0-f52f-48b9-af97-52d6c5ed2328
ovs_version: "2.5.2"
ubuntu@pi:~$ sudo ovs-vsctl add-br ovsbr0
ubuntu@pi:~$ sudo ifconfig ovsbr0 up
ubuntu@pi:~$ ifconfig
ubuntu@pi:~$ sudo ovs-vsctl add-port ovsbr0 eth1
ubuntu@pi:~$ sudo ovs-vsctl add-port ovsbr0 eth2
ubuntu@pi:~$ sudo ovs-vsctl add-port ovsbr0 eth3
ubuntu@pi:~$ sudo ovs-vsctl add-port ovsbr0 eth4
ubuntu@pi:~$ sudo ovs-vsctl show
Configure Interfaces
ubuntu@pi:~$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# Source interfaces
# Please check /etc/network/interfaces.d before changing this file
# as interfaces may have been defined in /etc/network/interfaces.d
# See LP: #1262951
# source /etc/network/interfaces.d/*.cfg
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.159
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
dns-nameservers 8.8.8.8 8.8.4.4
auto eth1
iface eth1 inet manual
hwaddress ether 00:20:34:60:75:ba
auto eth2
iface eth2 inet manual
hwaddress ether 00:15:a3:34:28:2c
auto eth3
iface eth3 inet manual
hwaddress ether 58:65:e6:eb:f0:c5
auto eth4
iface eth4 inet manual
hwaddress ether 00:0b:7b:cf:d4:3c
auto ovsbr0
allow-ovs ovsbr0
iface ovsbr0 inet manual
ovs_type OVSBridge
Patch OVS Systemd Service
ubuntu@pi:~$ sudo rm /lib/systemd/system/openvswitch-nonetwork.service && sudo nano /lib/systemd/system/openvswitch-nonetwork.service
# Copy from here -> https://www.opencloudblog.com/?p=240
ubuntu@pi:~$ sudo shutdown -r now
Try with POX Controller
ubuntu@pi:~$ git clone https://github.com/noxrepo/pox.git
ubuntu@pi:~$ cd pox
ubuntu@pi:~/pox$ ./pox.py forwarding.l2_learning &
ubuntu@pi:~$ sudo ovs-vsctl set-controller ovsbr0 tcp:localhost:6633
test