手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 KVM の基本設定 – libvirt / Open vSwitch / OVN の土台を作る

Ubuntu 26.04 で KVM を使うだけなら、qemu-systemlibvirtvirtinst を入れれば最小構成は作れます。しかし、この記事で扱うのは、単なる 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 / QEMUVM を実行する仮想化基盤
libvirtVM domain、disk、interface、network を管理する
Open vSwitchVM が接続する仮想 switch と provider bridge を扱う
OVN centrallogical switch などの OVN northbound / southbound database を持つ
OVN hostOVS と連携し、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 kvm

kvm_intel または kvm_amd が読み込まれていない場合は、BIOS / UEFI 側の virtualization 設定、nested virtualization の有無、kernel module の状態を確認します。

KVM / libvirt / OVS / OVN をインストールする

KVM ホストとして必要な package に加えて、OVS / OVN もまとめて入れます。VM template 作成で使う virtinstovmfcloud-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-pager

VM 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-intVM の logical port を収容する integration bridge
brphys0物理 NIC や bond を収容する provider bridge
localnet portOVN logical switch と provider bridge の対応を作る
bridge mappingsOVN の 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 enp3s0

VLAN を使わない 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 show

VLAN 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 show

libvirt の問題なのか、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 アソシエイトリンクです。

Ubuntu 26.04 KVM の基本設定 – libvirt / Open vSwitch / OVN の土台を作る

コメントを残す

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

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

トップへ戻る