この記事では、Ubuntu 26.04 の KVM / libvirt 環境で、テンプレート qcow2 から VM 用ディスクを作成し、OVMF NVRAM、OVN logical switch port、libvirt XML を用意して VM を起動する流れを整理します。
ここで扱う構成は、単純に KVM だけで VM を起動する構成より少し複雑です。Open vSwitch / OVN、HugePages、io_uring、UEFI / OVMF を前提にしているため、VM 作成時に見るべき境界も増えます。
- テンプレート qcow2 から VM 用ディスクを作成する考え方
- OVMF NVRAM を VM ごとに分ける理由
- OVN logical switch port と libvirt の
interfaceidを対応させること - libvirt XML を作成し、domain を define / start する流れ
| 対象 OS | Ubuntu 26.04 Server |
|---|---|
| 仮想化基盤 | KVM / QEMU / libvirt |
| ネットワーク | Open vSwitch / OVN / br-int |
| ディスク | qcow2 / virtio / io_uring / cache=none |
| ファームウェア | UEFI / OVMF |
| 接続 URI | qemu:///system |
- テンプレート qcow2 と既存 domain の状態を確認する
- テンプレートから VM 用 qcow2 を作成する
- OVMF NVRAM を VM ごとにコピーする
- OVN logical switch port を用意する
- libvirt XML を作成して domain を define する
- VM を起動して状態を確認する
書籍
作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ
KVM / QEMU の仮想デバイス、CPU 仮想化、メモリ仮想化、I/O 経路を理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
VM 作成で決めること
| 項目 | 内容 |
|---|---|
| VM 名 | libvirt domain name として使う名前 |
| base image | 複製元になるテンプレート qcow2 |
| target image | VM ごとの qcow2 image |
| vCPU / memory | 用途に応じた resource profile |
| UEFI NVRAM | VM ごとの OVMF_VARS |
| network | OVN logical switch port と virtio NIC |
| disk driver | virtio、io_uring、cache=none など |
重要なのは、ディスク、NVRAM、OVN logical switch port、libvirt domain を同じ VM の構成要素として揃えることです。どれか一つだけ作っても VM は安定して起動しません。
テンプレートディスクと既存 domain を確認する
まず、VM の元になるテンプレート qcow2 が存在することを確認します。さらに、同名の libvirt domain や VM 用ディスクが既に残っていないかを確認します。中途半端な状態で作成を進めると、既存 VM の上書きや define の失敗につながります。
sudo test -f /var/lib/libvirt/images/ubuntu-template-40g.qcow2
qemu-img info /var/lib/libvirt/images/ubuntu-template-40g.qcow2
virsh --connect qemu:///system dominfo vm-example
test -e /var/lib/libvirt/images/vm-example.qcow2VM 用 qcow2 を作成する
テンプレート qcow2 から VM 用の qcow2 を作成します。テンプレート自体を直接起動するのではなく、VM ごとに複製したディスクを使います。
sudo qemu-img convert -f qcow2 -O qcow2 -o preallocation=off /var/lib/libvirt/images/ubuntu-template-40g.qcow2 /var/lib/libvirt/images/vm-example.qcow2
qemu-img info /var/lib/libvirt/images/vm-example.qcow2preallocation=off は、ディスク容量を最初からすべて確保しない指定です。検証環境では扱いやすい一方、本番に近い性能確認では、ストレージ側の特性も含めて別途確認します。
OVMF NVRAM を VM ごとに用意する
UEFI boot を使う場合、OVMF の NVRAM も VM ごとに分けます。複数 VM で同じ NVRAM を共有すると、起動情報が混ざるため避けます。
sudo install -d -o root -g root -m 0755 /var/lib/libvirt/qemu/nvram
sudo cp -n /usr/share/OVMF/OVMF_VARS_4M.fd /var/lib/libvirt/qemu/nvram/vm-example_VARS.fd
sudo chmod 0644 /var/lib/libvirt/qemu/nvram/vm-example_VARS.fdOVN logical switch port を作成する
OVN を使う場合、libvirt の NIC と OVN logical switch port を interfaceid で対応させます。libvirt XML 側の interfaceid と、OVN 側の logical switch port 名が一致することが重要です。
ovn-nbctl --may-exist lsp-add ls-int 11111111-2222-3333-4444-555555555555
ovn-nbctl lsp-set-addresses 11111111-2222-3333-4444-555555555555 unknown
ovn-nbctl clear Logical_Switch_Port 11111111-2222-3333-4444-555555555555 port_security
ovn-nbctl lsp-list ls-intls-int と UUID 形式の interfaceid を使っています。実環境では VM ごとに一意な ID を払い出し、libvirt XML と OVN の両方で同じ値を使います。libvirt XML を作成する
VM の CPU、メモリ、ディスク、NVRAM、NIC を libvirt XML として定義します。KVM の VM 作成では、ここに設計判断が集まります。特に、memoryBacking、disk driver、interface の virtualport は、後続の性能確認や通信制御にも影響します。
<domain type='kvm'>
<name>vm-example</name>
<memory unit='MiB'>4096</memory>
<currentMemory unit='MiB'>4096</currentMemory>
<vcpu placement='static' current='2'>2</vcpu>
<cpu mode='host-passthrough' check='none' migratable='on'>
<topology sockets='1' cores='2' threads='1'/>
</cpu>
<memoryBacking>
<hugepages/>
</memoryBacking>
<os>
<type arch='x86_64' machine='q35'>hvm</type>
<loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE_4M.fd</loader>
<nvram template='/usr/share/OVMF/OVMF_VARS_4M.fd'>/var/lib/libvirt/qemu/nvram/vm-example_VARS.fd</nvram>
<boot dev='hd'/>
</os>
<features>
<acpi/>
</features>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' io='io_uring' cache='none' discard='unmap' detect_zeroes='unmap'/>
<source file='/var/lib/libvirt/images/vm-example.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<source bridge='br-int'/>
<model type='virtio'/>
<virtualport type='openvswitch'>
<parameters interfaceid='11111111-2222-3333-4444-555555555555'/>
</virtualport>
</interface>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<serial type='pty'>
<target port='0'/>
</serial>
</devices>
</domain>VM を define して起動する
XML を作成したら、libvirt domain として define します。既に domain が存在する場合は、XML の変更内容と既存 domain の状態を確認してから再 define します。
sudo virsh --connect qemu:///system define /home/myadmin/work/libvirt/qemu/vm-example.xml
virsh --connect qemu:///system dominfo vm-example
virsh --connect qemu:///system domstate vm-example
sudo virsh --connect qemu:///system start vm-example起動後に確認する
VM が起動したら、libvirt、OVN、ディスク、コンソールの各観点で状態を確認します。単に running になっているだけではなく、期待した NIC とディスクで起動しているかを見ることが重要です。
virsh --connect qemu:///system domstate vm-example
virsh --connect qemu:///system domiflist vm-example
virsh --connect qemu:///system domblklist vm-example
virsh --connect qemu:///system console vm-example
ovn-nbctl lsp-get-addresses 11111111-2222-3333-4444-555555555555リソース profile を分ける
VM の CPU とメモリは、用途ごとに profile として分けておくと管理しやすくなります。小規模 VM と中規模 VM を同じ感覚で作ると、後から性能確認やキャパシティ管理が曖昧になります。
| profile | vCPU | memory | 用途 |
|---|---|---|---|
small | 2 | 4096 MiB | 小規模 VM、検証用 |
medium | 4 | 8192 MiB | 少し余裕を持たせたい VM |
確認ポイント
- テンプレート qcow2 と VM 用 qcow2 を混同していない
- VM ごとに OVMF NVRAM を分けている
- OVN logical switch port と libvirt XML の
interfaceidが一致している - disk driver、cache、io、discard の設定を意図して選んでいる
- VM 起動後に
domiflist、domblklist、OVN 側の状態を確認している
まとめ
Ubuntu 26.04 で KVM VM を作成する場合、テンプレート qcow2 を複製するだけでは不十分です。VM 用ディスク、OVMF NVRAM、OVN logical switch port、libvirt XML、domain define、起動後確認までを一つの流れとして扱う必要があります。
この構成は一般的な KVM 入門より複雑ですが、OVS / OVN、HugePages、io_uring、virtio を前提にした VM 運用へつなげやすい形です。VM 作成後は、ACL、HugePages、パフォーマンス確認の記事で実際の状態を確認します。

