手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 KVM ブリッジネットワークの基本設定 – OVS / OVN で VM を接続する

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 で対応します。

領域見るもの役割
libvirtdomain XML の interfaceVM の仮想 NIC をどの bridge に接続するかを定義する
Open vSwitchbr-int、provider bridge、port仮想 NIC と物理 network の接続点を持つ
OVNlogical switch、logical switch portVM 用の論理 L2 network を作る
localnetnetwork_name、bridge mapping、VLAN tagOVN logical network と物理 network を接続する
VM 設定interface_id、MAC、MTUlibvirt 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 show

unknown は、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-9ee074c52de0

VM が複数 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_namephys0 であれば、その 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 show

virsh 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 showinterface_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 アソシエイトリンクです。

Ubuntu 26.04 KVM ブリッジネットワークの基本設定 – OVS / OVN で VM を接続する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る