CentOS 6.2 に Open vSwitch をインストールする手順

CentOS 6.2 に Open vSwitch をインストールする手順について。
rpm 化したほうが入れたり消したりが便利なので、全て rpm でのインストールです。

要点

  • KVM + libvirtd での仮想化環境のホスト側仮想スイッチとして、デフォルトの Linux bridge の置き換えが目的
  • すでにbridge構成なネットワークになっている仮想化環境を想定
  • 全部 rpm でインストールする


ざっくりとこんな流れ

  1. 2.64 以降の autoconf をインストール
  2. Open vSwitch のビルドに必要なその他パッケージ(kernel-devel openssl-devel)をインストール
  3. Open vSwitch のrpmを作成、インストール
  4. Open vSwitch の設定

autoconf 2.68 を rpm でインストール

まず Open vSwitch のビルドに必要な autoconf の 2.64 以降、ここでは最新版の 2.68 を入れる。
checkinstallrpm を作ってからのインストールになります。
checkinstall のインストール手順は d:id:naga_sawa:20120410 の記事参照のこと)

まず autoconf の tar ball をダウンロードする。

$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz
--2012-04-03 12:02:05--  http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz
ftp.gnu.org をDNSに問いあわせています... 208.118.235.20, 2001:4830:134:3::b
ftp.gnu.org|208.118.235.20|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1860672 (1.8M) [application/x-gzip]
`autoconf-2.68.tar.gz' に保存中

100%[======================================>] 1,860,672    441K/s 時間 4.1s

2012-04-03 12:02:10 (441 KB/s) - `autoconf-2.68.tar.gz' へ保存完了 [1860672/1860672]


展開して configure & make

$ tar zxf autoconf-2.68.tar.gz
$ cd autoconf-2.68
$ ./configure --prefix=/usr --libdir=/usr/lib64
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
(略)
config.status: creating lib/autoscan/Makefile
config.status: creating lib/m4sugar/Makefile
config.status: creating lib/autoconf/Makefile
config.status: creating lib/autotest/Makefile
config.status: creating bin/Makefile
config.status: executing tests/atconfig commands

$ make
(略)
chmod +x ifnames.tmp
chmod a-w ifnames.tmp
mv -f ifnames.tmp ifnames
make[2]: Leaving directory `/home/foobar/autoconf-2.68/tests'
Making all in man
make[2]: Entering directory `/home/foobar/autoconf-2.68/man'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/foobar/autoconf-2.68/man'
make[1]: Leaving directory `/home/foobar/autoconf-2.68'


checkinstallRPM 作成。
既存パッケージと干渉する部分が出てくるので --inspect オプションを付けておく。

# checkinstall --inspect

お決まりの構築手順を進めると、 vi が起動してパッケージするファイルを変更できるので、binutils-2.20.51.0.2-5.28.el6.x86_64 と競合する以下2つを削除する。

  • /usr/share/info/dir
  • /usr/share/info/standards.info

何かしら問題出るかもしれないけど、手元の環境では今のところ問題なし。

バックアップパッケージを書き込み..OK

temp dirを削除..OK


**********************************************************************

 Done. The new package has been saved to

 /root/rpmbuild/RPMS/x86_64/autoconf-2.68-1.x86_64.rpm
 You can install it in your system anytime using:

      rpm -i autoconf-2.68-1.x86_64.rpm

**********************************************************************


できあがった autoconf をインストール。

#  rpm -Uvh /root/rpmbuild/RPMS/x86_64/autoconf-2.68-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:autoconf               ########################################### [100%]

Open vSwitch のビルドに必要な既存パッケージをインストール

# yum install kernel-devel openssl-devel

Open vSwitch の make とインストール

Open vSwitch をダウンロード&展開

$ wget http://openvswitch.org/releases/openvswitch-1.4.0.tar.gz
--2012-04-12 14:05:32--  http://openvswitch.org/releases/openvswitch-1.4.0.tar.gz
openvswitch.org をDNSに問いあわせています... 69.56.251.103
openvswitch.org|69.56.251.103|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1972471 (1.9M) [application/x-gzip]
`openvswitch-1.4.0.tar.gz' に保存中

100%[======================================>] 1,972,471    292K/s 時間 8.5s

2012-04-12 14:05:41 (226 KB/s) - `openvswitch-1.4.0.tar.gz' へ保存完了 [1972471/1972471]

$ tar zxf openvswitch-1.4.0.tar.gz


configure

$ cd openvswitch-1.4.0
$ ./boot.sh
$ ./configure --with-linux=/lib/modules/`uname -r`/build
(略)
config.status: creating datapath/linux/Makefile
config.status: creating datapath/linux/Makefile.main
config.status: creating tests/atlocal
config.status: creating config.h
config.status: executing tests/atconfig commands
config.status: executing depfiles commands
config.status: executing include/openflow/openflow.h.stamp commands
config.status: executing ovsdb/ovsdbmonitor/dummy commands
config.status: executing utilities/bugtool/dummy commands


make して Open vSwitch の rpm 作り。

$ make dist
(略)
make[1]: ディレクトリ `/home/foobar/openvswitch-1.4.0' に入ります
make[1]: ディレクトリ `/home/foobar/openvswitch-1.4.0' から出ます
test -n "" \
        || find "openvswitch-1.4.0" -type d ! -perm -755 \
                -exec chmod u+rwx,go+rx {} \; -o \
          ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -444 -exec /bin/sh /home/foobar/openvswitch-1.4.0/build-aux/install-sh -c -m a+r {} {} \; \
        || chmod -R a+r "openvswitch-1.4.0"
tardir=openvswitch-1.4.0 && /bin/sh /home/foobar/openvswitch-1.4.0/build-aux/missing --run tar chof - "$tardir" | GZIP=--best gzip -c >openvswitch-1.4.0.tar.gz
{ test ! -d "openvswitch-1.4.0" || { find "openvswitch-1.4.0" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -fr "openvswitch-1.4.0"; }; }

$ mkdir -p ~/rpmbuild/SOURCES
$ mv ./openvswitch-1.4.0.tar.gz ~/rpmbuild/SOURCES/
$ rpmbuild -bb --target=x86_64 rhel/openvswitch-kmod-rhel6.spec
(略)
伸張ファイルの検査中: /usr/lib/rpm/check-files /home/foobar/rpmbuild/BUILDROOT/openvswitch-kmod-1.4.0-1.el6.x86_64
警告: ホスト名を正式なものにできません: foobar.jp
書き込み完了: /home/foobar/rpmbuild/RPMS/x86_64/kmod-openvswitch-1.4.0-1.el6.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.bkfPrF
+ umask 022
+ cd /home/foobar/rpmbuild/BUILD
+ cd openvswitch-1.4.0
+ rm -rf /home/foobar/rpmbuild/BUILDROOT/openvswitch-kmod-1.4.0-1.el6.x86_64
+ exit 0

$ rpmbuild -bb --target=x86_64 rhel/openvswitch.spec
(略)
Processing files: openvswitch-debuginfo-1.4.0-1.x86_64
伸張ファイルの検査中: /usr/lib/rpm/check-files /home/foobar/rpmbuild/BUILDROOT/openvswitch-1.4.0-1.x86_64
警告: ホスト名を正式なものにできません: foobar.jp
書き込み完了: /home/foobar/rpmbuild/RPMS/x86_64/openvswitch-1.4.0-1.x86_64.rpm
書き込み完了: /home/foobar/rpmbuild/RPMS/x86_64/openvswitch-debuginfo-1.4.0-1.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.tgkPfe
+ umask 022
+ cd /home/foobar/rpmbuild/BUILD
+ cd openvswitch-1.4.0
+ rm -rf /home/foobar/rpmbuild/BUILDROOT/openvswitch-1.4.0-1.x86_64
+ exit 0


~/rpmbuild/RPMS/x86_64/ に 3 本の rpm が出来ているのでインストール
kmod-openvswitch で時間がかかるけど我慢

$ cd ..
$ ll rpmbuild/RPMS/x86_64/
kmod-openvswitch-1.4.0-1.el6.x86_64.rpm
openvswitch-1.4.0-1.x86_64.rpm
openvswitch-debuginfo-1.4.0-1.x86_64.rpm
$ cp rpmbuild/RPMS/x86_64/*.rpm .

# rpm -ivh kmod-openvswitch-1.4.0-1.el6.x86_64.rpm openvswitch-1.4.0-1.x86_64.rpm openvswitch-debuginfo-1.4.0-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:kmod-openvswitch       ########################################### [ 33%]
   2:openvswitch            ########################################### [ 67%]
   3:openvswitch-debuginfo  ########################################### [100%]


インストールされたのを確認

# ovs-vsctl -V
ovs-vsctl (Open vSwitch) 1.4.0
Compiled Apr 12 2012 14:17:32


CentOS6.2 のパッケージの libvirt 0.9.4 は OpenvSwitchにネイティブ対応していないので、/etc/sysconfig/openvswitch を修正して Linux bridge 互換機能を有効にする。
(brcompatdとbrcompat_modが有効になる…なってるんだと思う)

# vi /etc/sysconfig/openvswitch
+BRCOMPAT=yes  ←最後に追記/もしくはコメント外す


既存のbridge設定の変更(現環境で bridge を使ってない人はスルーで)

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
HWADDR="XX:XX:XX:XX:XX:XX"
ONBOOT="yes"
TYPE="Ethernet"
-BRIDGE="br0"  ←これを消す ovs 側で設定するので


既存 Linux bridge を止める。
(既にbridge環境導入済みで br_x にアドレスが振ってある場合はネットワークが切れるのでリモート作業している場合は注意)

# rmmod bridge


再起動

# reboot


動作確認

$ lsmod | grep openvswitch
openvswitch_mod        83029  1
$ chkconfig --list | grep openvswitch
openvswitch     0:off   1:off   2:on    3:on    4:on    5:on    6:off
$ /etc/init.d/openvswitch status
ovsdb-server is running with pid 1628
ovs-vswitchd is running with pid 1637

元の bridge 状態と同様になるよう Open vSwitch を設定

元は br0 に eth0 がぶら下がっている環境を想定してます。
Open vSwitch では add-br で bridge デバイスを登録して、add-port でそれに eth0 をぶら下げます。

# ovs-vsctl add-br br0
# ovs-vsctl add-port br0 eth0


設定状況の確認

# ovs-vsctl show
3be7f9ef-5e64-42a8-b27c-f94e04b5c78c
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "eth0"
            Interface "eth0"
    ovs_version: "1.4.0"


br0 が寝ていると困るので、network を restart しておく。

# /etc/init.d/network restart
インターフェース br0 を終了中:                             [  OK  ]
インターフェース eth0 を終了中:                            [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:                          [  OK  ]
インターフェース br0 を活性化中:                           [  OK  ]

# ifconfig
br0       Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.11.48  Bcast:192.168.11.255  Mask:255.255.255.0
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:3057 errors:0 dropped:0 overruns:0 frame:0
          TX packets:353 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:431595 (421.4 KiB)  TX bytes:44540 (43.4 KiB)

eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:1043 errors:0 dropped:0 overruns:0 frame:0
          TX packets:98 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:141364 (138.0 KiB)  TX bytes:15031 (14.6 KiB)
          Interrupt:16 Memory:c0000000-c0012800

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:480 (480.0 b)  TX bytes:480 (480.0 b)


疎通確認。

# ping 192.168.11.1
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
64 bytes from 192.168.11.1: icmp_seq=1 ttl=255 time=1.29 ms
64 bytes from 192.168.11.1: icmp_seq=2 ttl=255 time=0.417 ms
^C
--- 192.168.11.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1434ms
rtt min/avg/max/mdev = 0.417/0.855/1.294/0.439 ms


これでリモートから入れるようになったはず。
仮想マシンを起動すると、仮想NICのtap(以下の例ではvnet0がそれ)がovsのbr0に追加されてることがわかるはず。

# ovs-vsctl show
3be7f9ef-5e64-42a8-b27c-f94e04b5c78c
    Bridge "virbr0"
        Port "virbr0"
            Interface "virbr0"
                type: internal
        Port "virbr0-nic"
            Interface "virbr0-nic"
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "vnet0"
            Interface "vnet0"
        Port "eth0"
            Interface "eth0"
    ovs_version: "1.4.0"

参考

Open vSwitch をいじるにあたり、色々と先人の辿った道を参考にしました。