Ubuntu 26.04 で KVM ホストを作る場合、単に qemu と libvirt を入れれば終わり、という構成もあります。小さな検証環境であれば、それで十分な場合もあります。
ただし、この環境では KVM を単体の仮想化ホストとしてではなく、Open vSwitch と OVN を組み合わせた VM 基盤として扱います。libvirt で VM を動かし、OVS で bridge / port を管理し、OVN で logical switch や localnet を扱える土台を作る、という位置づけです。
この記事では、Ubuntu 26.04 に KVM、libvirt、OVS、OVN の基本パッケージとサービスを整え、VM を配置できる基盤の入口を作る考え方を整理します。手元の Ansible role では 2505-kvm-base がこの役割を持っています。
この構成は一般的な KVM より少し重い
KVM を使うだけなら、qemu-system、libvirt-daemon-system、virtinst 程度で始められます。しかし、この構成では最初から OVS / OVN を含めます。これは一般的な単体 KVM ホストとしてはやや過剰です。
理由は、後続で複数 VM、provider bridge、OVN logical network、VM ごとの ACL、HugePages、性能確認まで扱うためです。つまり、KVM ホストを「VM が起動する場所」ではなく、「VM ネットワークを含めて管理する基盤」として作ります。
| 領域 | 役割 |
|---|---|
| KVM / QEMU | VM を実行する仮想化機能 |
| libvirt | VM 定義、起動、停止、ストレージ、ネットワークを管理する API / daemon |
| OVS | provider bridge、integration bridge、物理 NIC との接続を扱う |
| OVN | logical switch、localnet、論理ポート、ACL の土台を作る |
| Cockpit Machines | Web UI から VM 状態を確認する補助機能 |
KVM base role が行うこと
2505-kvm-base role は、KVM ホストに必要なパッケージ、サービス、ISO ディレクトリ、OVS / OVN の外部 ID、provider bridge、OVN logical network をまとめて扱います。
| 処理 | 内容 |
|---|---|
| パッケージ導入 | QEMU、libvirt、virt-install、OVMF、OVS、OVN を導入する |
| ISO ディレクトリ | /var/lib/libvirt/images/iso を作成する |
| サービス起動 | openvswitch-switch、ovn-central、ovn-host、libvirtd を有効化する |
| OVN external IDs | ovn-remote、ovn-encap-type、ovn-encap-ip を設定する |
| provider bridge | 外部接続用 OVS bridge と port を作成する |
| bridge mappings | OVN の localnet と OVS bridge を対応付ける |
| logical network | OVN logical switch と localnet port を作成する |
必要なパッケージを導入する
KVM ホストの土台として、QEMU、libvirt、virt-install、OVMF、Cockpit Machines、cloud-image-utils、OVS、OVN を導入します。
sudo apt update
sudo apt install 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-centralovmf は UEFI boot の VM を扱うために使います。virtinst は virt-install を使って VM を作るために必要です。cloud-image-utils は cloud-init や seed image を扱う場面で使います。
ISO ディレクトリを作成する
ISO やインストールメディアを置く場所として、/var/lib/libvirt/images/iso を用意します。VM ディスクと ISO を分けておくと、後続のテンプレート作成や VM 作成で扱いやすくなります。
sudo install -d -m 0755 -o root -g root /var/lib/libvirt/images/iso
ls -ld /var/lib/libvirt/images /var/lib/libvirt/images/isoKVM と libvirt の状態を確認する
パッケージを入れたら、CPU の仮想化支援、KVM module、libvirt service、qemu system connection を確認します。
egrep -c '(vmx|svm)' /proc/cpuinfo
lsmod | grep -E 'kvm|kvm_intel|kvm_amd' || true
systemctl status libvirtd --no-pager
virsh --connect qemu:///system list --allvmx または svm が見えない場合は、BIOS / UEFI 側で仮想化支援が無効になっている可能性があります。VM 上の nested virtualization で使う場合も、上位 hypervisor 側の設定が必要です。
OVS / OVN サービスを起動する
OVS と OVN を使う構成では、libvirt より前にネットワーク基盤の状態も確認します。Ansible role では openvswitch-switch.service、ovn-central.service、ovn-host.service を有効化しています。
sudo systemctl enable --now openvswitch-switch
sudo systemctl enable --now ovn-central
sudo systemctl enable --now ovn-host
systemctl status openvswitch-switch --no-pager
systemctl status ovn-central --no-pager
systemctl status ovn-host --no-pager単体ホストで OVN を使う場合、OVN central と OVN host を同じホスト上で動かす構成になります。複数ホストへ広げる場合は、central と host の配置、Southbound DB への接続、encap IP の設計が別途必要になります。
OVN external IDs を設定する
OVN host がどの OVN Southbound DB を見に行くのか、どの tunnel encapsulation を使うのかを OVS の external IDs に設定します。この構成では、単体ホストの入口として unix:/var/run/ovn/ovnsb_db.sock、encap type は geneve を使います。
sudo ovs-vsctl set Open_vSwitch . external_ids:ovn-remote=unix:/var/run/ovn/ovnsb_db.sock external_ids:ovn-encap-type=geneve external_ids:ovn-encap-ip=127.0.0.1
sudo ovs-vsctl get Open_vSwitch . external_ids複数ホスト構成では ovn-encap-ip に loopback ではなく、各ホスト間で到達できるアドレスを設定します。ここを誤ると、OVN の論理ネットワークを作っても実際の tunnel が成立しません。
provider bridge を作成する
外部ネットワークや物理 NIC と接続する場合は、provider bridge を作ります。Ansible role では bridge の存在確認を行い、存在しなければ ovs-vsctl add-br で作成します。
sudo ovs-vsctl br-exists br-provider || sudo ovs-vsctl add-br br-provider
sudo ovs-vsctl showprovider bridge に物理 NIC を入れる場合は、既存のネットワーク設定に影響します。特に管理用 NIC を誤って bridge へ移すと、SSH 接続を失う可能性があります。物理 port を扱う作業は、Netplan や上位スイッチの VLAN 設計と合わせて行います。
provider port と trunk VLAN を考える
provider bridge に物理 port を追加すると、VM 側の論理ネットワークと外部ネットワークを接続できます。Ansible role では、port が既に別 bridge に所属していないか、OS 上にデバイスとして存在するかを確認してから追加します。
ip link show dev enp1s0
sudo ovs-vsctl port-to-br enp1s0 || true
sudo ovs-vsctl add-port br-provider enp1s0
sudo ovs-vsctl set Port enp1s0 trunks=10,20,30この例では enp1s0 を provider port としていますが、実際のインターフェイス名や VLAN は環境に合わせます。管理インターフェイスと provider port を混同しないことが重要です。
OVN bridge mappings を設定する
OVN の localnet を OVS bridge に接続するには、ovn-bridge-mappings を設定します。これは、OVN 側の network name と OVS 側の bridge を対応付ける設定です。
sudo ovs-vsctl set Open_vSwitch . external_ids:ovn-bridge-mappings=provider:br-provider
sudo ovs-vsctl get Open_vSwitch . external_ids:ovn-bridge-mappingsprovider:br-provider は、OVN の localnet network name provider を OVS bridge br-provider に対応付ける例です。ここがずれると、logical switch 上の localnet port と実際の bridge がつながりません。
OVN logical switch と localnet port を作る
OVN では logical switch を作り、必要に応じて localnet port を追加します。localnet port は、OVN の論理ネットワークを provider bridge 側へ接続するためのポートです。
sudo ovn-nbctl --may-exist ls-add ls-provider
sudo ovn-nbctl --may-exist lsp-add ls-provider ln-provider
sudo ovn-nbctl lsp-set-type ln-provider localnet
sudo ovn-nbctl lsp-set-options ln-provider network_name=provider
sudo ovn-nbctl lsp-set-addresses ln-provider unknown
sudo ovn-nbctl showlsp-set-addresses unknown は localnet port でよく使う指定です。必要に応じて VLAN tag も logical switch port に設定します。
状態確認コマンド
KVM / libvirt / OVS / OVN の土台ができたら、それぞれの層で状態を確認します。ここで見るべきものは、VM がまだない状態でも基盤として成立しているかです。
systemctl status libvirtd --no-pager
systemctl status openvswitch-switch --no-pager
systemctl status ovn-central --no-pager
systemctl status ovn-host --no-pager
virsh --connect qemu:///system list --all
ovs-vsctl show
ovn-nbctl show
ovn-sbctl showlibvirt だけ見ても、OVS / OVN 側の不整合は分かりません。逆に OVN 側が正常でも、libvirt から VM を定義できなければ KVM ホストとしては不十分です。層を分けて見ることが重要です。
この後に続く記事
KVM base は、後続作業の土台です。ここで VM を直接作り込むのではなく、テンプレート、VM 作成、ACL、HugePages、性能確認へ分けて進めます。
| 後続記事 | 扱う内容 |
|---|---|
| KVM ブリッジネットワーク | OVS / OVN で VM を接続する考え方 |
| KVM VM テンプレート | autoinstall と qcow2 の複製元を作る |
| KVM VM の作成 | テンプレートから libvirt domain を定義する |
| KVM VM ACL | OVN logical port 単位で通信制御する |
| KVM HugePages | VM 用メモリを起動時に予約する |
| KVM VM パフォーマンス確認 | virtio / HugePages / io_uring などを見る |
まとめ
Ubuntu 26.04 の KVM 基本設定では、libvirt だけでなく、OVS / OVN を含めて仮想化基盤の土台を作ります。これは一般的な単体 KVM ホストとしては少し重い構成ですが、VM ネットワーク、provider bridge、localnet、ACL まで扱うなら、最初に境界を整理しておく意味があります。
KVM は VM を動かすための土台です。libvirt は VM を管理する入口です。OVS はホスト側の bridge / port を扱います。OVN は論理ネットワークとポリシーを扱います。この責務分界を意識すると、後続の VM 作成やネットワーク設計の見通しが良くなります。


