仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

UbuntuでOpen vSwitchをLinux KVMのブリッジとして使う

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を設定できるようです。

askubuntu.com

さあ準備が整いました...と言いたいところですが、Linux KVM でOVS Bridgeを仮想マシンマネージャー(Virt-Manager)で操作する場合、次のバグに注意する必要があります。

Bug #1279176 “virt-manager does not support ovs bridge” : Bugs : virt-manager package : Ubuntu

次のように仮想マシンマネージャーでOVSブリッジに完全に対応はしていないので、

f:id:virtualtech:20161125104822p:plain

とりあえず「ホストデバイス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で実現することができるようです。