Ubuntu 26.04 で KVM を OVS / OVN と組み合わせる場合、VM の network は単に bridge 名を指定するだけでは整理できません。libvirt の interface、Open vSwitch の br-int、OVN の logical switch port、provider bridge、VLAN / localnet の対応を分けて考える必要があります。
この記事では、KVM の土台ができている前提で、VM を br-int と OVN logical switch に接続する考え方を整理します。VM domain の作成そのものではなく、VM がどの network に接続されるのかを中心に扱います。
KVM bridge network で見る境界
libvirt、OVS、OVN はそれぞれ見ている対象が違います。VM の XML に書く bridge は OVS 側の接続点であり、OVN の logical switch とは interfaceid で対応します。
| 領域 | 見るもの | 役割 |
|---|---|---|
| libvirt | domain XML の interface | VM の仮想 NIC をどの bridge に接続するかを定義する |
| Open vSwitch | br-int、provider bridge、port | 仮想 NIC と物理 network の接続点を持つ |
| OVN | logical switch、logical switch port | VM 用の論理 L2 network を作る |
| localnet | network_name、bridge mapping、VLAN tag | OVN logical network と物理 network を接続する |
| VM 設定 | interface_id、MAC、MTU | libvirt interface と OVN logical port を対応させる |
ここを混ぜると、br-int に接続しているのに OVN port がない、OVN port はあるのに interfaceid が一致しない、bridge mapping がないため provider network へ出られない、という問題が起きます。
br-int は VM の接続点になる
br-int は OVN が使う integration bridge です。VM の libvirt interface は bridge type で br-int に接続し、virtualport type="openvswitch" を指定します。
<interface type='bridge'>
<source bridge='br-int'/>
<model type='virtio'/>
<virtualport type='openvswitch'>
<parameters interfaceid='3b180998-92f1-4ecd-ad35-d05ba7055841'/>
</virtualport>
</interface>interfaceid は OVN logical switch port の名前として使います。VM の NIC と OVN の logical port を結び付ける鍵なので、VM ごと、interface ごとに一意な UUID にします。
OVN logical switch port を作る
VM の interface を OVN logical switch に接続するには、VM interface ごとに logical switch port を作成します。
sudo ovn-nbctl --may-exist lsp-add ls2001 3b180998-92f1-4ecd-ad35-d05ba7055841
sudo ovn-nbctl lsp-set-addresses 3b180998-92f1-4ecd-ad35-d05ba7055841 unknown
sudo ovn-nbctl clear Logical_Switch_Port 3b180998-92f1-4ecd-ad35-d05ba7055841 port_security
sudo ovn-nbctl showunknown は、OVN 側で固定 MAC を強制しない指定です。MAC を固定したい場合は、libvirt XML 側の mac と OVN 側の address / port security を合わせて設計します。
VM 側の interface 定義例
VM 定義では、接続先 bridge、logical switch、interface ID、必要に応じて MAC や MTU を持たせます。ここでの logical_switch は OVN port を作るための情報であり、libvirt XML にそのまま入る項目ではありません。
interfaces:
- bridge: br-int
logical_switch: ls2001
interface_id: 3b180998-92f1-4ecd-ad35-d05ba7055841
mac: 52:54:00:12:34:56
- bridge: br-int
logical_switch: ls2256
interface_id: ad1f486a-29d0-4251-bf97-9ee074c52de0VM が複数 network に接続される場合は、interface ごとに logical switch と interface ID を分けます。管理用、内部用、外部用のように network の主語を分けると、VM 側の NIC も整理しやすくなります。
provider bridge と localnet の対応
VM が OVN の中だけで閉じるなら logical switch だけで済みます。物理 network や VLAN と接続する場合は、provider bridge、bridge mapping、localnet port が必要です。
sudo ovs-vsctl show
sudo ovs-vsctl get Open_vSwitch . external_ids:ovn-bridge-mappings
sudo ovn-nbctl showたとえば phys0:brphys0 という bridge mapping があり、OVN localnet port の network_name が phys0 であれば、その logical switch は brphys0 側の物理 network と接続できます。
VLAN を使う localnet
VLAN ごとに logical switch を分ける場合、localnet port に VLAN tag を設定します。次は ls2001 を VLAN 2001 として provider bridge 側へ接続する例です。
sudo ovn-nbctl --may-exist ls-add ls2001
sudo ovn-nbctl --may-exist lsp-add ls2001 ln2001
sudo ovn-nbctl lsp-set-type ln2001 localnet
sudo ovn-nbctl lsp-set-options ln2001 network_name=phys0
sudo ovn-nbctl set Logical_Switch_Port ln2001 tag=2001
sudo ovn-nbctl lsp-set-addresses ln2001 unknownこの場合、provider bridge 側の物理 port が VLAN 2001 を通せる必要があります。OVN 側だけ tag を付けても、物理 switch 側や OVS port 側で VLAN が通らなければ通信できません。
VM と logical switch の対応を確認する
VM domain を定義した後は、libvirt、OVS、OVN の 3 つの視点で接続を確認します。
virsh domiflist vm01
ovs-vsctl show
ovn-nbctl list Logical_Switch_Port
ovn-nbctl showvirsh domiflist では VM の interface がどの bridge に接続されているかを確認します。ovs-vsctl show では OVS port と bridge を確認します。ovn-nbctl では logical switch と logical switch port を確認します。
VM が通信できない時の見方
VM の通信不良は、VM 内の IP 設定だけでは判断できません。libvirt の NIC、OVS の port、OVN の logical port、localnet、provider bridge、物理 switch の VLAN を分けて確認します。
| 症状 | 確認する場所 |
|---|---|
| VM に NIC が見えない | libvirt domain XML、virsh domiflist |
| OVS に port が見えない | ovs-vsctl show、libvirt interface の bridge 指定 |
| OVN logical switch に port がない | ovn-nbctl show、interface_id の一致 |
| 同一 logical switch 内で通信できない | OVN port、MAC / port security、VM 内 firewall |
| 外部 VLAN へ出られない | localnet、bridge mapping、provider bridge、物理 switch trunk |
ip address
ip route
ping -c 3 10.0.0.1
virsh domiflist vm01
ovs-vsctl show
ovn-nbctl show
ovn-sbctl show重要なのは、どの層までは正しく見えているかを順番に切り分けることです。VM が起動していることと、VM が正しい logical network に接続されていることは別です。
KVM 土台記事との違い
KVM の基本設定記事では、package、service、OVN external IDs、provider bridge、bridge mappings、localnet の土台を扱いました。この記事では、その土台の上に VM interface をどう接続するかを扱っています。
つまり、前の記事は基盤側の準備、この記事は VM 接続の考え方です。VM の disk 作成、domain 定義、起動処理は後続の VM 作成記事で扱います。
まとめ
Ubuntu 26.04 で KVM と OVS / OVN を組み合わせる場合、VM の network は br-int、OVN logical switch、logical switch port、provider bridge、localnet の関係で決まります。
libvirt から見ると bridge interface ですが、OVN から見ると logical switch port です。この二つを interfaceid で対応させることが、VM を OVN network に接続する要点です。
KVM の network 設計では、VM に NIC を付けるだけでなく、その NIC がどの logical switch に属し、どの provider network に出るのかまで整理しておく必要があります。
参考書籍
ハイパーバイザ、仮想デバイス、メモリ、I/O など、VM 基盤の仕組みを低レイヤから理解したい場合の参考書籍です。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。

