network/openvswitch: Added (multilayer virtual switch)

Signed-off-by: Niels Horn <niels.horn@slackbuilds.org>
This commit is contained in:
Christopher Walker 2011-03-07 12:08:14 -03:00 committed by Niels Horn
parent e1f98f7da2
commit 61ac3bfa43
9 changed files with 525 additions and 0 deletions

View file

@ -0,0 +1,19 @@
Open vSwitch is a production quality, multilayer virtual switch licensed
under the open source Apache 2.0 license. It is designed to enable
massive network automation through programmatic extension, while still
supporting standard management interfaces (e.g. NetFlow, sFlow, RSPAN,
ERSPAN, CLI). In addition, it is designed to support distribution
across multiple physical servers similar to VMware.s vNetwork distributed
vswitch or Cisco.s Nexus 1000V.
Open vSwitch can operate both as a soft switch running within the
hypervisor, and as the control stack for switching silicon. It has been
ported to multiple virtualization platforms and switching chipsets. It
is the default switch in the Xen Cloud Platform and also supports Xen,
XenServer, KVM, and VirtualBox. The bulk of the code is written in
platform-independent C and is easily ported to other environments.
This package will build kernel modules that will be uses as replacements
for the bridge modules included with the stock Linux kernel. Open
vSwitch includes a kernel module if you wish to use the standard Linux
bridge utils to manage it.

View file

@ -0,0 +1,27 @@
config() {
NEW="$1"
OLD="$(dirname $NEW)/$(basename $NEW .new)"
# If there's no config file by that name, mv it over:
if [ ! -r $OLD ]; then
mv $NEW $OLD
elif [ "$(cat $OLD|md5sum)" = "$(cat $NEW|md5sum)" ]; then
# toss the redundant copy
rm $NEW
fi
# Otherwise, we leave the .new copy for the admin to consider...
}
preserve_perms() {
NEW="$1"
OLD="$(dirname $NEW)/$(basename $NEW .new)"
if [ -e $OLD ]; then
cp -a $OLD ${NEW}.incoming
cat $NEW > ${NEW}.incoming
mv ${NEW}.incoming $NEW
fi
config $NEW
}
preserve_perms etc/rc.d/rc.openvswitch.new
depmod -A

View file

@ -0,0 +1,133 @@
#!/bin/sh
# Slackware build script for openvswitch
# Copyright 2008-2010 Christopher Walker
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PRGNAM=openvswitch
VERSION=1.0.1
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
MODULEPATH=${MODULEPATH:-/lib/modules/`uname -r`}
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i486 ;;
arm*) ARCH=arm ;;
*) ARCH=$( uname -m ) ;;
esac
fi
CWD=$(pwd)
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i486" ]; then
SLKCFLAGS="-O2 -march=i486 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
fi
set -e
if [ ! -d $MODULEPATH ]; then
echo "Missing module path $MODULEPATH! Exiting script..."
exit
fi
if [ ! -h $MODULEPATH/build ]; then
echo "Missing source patch $MODULEPATH/build! Exiting script..."
exit
fi
KERNELPATH=$(readlink /lib/modules/`uname -r`/build)
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
chown -R root:root .
chmod -R u+w,go+r-w,a-s .
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
--prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--mandir=/usr/man \
--docdir=/usr/doc/$PRGNAM-$VERSION \
--with-l26=$KERNELPATH \
--enable-ndebug \
--enable-ssl
make
make DESTDIR=$TMP/package-$PRGNAM install
find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
find $PKG/usr/man -type f -exec gzip -9 {} \;
for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/{schema,xen}
install -m 644 COPYING ChangeLog CodingStyle INSTALL.KVM INSTALL.Linux \
INSTALL.OpenFlow INSTALL.SSL INSTALL.XenServer INSTALL.bridge \
INSTALL.userspace NOTICE README README-gcov REPORTING-BUGS \
SubmittingPatches \
$PKG/usr/doc/$PRGNAM-$VERSION
install -m 644 $CWD/xen/vif-openvswitch $CWD/xen/network-openvswitch \
$CWD/xen/README \
$PKG/usr/doc/$PRGNAM-$VERSION/xen
install -m 644 vswitchd/vswitch.ovsschema \
$PKG/usr/doc/$PRGNAM-$VERSION/schema
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG$MODULEPATH/kernel/extra/openvswitch
install -m 644 datapath/linux-2.6/openvswitch_mod.ko \
$PKG$MODULEPATH/kernel/extra/openvswitch
install -m 644 datapath/linux-2.6/brcompat_mod.ko \
$PKG$MODULEPATH/kernel/extra/openvswitch
mkdir -p $PKG/etc/openvswitch
mkdir -p $PKG/etc/rc.d
sed -e "s/@DOCDIR@/\/usr\/doc\/$PRGNAM-$VERSION\/schema/" $CWD/rc.openvswitch > $PKG/etc/rc.d/rc.openvswitch.new
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
mkdir -p $PKG/var/run/openvswitch
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}

View file

@ -0,0 +1,10 @@
PRGNAM="openvswitch"
VERSION="1.0.1"
HOMEPAGE="http://openvswitch.org"
DOWNLOAD="http://openvswitch.org/releases/openvswitch-1.0.1.tar.gz"
MD5SUM="70930c604e64cc9a6658fa504416556c"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
MAINTAINER="Christopher Walker"
EMAIL="kris240376@gmail.com"
APPROVED="Niels Horn"

View file

@ -0,0 +1,68 @@
#!/bin/sh
# Start/stop/restart openvswitch.
# To start Open vSwitch automatically at boot, be sure this script is
# executable:
#
# % chmod 755 /etc/rc.d/rc.openvswitch
# Before you can run Open vSwitch daemon, you must have a database. To
# install an initial database, perform the following as root:
#
# % modprobe openvswitch_mod
# % ovsdb-tool create /etc/openvswitch/ovs-vswitchd.conf.db /usr/doc/openvswitch-1.0.1/schema/vswitch.ovsschema
#
# Module to make Open vSwitch compatible with Linux bridge utils:
BRCOMPAT=0
SOCKET=/var/run/openvswitch/db.sock
VSPID=/var/run/openvswitch/ovs-vswitchd.pid
DBPID=/var/run/openvswitch/ovsdb-server.pid
# Insert kernel driver for Open vSwitch:
/sbin/modprobe openvswitch_mod
# Insert kernel driver for VLANs:
/sbin/modprobe 8021q
# Insert kernel driver for bridge util compatibility:
if [ $BRCOMPAT -ne 0 ] ; then
/sbin/modprobe brcompat_mod
fi
# Start openvswitch:
openvswitch_start() {
echo "Starting openvswitch: /etc/rc.d/rc.openvswitch"
/usr/sbin/ovsdb-server /etc/openvswitch/ovs-vswitchd.conf.db --remote=punix:$SOCKET --detach --pidfile=$DBPID
/usr/bin/ovs-vsctl --no-wait init
/usr/sbin/ovs-vswitchd unix:$SOCKET --detach --pidfile=$VSPID
}
# Stop openvswitch:
openvswitch_stop() {
echo "Stopping openvswitch: /etc/rc.d/rc.openvswitch"
if [ -e $VSPID ]; then
pid=$(cat $VSPID)
/usr/bin/ovs-appctl -t /var/run/openvswitch/ovs-vswitchd.$pid.ctl exit
fi
if [ -e $DBPID ]; then
pid=$(cat $DBPID)
/usr/bin/ovs-appctl -t /var/run/openvswitch/ovsdb-server.$pid.ctl exit
fi
}
case "$1" in
'start')
openvswitch_start
;;
'stop')
openvswitch_stop
;;
'restart')
openvswitch_stop
openvswitch_start
;;
*)
echo "usage $0 start|stop|restart"
esac

View file

@ -0,0 +1,19 @@
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
openvswitch: openvswitch (multilayer virtual switch)
openvswitch:
openvswitch: Open vSwitch is a production quality, multilayer virtual switch
openvswitch: licensed under the open source Apache 2.0 license. It is designed
openvswitch: to enable massive network automation through programmatic extension,
openvswitch: while still supporting standard management interface (e.g. NetFlow,
openvswitch: sFlow, RSPAN, ERSPAN, CLI).
openvswitch:
openvswitch: Homepage: http://openvswitch.org/
openvswitch:
openvswitch:

View file

@ -0,0 +1,39 @@
Here are some scripts that I've written for use with Xen at my site.
In order to use these scripts with your Xen installation you'll need to copy
both the network-openvswitch and vif-openvswitch files to your
/etc/xen/scripts directory. You can instruct Xen to use these scripts by
editing your /etc/xen/xend-config.sxp file and specifying these scripts as
the default network-script and vif-script.
For example, here are the entries in my xend-config.sxp file:
(network-script 'network-openvswitch netdev=eth2 bridge=ovs0')
(vif-script 'vif-openvswitch bridge=ovs0')
If your network interface card and attached network switch support VLAN
tagged traffic, you can place virtual machines within a seperate VLAN by
appending a '.' and the VLAN tag number you wish the domain to use. For
example, to have all domains default to VLAN 2 you can do the following:
(vif-script 'vif-openvswitch bridge=ovs0.2')
You can also specify tagged traffic in the domain configuration file.
If you are hosting a hardware virtualized domain understand that the
/etc/xen/scripts/qemu-ifup script is run instead of the vif-script specified
in the xend-config.sxp file. You'll need to edit this file to add the port
to the vswitch instead of using the brctl (unless of course you are using
the appropriate kernel module to control the vswitch using brctl.) Here is
a snippet from my qemu-ifup to handle hardware virtualized ports:
if lsmod | grep -c openvswitch_mod 1> /dev/null && ! lsmod | grep -c brcompat_mod 1> /dev/null
then
ovs-vsctl -- --may-exist add-port $bridge $1
else
brctl addif $bridge $1 || true
fi
This doesn't handle tagged traffic. I'll leave that as an exercise for you.
Enjoy.

View file

@ -0,0 +1,124 @@
#!/bin/bash
#============================================================================
# Default Xen network start/stop script.
# Xend calls a network script when it starts.
# The script name to use is defined in ${XEN_CONFIG_DIR}/xend-config.sxp
# in the network-script field.
#
# This script creates a virtual switch (default ${netdev}) and adds a
# device (defaults to eth0) to it. The interface that this Open vSwitch
# is created on should not have a working IP address and will be used as
# a switch for Xen domU's.
#
# Usage:
# network-openvswitch (start|stop|status) {VAR=VAL}*
#
# Vars:
# bridge The bridge to use (default xenvs0).
# netdev The interface to add to the bridge (default eth0). This
# device should not be configured with an IP address. If so
# this script will tear down the interface and bring it back up
# without an IP address.
#
# start:
# Creates the bridge as bridge
# Enslaves netdev to bridge
#
# stop:
# Removes netdev from the bridge
# Deletes bridge
#
# status:
# Print addresses, interfaces
#
#============================================================================
dir=$(dirname "$0")
. "$dir/logging.sh"
. "$dir/xen-script-common.sh"
. "$dir/xen-network-common.sh"
. "$dir/locking.sh"
findCommand "$@"
evalVariables "$@"
netdev=${netdev:-eth0}
bridge=${bridge:-ovs0}
addr=`ip addr show dev ${netdev} | egrep '^ *inet' | sed -e 's/ *inet //' -e 's/ .*//'`
if [ -n "$addr" ]; then
echo "Invalid device: ${netdev} is up and has a valid IP address!" >&2
exit 1
fi
show_status () {
local dev=$1
local bridge=$2
echo '============================================================'
echo 'vSwitch interfaces'
ovs-vsctl list-ifaces ${bridge}
echo ' '
echo 'vSwitch ports'
ovs-vsctl list-ports ${bridge}
echo '============================================================'
}
op_start () {
if [ "${bridge}" = "null" ] ; then
return
fi
ifconfig "${netdev}" down
ifconfig "${netdev}" 0.0.0.0 up
ovs-vsctl -- --may-exist add-br ${bridge}
ifconfig "${bridge}" 0.0.0.0 up
ovs-vsctl -- --may-exist add-port ${bridge} ${netdev}
# Remove any stale ports from last time virtual switch was running.
# Open vSwitch has the habit of remembering port settings between
# runs.
for port in $(ovs-vsctl list-ports ${bridge})
do
if [ "${port}" != "${netdev}" ]
then
ifconfig "${port}" down
ovs-vsctl del-port ${port}
fi
done
}
op_stop () {
if [ "${bridge}" = "null" ]; then
return
fi
# Remove all ports from virtual switch.
for port in $(ovs-vsctl list-ports ${bridge})
do
ifconfig "${port}" down
ovs-vsctl del-port ${port}
done
ifconfig "${bridge}" down
ovs-vsctl -- --if-exists del-br ${bridge}
}
case "$command" in
start)
op_start
;;
stop)
op_stop
;;
status)
show_status ${netdev} ${bridge}
;;
*)
echo "Unknown command: $command" >&2
echo 'Valid commands are: start, stop, status' >&2
exit 1
esac

View file

@ -0,0 +1,86 @@
#!/bin/bash
#============================================================================
# ${XEN_SCRIPT_DIR}/vif-openvswitch
#
# Script for configuring a vif using Open vSwitch.
#
# Usage:
# vif-openvswitch (add|remove|online|offline)
#
# Environment vars:
# vif vif interface name (required).
# XENBUS_PATH path to this device's details in the XenStore (required).
#
# Read from the store:
# bridge bridge to add the vif to (optional). Defaults to searching for the
# bridge itself.
#
# up:
# Enslaves the vif interface to the bridge.
#
# down:
# Removes the vif interface from the bridge.
#============================================================================
dir=$(dirname "$0")
. "$dir/vif-common.sh"
bridge=${bridge:-}
bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")
if [ -z "${bridge}" ]
then
bridge=$(ovs-vsctl listbr | cut -d "
" -f 1)
if [ -z "${bridge}" ]
then
fatal "Could not find bridge and none was specified"
fi
fi
tag=${tag:-}
# Domain on VLAN tagged bridge?
RET=0
ovs-vsctl list-br | grep -c ${bridge} 1>/dev/null 2>&1 || RET=1
if [ $RET -eq 1 ]
then
if [[ $bridge =~ \.[[:digit:]]{1,4}$ ]]
then
tag=$(echo ${bridge} | cut -d "." -f 2)
bridge=$(echo ${bridge} | cut -d "." -f 1)
else
fatal "Could not find bridge device ${bridge}"
fi
fi
RET=0
ovs-vsctl list-br | grep -c ${bridge} 1>/dev/null 2>&1 || RET=1
if [ $RET -eq 1 ]
then
fatal "Could not find bridge device ${bridge}"
fi
log debug "Successful vif-bridge $command for ${vif}, bridge ${bridge}."
case "$command" in
online)
ifconfig "${vif}" 0.0.0.0 up
if [ -z $tag ]
then
ovs-vsctl -- --may-exist add-port ${bridge} ${vif}
else
ovs-vsctl -- --may-exist add-port ${bridge} ${vif} tag=${tag}
fi
;;
offline)
ovs-vsctl -- --if-exists del-port ${bridge} ${vif}
ifconfig "$vif" 0.0.0.0 down
;;
esac
if [ "$command" == "online" ]
then
success
fi