読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

CoreLinux で OvS をビルド・インストールする

CoreLinux 環境で Open vSwitch(以下、OvS)を使えるようにビルドしてみました。手間を考慮し、スクリプト化してあります。

完成イメージ

今回、ビルドするパッケージは以下からダウンロード出来ます。

  • tce-i386
    1. bridge-utils
      • bridge-utils.tcz
      • bridge-utils.tcz.info
      • bridge-utils.tcz.list
      • bridge-utils.tcz.md5.txt
    2. OvS
      • openvswitch.tcz
      • openvswitch.tcz.info
      • openvswitch.tcz.list
      • openvswitch.tcz.md5.txt
    3. tunctl
      • tunctl.tcz
      • tunctl.tcz.info
      • tunctl.tcz.list
      • tunctl.tcz.md5.txt

パッケージを追加した CoreLinux 6.3 イメージは以下からダウンロード出来ます。

ユーザ名「tc」、パスワード「password」でログイン出来ます。

前提条件

OvS 等はソースコードからビルドし、.tcz 形式にパッケージングします。ビルドは KVM 上の CoreLinux で実行しましたが、以下の条件を満たしている必要があります。

  • Python が必要
  • メモリが 2GB 以上(メモリ 1GB だと容量不足で OvS がビルド出来ませんでした)

OvS のビルド

以下を実行します。

#!/bin/sh
export BUILD_ROOT="/home/tc"
export OVS_VERSION="2.4.0"

# Downoad packages.
tce-load -wi autoconf automake compiletc libtool-dev linux-kernel-sources-env openssl-1.0.1-dev perl5 squashfs-tools
wget http://tcztools.googlecode.com/hg/tcztools.tcz
tce-load -i tcztools

# Create build environment.
linux-kernel-sources-env.sh

# Download OvS.
cd ${BUILD_ROOT}
wget http://openvswitch.org/releases/openvswitch-${OVS_VERSION}.tar.gz
tar zxvf openvswitch-${OVS_VERSION}.tar.gz
cd openvswitch-${OVS_VERSION}

# Build OvS.
./boot.sh
./configure --with-linux=/lib/modules/`uname -r`/build
make
mkdir ${BUILD_ROOT}/openvswitch
make DESTDIR=${BUILD_ROOT}/openvswitch PREFIX=/ install
sudo make modules_install
cd ${BUILD_ROOT}/openvswitch
mkdir -p lib/modules/`uname -r`/extra/
sudo cp -a /lib/modules/`uname -r`/extra/*.ko lib/modules/`uname -r`/extra/

cd ${BUILD_ROOT}
sudo su
echo /mnt/sda1/tce > /opt/.tce_dir
cat > openvswitch.tcz.info <<EOF
Title:          openvswitch.tcz
Description:    openvswitch
Version:        ${OVS_VERSION}
Author:         Many
Original-site:  http://www.openvswitch.org
Copying-policy: Apache 2.0
Size:           ----
Extension_by:   [NAME]
Comments:       Built for TC 6.3
EOF

# Packaging...
tcz-pack openvswitch

# Result.
ls -alh /home/tc/openvswitch.tcz.info
ls -alh /tmp/tcztools/openvswitch.*

bridge-utils のビルド

以下を実行します。

#!/bin/sh
export BUILD_ROOT="/home/tc"
export OVS_VERSION="2.4.0"

export BUILD_ROOT="/home/tc"
export BRIDGE_UTILS_VERSION="1.5"

# Download bridge-utils.
cd ${BUILD_ROOT}
wget http://sourceforge.net/projects/bridge/files/bridge/bridge-utils-${BRIDGE_UTILS_VERSION}.tar.gz
tar xzvf bridge-utils-${BRIDGE_UTILS_VERSION}.tar.gz
cd bridge-utils-${BRIDGE_UTILS_VERSION}

# Build bridge-utils.
sed -i 's/<linux\/if.h>/<linux\/if.h>\n#include <linux\/in6.h>/g' libbridge/libbridge.h
autoconf
./configure
make
mkdir -p ${BUILD_ROOT}/bridge-utils
make DESTDIR=${BUILD_ROOT}/bridge-utils install
cd ${BUILD_ROOT}
cat > bridge-utils.tcz.info <<EOF
Title:          bridge-utils.tcz
Description:    bridge-utils
Version:        ${BRIDGE_UTILS_VERSION}
Author:         Many
Original-site:  http://sourceforge.net/projects/bridge
Copying-policy: GPL 2.0
Size:           ----
Extension_by:   [NAME]
EOF

# Packaging...
sudo tcz-pack bridge-utils

# Result.
ls -alh /home/tc/bridge-utils.tcz.info
ls -alh /tmp/tcztools/bridge-utils.*

tunctl のビルド

以下を実行します。

#!/bin/sh
export BUILD_ROOT="/home/tc"
export TUNCTL_VERSION="1.5"

# Download tunctl.
cd ${BUILD_ROOT}
wget http://downloads.sourceforge.net/project/tunctl/tunctl/${TUNCTL_VERSION}/tunctl-${TUNCTL_VERSION}.tar.gz
tar xzvf tunctl-${TUNCTL_VERSION}.tar.gz
cd tunctl-${TUNCTL_VERSION}

# Build tunctl.
touch tunctl.8
make
mkdir -p ${BUILD_ROOT}/tunctl
make DESTDIR=${BUILD_ROOT}/tunctl install
cd ${BUILD_ROOT}
cat > tunctl.tcz.info <<EOF
Title:          tunctl.tcz
Description:    tunctl
Version:        ${TUNCTL_VERSION}
Author:         Many
Original-site:  http://sourceforge.net/projects/tunctl
Copying-policy: GPL 2.0
Size:           ----
Extension_by:   [NAME]
EOF

# Packaging...
sudo tcz-pack tunctl

# Result.
ls -alh /home/tc/tunctl.tcz.info
ls -alh /tmp/tcztools/tunctl.*

作成したパッケージのインストール

ビルドに使ったのとは別の CoreLinux へ、作成したパッケージをインストールします。OvS が libatomic を必要とするので gcc_libs をインストールしておきます。ついでに IPv6 用のパッケージもインストールしておきます。

tce-load -wi \
gcc_libs.tcz \
ipv6-3.16.6-tinycore.tcz

ここまでの手順で以下を作成しているはずです。これらを scpwget を使って /mnt/sda1/tce/optional にコピーしておきます。.info ファイルは /home/tc に、それ以外のファイルは /tmp/tcztools/ 配下にあるはずです。

  1. bridge-utils
    • bridge-utils.tcz
    • bridge-utils.tcz.info
    • bridge-utils.tcz.list
    • bridge-utils.tcz.md5.txt
  2. OvS
    • openvswitch.tcz
    • openvswitch.tcz.info
    • openvswitch.tcz.list
    • openvswitch.tcz.md5.txt
  3. tunctl
    • tunctl.tcz
    • tunctl.tcz.info
    • tunctl.tcz.list
    • tunctl.tcz.md5.txt

起動時にコピーしたパッケージが読み込まれるよう、/mnt/sda1/tce/onboot.lst に追記しておきます。

echo bridge-utils.tcz >> /mnt/sda1/tce/onboot.lst
echo openvswitch.tcz >> /mnt/sda1/tce/onboot.lst
echo tunctl.tcz >> /mnt/sda1/tce/onboot.lst

この後の手順で OvS 用の初期設定ファイルを作成します。OvS をロードさせる為に一旦、再起動します。

sync ; sync ; sync ; reboot

再起動が完了したら作業を継続します。OvS の設定ファイル置き場(/usr/local/etc/openvswitch/)を作成して初期設定ファイルを作成し、そのファイルが再起動後も維持されるように永続化しておきます。

sudo mkdir -p /usr/local/etc/openvswitch/
sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db
echo "/usr/local/etc/openvswitch/" >> /opt/.filetool.lst

OS 起動時に実行が必要なコマンドを /opt/bootlocal.sh に追記しておきます。

  • 起動時に必要なモジュールを読み込ませる
    • openvswitch
    • 8021q
    • ipv6
  • OvS を起動する
  • カーネルパラメータを修正し、ルーティングを有効化する

具体的には /opt/bootlocal.sh へ以下を追記しておきます。

modprobe openvswitch
modprobe 8021q
modprobe ipv6

/usr/local/sbin/ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
--pidfile --detach
/usr/local/bin/ovs-vsctl --no-wait init
/usr/local/sbin/ovs-vswitchd --pidfile --detach

sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1

設定変更内容をバックアップします。

filetool.sh -b

これで作業完了です。OS をシャットダウンします。

sync ; sync ; sync ; poweroff

使い方

OvS の実行例は以下の通りです。構成や目的に応じて適宜、修正します。

ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth2
ovs-vsctl add-port br0 eth3
ovs-vsctl set bridge br0 protocols=OpenFlow13
ovs-vsctl set bridge br0 other-config:datapath-id=0000000000000001
ovs-vsctl set-controller br0 tcp:192.168.1.1:6633