手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 KVM VM の作成 – テンプレート qcow2 から libvirt domain を定義する

Ubuntu 26.04 仮想化基盤の関連記事

この記事では、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 する流れ
対象 OSUbuntu 26.04 Server
仮想化基盤KVM / QEMU / libvirt
ネットワークOpen vSwitch / OVN / br-int
ディスクqcow2 / virtio / io_uring / cache=none
ファームウェアUEFI / OVMF
接続 URIqemu:///system
  1. テンプレート qcow2 と既存 domain の状態を確認する
  2. テンプレートから VM 用 qcow2 を作成する
  3. OVMF NVRAM を VM ごとにコピーする
  4. OVN logical switch port を用意する
  5. libvirt XML を作成して domain を define する
  6. VM を起動して状態を確認する
参考
書籍
参考書籍

作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ

KVM / QEMU の仮想デバイス、CPU 仮想化、メモリ仮想化、I/O 経路を理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

VM 作成で決めること

項目内容
VM 名libvirt domain name として使う名前
base image複製元になるテンプレート qcow2
target imageVM ごとの qcow2 image
vCPU / memory用途に応じた resource profile
UEFI NVRAMVM ごとの OVMF_VARS
networkOVN logical switch port と virtio NIC
disk drivervirtio、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.qcow2
同名 domain が存在するのに VM 用 qcow2 がない場合は、domain 定義だけが残っている可能性があります。逆に qcow2 だけが残っている場合は、以前の作成途中のディスクか、意図して残した VM ディスクかを確認してから進めます。

VM 用 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.qcow2

preallocation=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.fd

OVN 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-int
ここでは例として ls-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 を同じ感覚で作ると、後から性能確認やキャパシティ管理が曖昧になります。

profilevCPUmemory用途
small24096 MiB小規模 VM、検証用
medium48192 MiB少し余裕を持たせたい VM

確認ポイント

  • テンプレート qcow2 と VM 用 qcow2 を混同していない
  • VM ごとに OVMF NVRAM を分けている
  • OVN logical switch port と libvirt XML の interfaceid が一致している
  • disk driver、cache、io、discard の設定を意図して選んでいる
  • VM 起動後に domiflistdomblklist、OVN 側の状態を確認している
VM パフォーマンス関連記事

まとめ

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、パフォーマンス確認の記事で実際の状態を確認します。

Ubuntu 26.04 KVM VM 作成後に読む記事
Ubuntu 26.04 KVM VM の作成 – テンプレート qcow2 から libvirt domain を定義する

コメントを残す

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

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

トップへ戻る