KVM環境で通常はLinux標準ブリッジであるbrctlを利用するが、今回はOpen vSwitchにbridgeの役割をさせてみようと思います。 KVM環境は構築済みとします。 OSはDebian 7.2で、apt-getでinstallしたらOpen vSwitchのバージョンは1.4.2が入ったのでそのまま利用しています。
環境
OS:Debian 7.2
Open vSwitch:1.4.2
参考にしたサイト
- KVM on ESXi (openvswitch)
- KVMゲストにOpenvswitchでVLANを構成する(Debian wheezy 編)
- Configuring Libvirt guests with an Open vSwitch bridge
- OPENVSWITCH CONFIGURE FROM PACKAGES AND ATTACHING TO A FLOODLIGHT OPENFLOW CONTROLLER
Open vSwitchのインストール
openvswitch-datapathモジュールをインストール
$ sudo apt-get install linux-headers-`uname -r` linux-source build-essential
$ sudo apt-get install openvswitch-datapath-source module-assistant
モジュールのビルド&インストール
$ sudo m-a a-i openvswitch-datapath
openvswitch-switchのインストール
$ sudo apt-get install openvswitch-switch
Linuxの標準bridge(brctl)の代わりにOpen vSwtichを利用するためにbrctl互換のbridge compatibilityをインストール
$ sudo apt-get install openvswitch-brcompat
bridge compatibilityを有効にするため/etc/default/openvswitch-switchを編集
$ sudo vim /etc/default/openvswitch-switch
#BRCOMPAT=no
BRCOMPAT=yes
Linux bridgeの動作確認
Linux bridgeが動作しているとOpen vSwitchは動作しないので、動作しているか確認
$ lsmod | grep bridge
表示された場合は、削除
$ rmmod bridge
openvswitch再起動
$ sudo service openvswitch-switch restart
起動確認
$ sudo lsmod | grep brcompat
brcompat_mod 13031 0
openvswitch_mod 67948 1 brcompat_mod
Open vSwitch(OVS) bridgeの設定
OVS bridgeインタフェースの追加
$ sudo ovs-vsctl add-br ovsbr0
OVS bridge(ovsbr0)とeth0を接続
$ sudo ovs-vsctl add-port ovsbr0 eth0
eth0に付いているIPアドレスを消し、ovsbr0にIPアドレスを付ける
$ sudo ifconfig eth0 0.0.0.0
$ sudo ifconfig ovsbr0 192.168.100.1/24
DHCPが動いている場合、eth0で動いているdhclientをovsbr0と結びつける
$ dhclient ovsbr0 &
現在の設定の確認
$ sudo ovs-vsctl show
238d066c-8354-4978-a9f4-39a98fa2d2e9
Bridge "ovsbr0"
Port "eth0"
Interface "eth0"
Port "ovsbr0"
Interface "ovsbr0"
type: internal
ovs_version: "1.4.2"
KVM上のゲストの設定
KVM上でhost01というVMが動いていると想定する。
host01をshutdownする
$ virsh shutdown host01
host01のXMLを編集する
$ virsh edit host01
+の付いているところを編集
[...] <interface type='bridge'> <mac address='52:54:00:ad:c1:7c'/> +<source bridge='ovsbr0'/> +<virtualport type='openvswitch'> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> [...]
XMLを保存した後、再度表示するとinterfaceidが自動的に生成されている
$ virsh dumpxml host01 | grep bridge -A8 <interface type='bridge'> <mac address='52:54:00:ad:c1:7c'/> <source bridge='ovsbr0'/> <virtualport type='openvswitch'> +<parameters interfaceid='81d6a11b-e89e-9037-f6bb-994b2fbc9dcc'/> </virtualport> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
host01を起動する
$ virsh start host01
ovsの設定を確認する
$ sudo ovs-vsctl show
238d066c-8354-4978-a9f4-39a98fa2d2e9
Bridge "ovsbr0"
Port "eth0"
Interface "eth0"
Port "ovsbr0"
Interface "ovsbr0"
type: internal
Port "vnet0"
Interface "vnet0"
ovs_version: "1.4.2"
host01用のインタフェースvnet0
が生成され、ovsbr0
に接続されている。
host01のコンソールに接続して、IPアドレスを設定したあと疎通確認する
$ virsh console host01
$ sudo ifconfig eth0 192.168.100.2/24
$ ping 192.168.100.1