Open vSwitch on VirtualBox
Here is a quick tutorial for installing Open vSwitch on VirtualBox. VirtualBox is an open source virtualization project from Oracle. It is supported on Windows, Mac, BSD and Linux to name a few. It has a nice GUI for VM management out of the box. Open vSwitch is an open source vSwitch from Martin Casado, Ben Pfaff and a whole crew of awesome. If you are here, OVS probably doesn’t require anymore explanation, learn it, love it.
Install VirtualBox
Install VirtualBox from the VirtualBox repository.
1 2 3 4 5 6 7 8 |
Add the following repo to /etc/apt/sources.list deb http://download.virtualbox.org/virtualbox/debian precise contrib wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add - sudo apt-get update sudo apt-get install dkms sudo apt-get install virtualbox-4.2 |
Install Open vSwitch from repo
Install Open vSwitch from Package. This is easiest for those not familiar with compiling from source or just need basic functionality rather than the latest features.
1 2 3 4 5 |
sudo apt-get install openvswitch-datapath-source bridge-utils sudo module-assistant auto-install openvswitch-datapath sudo apt-get install openvswitch-brcompat openvswitch-common openvswitch-controller |
Open vSwitch Install from Source
Install dependencies and install from source on Ubuntu Linux.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
apt-get install -y git python-simplejson python-qt4 python-twisted-conch automake autoconf gcc uml-utilities libtool build-essential git pkg-config linux-headers-`uname -r` git clone git://openvswitch.org/openvswitch cd openvswitch ./boot.sh ./configure --with-linux=/lib/modules/`uname -r`/build make && make install ./boot.sh ./configure --with-linux=/lib/modules/`uname -r`/build make && make install insmod datapath/linux/openvswitch.ko touch /usr/local/etc/ovs-vswitchd.conf mkdir -p /usr/local/etc/openvswitch ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema ovsdb-server /usr/local/etc/openvswitch/conf.db \ --remote=punix:/usr/local/var/run/openvswitch/db.sock \ --remote=db:Open_vSwitch,manager_options \ --private-key=db:SSL,private_key \ --certificate=db:SSL,certificate \ --bootstrap-ca-cert=db:SSL,ca_cert --pidfile --detach --log-file ovs-vsctl --no-wait init ovs-vswitchd --pidfile --detach |
Create Open vSwitch bridge and interfaces
To setup the virtual interfaces use Tuntap. Tuntap sets up a emulates an L2 interface. That interface will show up in the interface as a physical interface.
1 2 3 4 5 6 7 |
ovs-vsctl add-br br0 ip tuntap add mode tap vnet0 ip link set vnet0 up ovs-vsctl add-port br0 vnet0 ip link (View the created interface) |
Spin up VirtualBox instances with Open vSwitch Interfaces
For testing Open vSwitch or any other hypervisor testing, I highly recommend this Linux image linux-0.2.img. It only takes a couple of MB of memory. It is perfect for nested hypervisor testing.
Connect the Open vSwitch bridge to the physical network
You can put the following into a text file and give it execute permissions with “chmod +x filename” and then run it “./filename”. If your network settings are right it should flip the IP to the bridge and not cut you off. Keyword “should” so have a way to get to the box if you cut yourself off. What is happening here is you are placing both the virtual interface “vnet0” and the physical Nic “eth0” into the same bridge “br0”. You can think of a bridge as a logical grouping of virtual and physical interface much like a locally significant VLAN without the 0x8100 Ethertype framing and tag.
1 2 3 4 5 6 7 8 |
; html-script: false ]ovs-vsctl add-br br0 ovs-vsctl add-port br0 eth0 ovs-vsctl add-port br0 vnet0 ifconfig eth0 0 && ifconfig br0 192.168.1.(X) netmask 255.255.255.0 route add default gw 192.168.1.1 br0 route del default gw 192.168.1.1 eth0 |
Download your test image. If using the Linux-0.2.img it needs to be converted to vdi first using the VBoxManage utility included with the VirtualBox binary.
1 2 3 4 5 |
wget http://wiki.qemu.org/download/linux-0.2.img.bz2 bunzip2 linux-0.2.img.bz2 VBoxManage convertdd linux-0.2.img linux-0.2.vdi |
- Create a new Virtualbox instance. Choose the linux-0.2.vdi (must duplicate the VDI or else all meta-data is the same and Vbox wont load the IMG). Do this as a regular user or else you will get permissions error.
- Choose “use existing virtual HD”
- Ignore “failed to get USB blah”.
- If you get “dpif_linux|ERR|Generic Netlink family ‘ovs_datapath’ does not exist. The Open vSwitch kernel module is probably not loaded.” Make sure you are adding the Open vSwitch kernel module e.g insmod datapath/linux/openvswitch.ko.
- Under interfaces set to “bridged interface” and choose the port on the appropriate bridge. E.g Bridge1-p2, br-head-p1 etc. Make sure it is a port and not a bridge.
- You can go really low on memory, I tend to just use 32mb but you can go less.
Thanks for stopping by.
Nice writing, I’ll give it a try on upcoming weekend!
Brent , it is unclear how can I load the vSwitch on OS X Mountain Lion . I have virtualbox installed on it and have Fedora/Ubuntu running as VM on VirtualBox
Hi Raj, you would install (binary) or compile (source) Open vSwitch on the Ubuntu guest host running inside nested inside the Ubuntu host.
-So on your mac install VMFusion or Virtualbox and spin up an Ubuntu host.
-On the Ubuntu host, install OVS and VirtualBox.
-For performance you would run Ubuntu natively on the bare metal pc/server.
Lemme know if that doesnt make sense.
Respect,
-Brent
Hello! Thank for this note. But I have just a question, Can we do a ping to an external network (to internet, for example “ping 8.8.8.8”)? If it isn’t possible, how could I do it?
Thank you.
Hi Daniel,
Couple of things to check.
1. Make sure you added eth0 to br0 (or whatever you named the OVS bridge with “ovs-vsctl add-br br0”). To add eth0 to the br0 bridge run “ovs-vsctl add-port br0 eth0”. vnet0 needs to also be in that same bridge with “ovs-vsctl add-port br0 vnet0”
2. zero out eth0. “ifconfig eth0 0” (warning that will cut you off, pop it in a bash script if remote).
3. Add the eth0 ip to br0. “ifconfig br0 192.168.1.10 netmask 255.255.255.0” < -insert your IPs. 4. Add a default route/gateway. "route add default gw 192.168.1.1 br0" <-insert your default gw. 5. Do a "route -n" and check for the 0.0.0.0 route using br0. If there is one still with eth0 run "route del default gw 192.168.1.1 eth0" to delete the old eth0 route. 6. Try pinging your default gateway to make sure you have local connectivity. 7. "ifconfig -a"
Hello Brent,
Thank you very much for this useful guide.
I was trying to follow it and install a ovs with several VMs in virtual box.
I wasn’t sure if I should define a new virtual interface for each VM, and if so should it also be in the same bridge interface?
Thank you,
Avi.
Hi Avi,
You got it, new vPort needs be created and added to the single bridge. New bridges would be if you need seperate datapaths. Think of the different bridges as totally seperate physical switches. Like a VDC on a Cisco Nexus or logical-system in Junos on Juniper platforms.
In the following example:
Bridge == Bridge1
Portnames == Bridge1p1 && Bridge1p2
ovs-vsctl add-br Bridge1
ip tuntap add mode tap Bridge1p1
ip link set Bridge1p1 up
ip link
ovs-vsctl add-port Bridge1 Bridge1p1
ovs-vsctl add-br Bridge1
ip tuntap add mode tap Bridge1p2
ip link set Bridge1p2 up
ip link
ovs-vsctl add-port Bridge1 Bridge1p2
This article was really the kick in the teeth to run Ubuntu as my primary OS on every desktop+laptop I use. Everything I have is either Ubuntu, or a bare metal hypervisor of some sort. Too much stuff to test!
Could you explain a little more what you’re doing with the linux-0.2.vdi image? My guess is running in the VBox that’s running in Ubuntu with OVS on the linux-0.2 image… but I couldn’t follow you on how to do this…
Thanks for the writeup!
Brad
Hi Brad, it’s nice to use as a test VM host if labbing or testing code up on a laptop/desktop. You can spin up multiple guest VMs on very little hardware to test connectivity and what not.
Lemme know if I missed your question.
Cheers,
Brent
Hallo Brent,
I have 5 VMs on the Virtual box, one Floodlight controller, 2 Openvswitches and 2 host.
the network is as follows:
the 2 switches connected together and connected to the controller and each switch is connected to one Host. the interfaces using for every VM is -internal interface- type. The openvswitches are connected together with the hosts and the controller. There is no problem in that. The problem is here that when I ping from one host to other, there is no pinging. So What is the problem ?
Thank you in advance for your support.
Hey bud, sorry for the delay. If you are still having issues ping the thread and I will take a look.
Thanks for the useful post.
For OVS to work in a VM, do you need to allow promisc mode on the interface in VM’s settings (in VBox, Network->[Adapter]->Advanced->Promisc mode ) ?
Hi Dmitri, good question. Ive not noticed any issues before other then multinodes in one case that I remember but its been a while and I dont remember the details. I leave it in promiscuous fwiw.
Cheers,
-Brent
Hello Brent,
Nice informaton, I have a request that can you please give me information about installation of openvswitch-1.11.0 on suse 11 sp 2 running on virtual box.
Hi Brent!
Your articles are very interesting, I am hooked to your blogs most of the time:-)
I have a doubt regarding bringing up each of the Virtual Box instances. should they necessarily be in “use existing virtual HD” ? I have created the VBox instances using new HD spaces, and now I am having the issue of not being able to ping between each of the machines.
The structure of my network: I have one OVS switch connected to Controller in the host. I have an OVS switch in two of my virtual Box instances (each of them have Ubuntu spun on them). I am unable to ping from the host to either of the virtual machines.
Nice, article and I had tried it.
Do you have any idea for setup the VM (Xen Server) to use with external OVS such as Pica8, Cumulus for example.
I’m looking for any solution like a VMWare with Cisco Nexus 1000v
Thanks,
Xen is supported by OVS so you are in great shape. Here is the README.
http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob_plain;f=INSTALL.XenServer;hb=HEAD
Cheers,
-Brent
Hi Brent,
Thanks for the tutorial. I’ve been trying to set up some host VMs for my network and I came across a problem with the linux-0.2.vdi
When I try to generate a new VM with this image, I get the following error:
VFS:Cannot open root device “300” or unknown-block(3,0)
Please append a correct “root=” boot option
Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(3,0) Time: tsc clocksource has been installed.
Have you ever come across something like this?
Thank you very much.
All the best,
Sandra
Test
Hi Brent,
Good write up and very accessible.
I have a question on how to connect two guest VMs to a single OVS instance and allow both to ping 8.8.8.8 ?
At any one time I can only manage to allow one VM to ping out, am I missing something here ?
VM1 –> Tap1 —>
|
——-> |———————-|
——> | Ovsbr0 |
VM2–> Tap2—>| | [eth0] |——>
|———————-|
— i’ve blanked out eth0, ifconfig eth0 0, likewise ovsbr0 has no ip
— they are all on the same subnet which has public IP (VM1 & VM2 have public IP)