Ubuntu 26.04 で KVM を使うだけなら、qemu-system、libvirt、virtinst を入れれば最小構成は作れます。しかし、この記事で扱うのは、単なる KVM ホストではありません。
ここでは、KVM / libvirt を土台にしながら、Open vSwitch と OVN も同じ基盤に載せ、VM を論理スイッチや provider network に接続できるようにする構成を整理します。一般的な KVM 入門より少し重い構成ですが、複数 VLAN、localnet、VM ネットワーク分離を前提にする場合は、この形にしておく意味があります。
この記事で作る土台
KVM は Linux kernel の仮想化機能です。libvirt は VM の定義、起動、ストレージ、仮想 NIC を扱う管理層です。Open vSwitch は仮想 switch、OVN はその上で logical switch や localnet を扱う制御層です。
| 要素 | 役割 |
|---|---|
| KVM / QEMU | VM を実行する仮想化基盤 |
| libvirt | VM domain、disk、interface、network を管理する |
| Open vSwitch | VM が接続する仮想 switch と provider bridge を扱う |
| OVN central | logical switch などの OVN northbound / southbound database を持つ |
| OVN host | OVS と連携し、logical network を host 上で実現する |
| provider bridge | 物理 NIC や bond と VM 用 logical network を接続する |
普通の自宅 KVM や単一 bridge の VM ホストであれば、ここまでの構成は過剰です。一方、Kubernetes、DNS、LDAP、mail、proxy などの VM を複数 segment に分けて動かすなら、KVM 単体ではなく、OVS / OVN まで含めて土台を作る方が整理しやすくなります。
仮想化支援を確認する
まず CPU の仮想化支援が有効になっているか確認します。Intel では vmx、AMD では svm が見えます。
lscpu | grep -E 'Virtualization|Model name'
grep -E 'vmx|svm' /proc/cpuinfo | head
lsmod | grep kvmkvm_intel または kvm_amd が読み込まれていない場合は、BIOS / UEFI 側の virtualization 設定、nested virtualization の有無、kernel module の状態を確認します。
KVM / libvirt / OVS / OVN をインストールする
KVM ホストとして必要な package に加えて、OVS / OVN もまとめて入れます。VM template 作成で使う virtinst、ovmf、cloud-image-utils、Cockpit の VM 管理用 package も入れておきます。
sudo apt update
sudo apt install -y qemu-system qemu-utils libvirt-daemon-system libvirt-clients libosinfo-bin virtinst ovmf cockpit-machines cloud-image-utils openvswitch-switch ovn-common ovn-host ovn-centralインストール後は、libvirt、Open vSwitch、OVN central、OVN host の service を起動します。
sudo systemctl enable --now libvirtd.service
sudo systemctl enable --now openvswitch-switch.service
sudo systemctl enable --now ovn-central.service
sudo systemctl enable --now ovn-host.service
systemctl status libvirtd.service --no-pager
systemctl status openvswitch-switch.service --no-pagerVM image と ISO の置き場所を用意する
libvirt の image は通常 /var/lib/libvirt/images に置きます。ISO や autoinstall 用の media は、image directory 配下に専用 directory を切っておくと整理しやすくなります。
sudo mkdir -p /var/lib/libvirt/images/iso
sudo chmod 755 /var/lib/libvirt/images/iso
ls -ld /var/lib/libvirt/images /var/lib/libvirt/images/isoこの記事では土台だけを扱うため、ISO の配置、autoinstall、qcow2 template の作成は後続の記事で扱います。
OVN external IDs を設定する
OVN host がどの southbound database を見に行くか、どの encapsulation を使うかを Open vSwitch の external IDs に設定します。単一ホスト内で OVN central と OVN host を動かす場合は、unix:/var/run/ovn/ovnsb_db.sock を使えます。
sudo ovs-vsctl set Open_vSwitch . external_ids:ovn-remote=unix:/var/run/ovn/ovnsb_db.sock
sudo ovs-vsctl set Open_vSwitch . external_ids:ovn-encap-type=geneve
sudo ovs-vsctl set Open_vSwitch . external_ids:ovn-encap-ip=127.0.0.1
sudo ovs-vsctl get Open_vSwitch . external_ids複数ホストで OVN を構成する場合、ovn-encap-ip は host 間で到達可能な underlay IP にする必要があります。ここを 127.0.0.1 のままにできるのは、単一ホスト内で完結する構成か、検証用途に限られます。
br-int と provider bridge を分ける
OVN では、VM が接続する integration bridge と、物理 network へ出る provider bridge を分けて考えます。br-int は OVN が VM の logical port を扱う bridge です。provider bridge は物理 NIC や bond を収容し、localnet と外部 network を接続します。
| bridge | 役割 |
|---|---|
br-int | VM の logical port を収容する integration bridge |
brphys0 | 物理 NIC や bond を収容する provider bridge |
| localnet port | OVN logical switch と provider bridge の対応を作る |
| bridge mappings | OVN の network_name と OVS bridge の対応を登録する |
br-int は OVN が利用する前提の bridge です。provider bridge は物理 network との接続点になるため、どの NIC を収容するか、VLAN trunk をどう扱うかを先に決めます。
sudo ovs-vsctl show
sudo ovs-vsctl br-exists br-int
sudo ovs-vsctl add-br brphys0
sudo ovs-vsctl add-port brphys0 enp3s0
sudo ovs-vsctl set Interface brphys0 mtu_request=1500
sudo ovs-vsctl set Interface enp3s0 mtu_request=1500物理 NIC を provider bridge に追加すると、その NIC の扱いが変わります。既存の管理通信に使っている interface を不用意に OVS に収容すると接続断になるため、作業前に管理経路と対象 NIC を分けて確認します。
VLAN trunk を provider port に設定する
provider bridge に接続する物理 port で VLAN を trunk する場合は、OVS の Port に trunks を設定します。
sudo ovs-vsctl set Port enp3s0 trunks=2001,2256
sudo ovs-vsctl list Port enp3s0VLAN を使わない provider network では trunks は不要です。複数 VLAN を VM 側 logical switch に分ける場合は、OVN の localnet port と VLAN tag を合わせて設計します。
OVN bridge mappings を設定する
OVN の localnet では、logical network 名と OVS bridge の対応を ovn-bridge-mappings に登録します。たとえば phys0 という network_name を brphys0 に対応させます。
sudo ovs-vsctl set Open_vSwitch . external_ids:ovn-bridge-mappings=phys0:brphys0
sudo ovs-vsctl get Open_vSwitch . external_ids:ovn-bridge-mappings複数の provider bridge を使う場合は、phys0:brphys0,phys1:brphys1 のように対応を並べます。ここがずれると、OVN 側で localnet port を作っても物理 network へ出られません。
OVN logical switch と localnet port を作成する
OVN 側に logical switch を作成し、必要に応じて localnet port を追加します。localnet port には network_name を設定し、bridge mappings と対応させます。
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
sudo ovn-nbctl showVLAN tag を付けない localnet であれば、tag は設定しません。OVN の logical switch は VM の接続先になり、後続の VM 作成記事では libvirt の interface と OVN logical port を対応させます。
libvirt と KVM の状態を確認する
libvirt が VM を管理できる状態か確認します。VM がまだない段階でも、daemon、default network、storage pool、host capabilities は確認できます。
virsh version
virsh nodeinfo
virsh list --all
virsh pool-list --all
virsh net-list --allこの段階で見るべきなのは、VM が動くかどうかではなく、VM を作るための管理層が揃っているかです。VM template や domain 定義は後続の記事で扱います。
この構成が過剰になる場合
KVM を使うだけなら、Linux bridge と libvirt default network だけでも十分なことがあります。Open vSwitch と OVN を入れると、logical switch、localnet、bridge mappings、encapsulation、provider bridge という設計要素が増えます。
そのため、単一 VM を動かすだけの用途では過剰です。一方で、複数 segment の VM、VLAN trunk、Kubernetes node、DNS / LDAP / mail / proxy などを VM として分ける場合は、OVS / OVN を最初から入れておくと、後から network 設計を作り直す負担を減らせます。
トラブル時に確認すること
KVM / libvirt / OVS / OVN は層が多いため、障害時はどこで止まっているかを分けて確認します。
systemctl status libvirtd.service --no-pager
systemctl status openvswitch-switch.service --no-pager
systemctl status ovn-central.service --no-pager
systemctl status ovn-host.service --no-pager
ovs-vsctl show
ovs-vsctl get Open_vSwitch . external_ids
ovn-nbctl show
ovn-sbctl showlibvirt の問題なのか、OVS bridge の問題なのか、OVN の logical switch / localnet の問題なのかを分けます。VM が起動しない問題と、VM が network へ出られない問題は別です。
まとめ
Ubuntu 26.04 で KVM 基盤を作る場合、最小構成なら KVM / QEMU / libvirt だけで始められます。しかし、VM を複数の logical network に接続し、provider network や VLAN と接続するなら、Open vSwitch と OVN まで含めて土台を作る方が自然です。
この記事で扱った範囲は、VM を作る前の基盤部分です。package、service、image directory、OVN external IDs、provider bridge、bridge mappings、logical switch、localnet port を整えておくことで、後続の VM template 作成、VM domain 定義、ACL 設定へ進みやすくなります。
参考書籍
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、仮想デバイスなど、仮想化基盤を低レイヤから理解したい場合の参考書籍です。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。

