この記事では、Ubuntu 26.04 の KVM 環境で再利用する VM テンプレートを作成する流れを整理します。ここでいうテンプレートは、後続の VM 作成で複製元にする qcow2 イメージです。
ISO、autoinstall、virt-install、qcow2、UEFI / OVMF、停止済みテンプレートという流れを分けて確認します。VM テンプレートは単なるインストール済みイメージではなく、後続の VM 作成で設定の揺れを減らすための複製元です。
- VM テンプレートを作る目的
- 既存 domain と qcow2 の整合性確認
- ISO と autoinstall seed の準備
virt-installによるテンプレート VM の作成- インストール完了後に停止した qcow2 をテンプレートとして残す考え方
| 対象 OS | Ubuntu 26.04 Server |
|---|---|
| 仮想化基盤 | KVM / QEMU / libvirt |
| テンプレート形式 | qcow2 |
| インストール方式 | Ubuntu Server ISO + autoinstall |
| 接続 URI | qemu:///system |
- 既存 domain と qcow2 の状態を確認する
- ISO とイメージ格納先を確認する
- autoinstall seed を HTTP で参照できるようにする
virt-installでテンプレート VM を作成する- インストール完了と停止状態を確認する
- libvirt domain を削除し、qcow2 をテンプレートとして残す
書籍
作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
VM テンプレートを作る目的
VM を毎回 ISO からインストールすると、時間がかかり、初期設定の揺れも発生します。テンプレート用の qcow2 を一度作っておくと、後続の VM はそのイメージを複製して作成できます。
ここでは、テンプレート VM を一時的に libvirt domain として作成し、autoinstall でインストールを完了させます。インストール後に VM が停止したら、domain を undefine して qcow2 イメージだけを残します。
既存 domain と qcow2 の状態を確認する
テンプレート作成をやり直す前に、libvirt domain と qcow2 の状態を分けて確認します。domain が残っているのにディスクがない、またはディスクだけが残っている、という状態を放置すると、再実行時に意図しない上書きや失敗につながります。
virsh --connect qemu:///system dominfo ubuntu-template-40g
test -e /var/lib/libvirt/images/ubuntu-template-40g.qcow2
ls -lh /var/lib/libvirt/images/ubuntu-template-40g.qcow2ISO とディレクトリを確認する
Ubuntu Server ISO と、VM イメージを置くディレクトリを確認します。ISO は /var/lib/libvirt/images/iso、VM イメージは /var/lib/libvirt/images に置く例にします。
sudo install -d -o root -g root -m 0755 /var/lib/libvirt/images
sudo install -d -o root -g root -m 0755 /var/lib/libvirt/images/iso
ls -lh /var/lib/libvirt/images/iso
ls -ld /var/lib/libvirt/imagesISO ファイル名は環境に合わせます。記事では例として ubuntu-26.04-live-server-amd64.iso を使います。実際の ISO 名が異なる場合は読み替えます。
autoinstall seed を用意する
Ubuntu Server の自動インストールでは、NoCloud datasource として user-data と meta-data を参照させます。ここでは HTTP で seed を配信する前提にします。
sudo install -d -o root -g root -m 0755 /var/www/html/autoinstall/ubuntu-template
sudo touch /var/www/html/autoinstall/ubuntu-template/meta-data
sudo chmod 0644 /var/www/html/autoinstall/ubuntu-template/meta-datauser-data には実際の初期ユーザー、SSH 鍵、パッケージ、後処理などを定義します。ここでは構造を示すための最小例に留めます。実運用ではパスワードや秘密情報を記事の例に直接入れないようにします。
#cloud-config
autoinstall:
version: 1
identity:
hostname: ubuntu-template
username: ubuntu
password: "$6$CHANGE_ME_HASHED_PASSWORD"
ssh:
install-server: true
allow-pw: false
packages:
- qemu-guest-agent
late-commands:
- curtin in-target --target=/target -- systemctl enable qemu-guest-agentHTTP で参照できることを確認します。例では seed 配信元を 192.0.2.10 としています。これは記事用の例示アドレスです。
curl -I http://192.0.2.10/autoinstall/ubuntu-template/user-data
curl -I http://192.0.2.10/autoinstall/ubuntu-template/meta-datavirt-install スクリプトを作成する
virt-install でテンプレート VM を作成します。重要なのは、インストール元 ISO、autoinstall seed URL、qcow2 ディスク、UEFI boot、シリアルコンソールを明示することです。テンプレート作成では、VM を使い続けることではなく、インストール済み qcow2 を安全に残すことが目的になります。
sudo tee /usr/local/bin/virt-install-ubuntu-template-40g.sh >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
virt-install \
--connect qemu:///system \
--name ubuntu-template-40g \
--os-variant ubuntu24.04 \
--vcpus 2 \
--memory 4096 \
--machine q35 \
--disk path=/var/lib/libvirt/images/ubuntu-template-40g.qcow2,size=40,format=qcow2,sparse=true \
--location /var/lib/libvirt/images/iso/ubuntu-26.04-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
--extra-args 'cloud-config-url=/dev/null ip=dhcp autoinstall ds=nocloud-net;s=http://192.0.2.10/autoinstall/ubuntu-template/ console=ttyS0' \
--boot uefi \
--network network=default \
--graphics none \
--console pty,target_type=serial \
--noautoconsole
EOF
sudo chmod 0755 /usr/local/bin/virt-install-ubuntu-template-40g.sh--os-variant は利用している libosinfo の定義に依存します。Ubuntu 26.04 用の定義がまだない環境では、近い Ubuntu の variant を指定することがあります。ここでは例として ubuntu24.04 を使っていますが、利用環境で osinfo-query os を確認して調整します。テンプレート VM を作成する
作成したスクリプトを実行します。autoinstall が正しく動くと、インストール完了後に VM は停止します。テンプレート作成では、この停止状態になることが重要です。
sudo /usr/local/bin/virt-install-ubuntu-template-40g.sh別端末で libvirt domain の状態を確認します。インストール中は running、完了後は shut off になります。
virsh --connect qemu:///system dominfo ubuntu-template-40g
virsh --connect qemu:///system domstate ubuntu-template-40g
ls -lh /var/lib/libvirt/images/ubuntu-template-40g.qcow2libvirt domain を削除して qcow2 を残す
テンプレート VM が停止したら、libvirt domain を削除します。ここで削除するのは domain 定義であり、テンプレートとして使う qcow2 は残します。UEFI / OVMF を使うため、NVRAM も合わせて削除します。
sudo virsh --connect qemu:///system undefine ubuntu-template-40g --nvram
ls -lh /var/lib/libvirt/images/ubuntu-template-40g.qcow2この状態で残った ubuntu-template-40g.qcow2 が、後続の VM 作成で複製元になります。テンプレート自体を起動して使い続けるのではなく、コピーして個別 VM 用のディスクを作るのが基本です。
複数サイズのテンプレートを作る場合
用途に応じて 40GB、80GB など複数のテンプレートを用意することもできます。大きなテンプレートを一つだけ作るより、用途別にサイズを分けておくと、後続の VM 作成で扱いやすくなります。
| テンプレート名 | 用途 | ディスクサイズ |
|---|---|---|
ubuntu-template-40g.qcow2 | 小規模 VM、検証用 | 40GB |
ubuntu-template-80g.qcow2 | 少し余裕を持たせたい VM | 80GB |
確認ポイント
- Ubuntu Server ISO が存在する
- autoinstall の
user-dataとmeta-dataを HTTP で取得できる virt-installがエラーなく完了する- インストール完了後に VM が
shut offになる virsh undefine --nvram後も qcow2 が残っている- 作成済みテンプレートを再実行で上書きしない運用になっている
まとめ
KVM の VM テンプレートは、後続の VM 作成を安定させるための複製元です。ISO、autoinstall、virt-install、qcow2、UEFI / OVMF、停止状態の確認を分けて考えると、テンプレート作成の流れが整理しやすくなります。
この段階でテンプレート qcow2 ができていれば、次はそのイメージを複製して、個別の VM 定義、ネットワーク、CPU、メモリ、ディスクを設定する流れに進めます。

