Ubuntu 26.04 の KVM 環境で、繰り返し VM を作成するための VM テンプレートを準備します。ここでは、Ubuntu Server ISO と autoinstall seed を使って一度だけインストール VM を作成し、インストール完了後に libvirt domain を削除して、qcow2 ディスクだけをテンプレートとして残す流れを整理します。
テンプレートを作っておくと、以後の VM 作成では OS インストールを毎回実行せず、テンプレートディスクをコピーして個別 VM を定義できます。実際の環境では構成管理で自動化していても、手動で流れを理解しておくと、テンプレート更新や失敗時の切り分けが楽になります。
テンプレート方式の考え方
- Ubuntu Server ISO を使ってテンプレート用 VM を作成する
- autoinstall で無人インストールを完了させる
- インストール後に VM を停止させる
- libvirt domain は削除し、ディスクイメージだけを残す
- 残した qcow2 をコピー元として個別 VM を作成する
この記事ではテンプレート名を ubuntu-template-40g、テンプレートディスクを /var/lib/libvirt/images/ubuntu-template-40g.qcow2 として説明します。
前提
- KVM の基本構築 が完了していること
- KVM Bridge ネットワークの基本設定 を確認済みであること
virt-install、libvirt、cloud-image-utilsが導入済みであること- Ubuntu Server ISO を
/var/lib/libvirt/images/iso配下に配置していること - autoinstall の
user-dataとmeta-dataを HTTP で配布できること
ISO とディレクトリを確認する
まず、テンプレート作成に使う ISO とディスク配置先を確認します。ISO 名は環境に合わせて変更してください。
sudo mkdir -p /var/lib/libvirt/images/iso
sudo ls -lh /var/lib/libvirt/images/iso
sudo ls -ld /var/lib/libvirt/images
ISO_PATH=/var/lib/libvirt/images/iso/ubuntu-26.04-live-server-amd64.iso
test -f "$ISO_PATH" && echo "ISO found: $ISO_PATH"テンプレートディスクがすでに存在する場合は、誤って上書きしないように先に確認します。
TEMPLATE_NAME=ubuntu-template-40g
TEMPLATE_DISK=/var/lib/libvirt/images/${TEMPLATE_NAME}.qcow2
virsh dominfo "$TEMPLATE_NAME" || true
test -e "$TEMPLATE_DISK" && ls -lh "$TEMPLATE_DISK" || trueautoinstall seed を用意する
autoinstall では、user-data と meta-data を NoCloud datasource として配布します。ここでは HTTP で配布する例にします。実際には Web サーバー、TFTP/PXE、構成管理用サーバーなど、自分の環境で管理しやすい場所に置きます。
sudo mkdir -p /var/www/html/autoinstall/ubuntu-template
sudo tee /var/www/html/autoinstall/ubuntu-template/meta-data >/dev/null <<'EOF'
instance-id: ubuntu-template
local-hostname: ubuntu-template
EOFuser-data は環境ごとに変わります。以下は最小構成の例です。パスワードや SSH 鍵はそのまま使わず、自分の環境に合わせて変更してください。
sudo tee /var/www/html/autoinstall/ubuntu-template/user-data >/dev/null <<'EOF'
#cloud-config
autoinstall:
version: 1
locale: ja_JP.UTF-8
keyboard:
layout: jp
identity:
hostname: ubuntu-template
username: myadmin
password: "$6$replace-with-your-hashed-password"
ssh:
install-server: true
allow-pw: false
packages:
- qemu-guest-agent
late-commands:
- curtin in-target --target=/target -- systemctl enable qemu-guest-agent
- curtin in-target --target=/target -- cloud-init clean
- curtin in-target --target=/target -- shutdown -h now
EOFHTTP で取得できるか確認します。
curl -I http://127.0.0.1/autoinstall/ubuntu-template/user-data
curl -I http://127.0.0.1/autoinstall/ubuntu-template/meta-datavirt-install スクリプトを作成する
テンプレート作成はコマンドが長くなりやすいため、スクリプトとして保存してから実行すると再実行や確認がしやすくなります。
sudo tee /usr/local/bin/virt-install-ubuntu-template-40g.sh >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
TEMPLATE_NAME=ubuntu-template-40g
TEMPLATE_DISK=/var/lib/libvirt/images/${TEMPLATE_NAME}.qcow2
ISO_PATH=/var/lib/libvirt/images/iso/ubuntu-26.04-live-server-amd64.iso
SEED_URL=http://127.0.0.1/autoinstall/ubuntu-template/
virt-install --connect qemu:///system --name "$TEMPLATE_NAME" --os-variant ubuntu24.04 --vcpus 2 --memory 4096 --machine q35 --disk "path=${TEMPLATE_DISK},size=40,format=qcow2,sparse=true" --location "${ISO_PATH},kernel=casper/vmlinuz,initrd=casper/initrd" --extra-args "cloud-config-url=/dev/null ip=dhcp autoinstall ds=nocloud-net;s=${SEED_URL} 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 を指定するか、osinfo-query os で利用可能な値を確認します。
osinfo-query os | grep -i ubuntu | tail
virt-install --osinfo list | grep -i ubuntu | tailテンプレート VM を作成する
作成前に domain とディスクの重複を確認し、問題なければ virt-install を実行します。
TEMPLATE_NAME=ubuntu-template-40g
TEMPLATE_DISK=/var/lib/libvirt/images/${TEMPLATE_NAME}.qcow2
virsh dominfo "$TEMPLATE_NAME" && echo "domain exists" || true
test -e "$TEMPLATE_DISK" && echo "disk exists: $TEMPLATE_DISK" || true
sudo /usr/local/bin/virt-install-ubuntu-template-40g.shインストールが開始されたら、必要に応じてコンソールへ接続して進行状況を確認します。
virsh list --all
virsh console ubuntu-template-40g停止完了を待つ
テンプレート用 VM はインストール後に停止するようにしておきます。停止状態になったことを確認します。
watch -n 10 "virsh domstate ubuntu-template-40g; virsh list --allshut off になったら、テンプレートディスクが作成されているか確認します。
virsh domstate ubuntu-template-40g
sudo qemu-img info /var/lib/libvirt/images/ubuntu-template-40g.qcow2
sudo ls -lh /var/lib/libvirt/images/ubuntu-template-40g.qcow2libvirt domain を削除してディスクだけ残す
テンプレートは、以後の VM 作成でコピー元として使うディスクです。テンプレート作成用の libvirt domain は削除し、ディスクだけを残します。UEFI で作成した場合は NVRAM も削除します。
sudo virsh undefine ubuntu-template-40g --nvram
virsh dominfo ubuntu-template-40g || true
sudo ls -lh /var/lib/libvirt/images/ubuntu-template-40g.qcow2テンプレートディスクを保護する
テンプレートディスクを誤って直接起動・変更しないように、所有者やパーミッション、運用ルールを決めておきます。必要であれば読み取り専用に近い扱いにします。
sudo chown root:root /var/lib/libvirt/images/ubuntu-template-40g.qcow2
sudo chmod 0644 /var/lib/libvirt/images/ubuntu-template-40g.qcow2
sudo qemu-img check /var/lib/libvirt/images/ubuntu-template-40g.qcow2テンプレートから VM 用ディスクを作る
個別 VM を作るときは、テンプレートディスクをコピーしてから VM 用の domain を定義します。実際の VM 定義は次の記事で扱いますが、ディスク作成だけなら次のように確認できます。
VM_NAME=test-vm-01
sudo qemu-img create -f qcow2 -F qcow2 -b /var/lib/libvirt/images/ubuntu-template-40g.qcow2 /var/lib/libvirt/images/${VM_NAME}.qcow2
sudo qemu-img info /var/lib/libvirt/images/${VM_NAME}.qcow2差分ディスクとして作る場合は容量効率が良くなりますが、テンプレートディスクを移動・削除すると子ディスクに影響します。運用上は、テンプレートの世代管理と保存場所を明確にしておくことが重要です。
確認ポイント
- ISO が
/var/lib/libvirt/images/iso配下に存在すること - autoinstall の
user-dataとmeta-dataが HTTP で取得できること virt-installでテンプレート用 VM が作成されること- インストール完了後に VM が
shut offになること - テンプレート用 domain を削除しても qcow2 ディスクが残っていること
- テンプレートディスクから VM 用ディスクを作成できること
テンプレートディスクができると、次は個別 VM の名前、CPU、メモリ、ディスク、NIC を決めて libvirt domain を作成できます。






