手当たり次第に書くんだ

飽きっぽいのは本能

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

Ubuntu 26.04 サーバー管理ガイドへ戻る

Ubuntu 26.04 で KVM ホストを作る場合、単に qemulibvirt を入れれば終わり、という構成もあります。小さな検証環境であれば、それで十分な場合もあります。

ただし、この環境では 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-systemlibvirt-daemon-systemvirtinst 程度で始められます。しかし、この構成では最初から OVS / OVN を含めます。これは一般的な単体 KVM ホストとしてはやや過剰です。

理由は、後続で複数 VM、provider bridge、OVN logical network、VM ごとの ACL、HugePages、性能確認まで扱うためです。つまり、KVM ホストを「VM が起動する場所」ではなく、「VM ネットワークを含めて管理する基盤」として作ります。

領域役割
KVM / QEMUVM を実行する仮想化機能
libvirtVM 定義、起動、停止、ストレージ、ネットワークを管理する API / daemon
OVSprovider bridge、integration bridge、物理 NIC との接続を扱う
OVNlogical switch、localnet、論理ポート、ACL の土台を作る
Cockpit MachinesWeb 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-switchovn-centralovn-hostlibvirtd を有効化する
OVN external IDsovn-remoteovn-encap-typeovn-encap-ip を設定する
provider bridge外部接続用 OVS bridge と port を作成する
bridge mappingsOVN の localnet と OVS bridge を対応付ける
logical networkOVN 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-central

ovmf は UEFI boot の VM を扱うために使います。virtinstvirt-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/iso

KVM と 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 --all

vmx または svm が見えない場合は、BIOS / UEFI 側で仮想化支援が無効になっている可能性があります。VM 上の nested virtualization で使う場合も、上位 hypervisor 側の設定が必要です。

OVS / OVN サービスを起動する

OVS と OVN を使う構成では、libvirt より前にネットワーク基盤の状態も確認します。Ansible role では openvswitch-switch.serviceovn-central.serviceovn-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 show

provider 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-mappings

provider: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 show

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

libvirt だけ見ても、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 ACLOVN logical port 単位で通信制御する
KVM HugePagesVM 用メモリを起動時に予約する
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 作成やネットワーク設計の見通しが良くなります。

関連する記事

関連する記事

Ubuntu 26.04 サーバー管理ガイドへ戻る

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

コメントを残す

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

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

トップへ戻る