UbuntuにOpen vSwitchをインストールする
UbuntuでOpenvSwitchを利用するには次のようにパッケージを入れます。 Ubuntu 16.04.xではLTS版のOpen vSwitch 2.5系がインストールできます。
$ sudo apt update $ sudo apt install openvswitch-switch openvswitch-common
ネットワーク設定
そのあとはコマンドでブリッジを作る前に、事前にNICの設定を行っておきます。 本例では物理NICをenp30s0、仮想ブリッジをbr-exとして構成する例を示します。
$ sudo vi /etc/network/interfaces … # The primary network interface auto enp30s0 iface enp30s0 inet manual address 0.0.0.0 auto br-ex iface br-ex inet static address 172.17.14.4 netmask 255.255.255.0 gateway 172.17.14.1 dns-nameservers 8.8.8.8 ovs_type OVSBridge ovs_port enp30s0
OVSブリッジの作成
あとはブリッジを作るだけです。簡単です。
$ sudo ovs-vsctl add-br br-ex $ sudo ovs-vsctl add-port br-ex enp30s0
作成したあと、外部にpingを送っても正常に通信できることを確認します。 それでは本題のOpen vSwitchをLinux KVMのブリッジとして使うにはどうするかというと...
Open vSwitchをLinux KVMのブリッジとして構成する
まずはLinux KVMを使えるようにパッケージをインストールします。
$ sudo apt install kvm libvirt-bin
インストールの進捗を見るとわかりますが、kvm libvirt-binのあたりのインストール時にbridge-utilsもインストールされます。つまり、openvswitchとbridgeモジュールが共存される状況になります。
この状況は良くありませんから対処する必要があります。まずはbridgeモジュールを使っているネットワークを削除します。
$ sudo virsh net-destroy default && sudo virsh net-autostart --disable default
片付けが終わったのでbridgeモジュールも片付けようとbridge-utilsをアンインストールしようとすると、Ubuntuは「libvirt-binも削除するで?」と言ってきます。これでは困るのでblacklistに設定してbridgeモジュールを読み込みしないように設定します。
$ sudo vi /etc/modprobe.d/modprobe.conf blacklist bridge ←追記
設定を反映させるために以下コマンドを実行します。
$ sudo update-initramfs -u
最後に再起動します。
$ sudo reboot
再起動後、次のように実行してbridgeモジュールが読み込まれていないことを確認します。
$ sudo lsmod|grep openvswitch openvswitch 221184 4 nf_nat_ipv6 16384 1 openvswitch nf_nat_ipv4 16384 1 openvswitch nf_defrag_ipv6 36864 2 openvswitch,nf_conntrack_ipv6 nf_nat 24576 3 openvswitch,nf_nat_ipv4,nf_nat_ipv6 nf_conntrack 106496 6 openvswitch,nf_nat,nf_nat_ipv4,nf_nat_ipv6,nf_conntrack_ipv4,nf_conntrack_ipv6 gre 16384 1 openvswitch libcrc32c 16384 3 xfs,raid456,openvswitch $ sudo lsmod|grep bridge $
[2018/10/12追記]
Ubuntu 16.04ではカーネルパラメーターでもモジュールのBlacklistを設定できるようです。
さあ準備が整いました...と言いたいところですが、Linux KVM でOVS Bridgeを仮想マシンマネージャー(Virt-Manager)で操作する場合、次のバグに注意する必要があります。
Bug #1279176 “virt-manager does not support ovs bridge” : Bugs : virt-manager package : Ubuntu
次のように仮想マシンマネージャーでOVSブリッジに完全に対応はしていないので、
とりあえず「ホストデバイスbr-ex:macvtap」などを使ってOSのインストールをしてシャットダウンしたあと、virsh editコマンドで該当の仮想マシンのNICの設定に「virtualport type=openvswitch」の記述を追加してください。例えば次のように設定します。
$ virsh edit vmname ... <interface type='bridge'> ←bridgeにする <mac address='xx:xx:xx:xx:xx:xx'/> ←そのまま <source bridge='br-ex'/> ←ブリッジのNIC名を指定 <virtualport type='openvswitch'> ←追記 </virtualport> ←追記(virtualportタグを閉じる) ...
設定を変えたら設定を保存して閉じます。viで開いた場合は:wq
です。設定に誤りがあればエラーが表示されます。問題なければ変更は保存されます。
「ホストデバイスbr-ex:macvtap」のままでもVMと外部間の通信は問題なく行え、一説によるとmacvtapを使った通信はパフォーマンスが良いとのことですが、KVMホストとVM間の通信ができないというデメリットがあります。今回のように対処するとLinux KVM+Linux Brige構成のような使い勝手をLinux KVM+Open vSwitch Bridgeで実現することができるようです。