Ubuntu 26.04 の KVM 環境で、VM 作成の元になるテンプレートディスクを作成します。テンプレート方式にしておくと、毎回 ISO からインストールするのではなく、あらかじめ作成した qcow2 を複製して VM を増やせます。
この記事では、ISO から virt-install と autoinstall を使ってテンプレート VM を作成し、インストール完了後に libvirt domain を削除して、ディスクだけをテンプレートとして残す流れを整理します。
書籍
作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
テンプレート方式の考え方
KVM の VM テンプレートは、常時起動する VM ではありません。OS インストール済みの qcow2 ディスクを複製元として残し、実際の VM はそのディスクからコピーして作成します。
- ISO から毎回インストールする手間を減らせる
- 標準パッケージや初期状態をそろえやすい
- 40G / 80G など用途別のテンプレートを用意できる
- テンプレート自体は起動用 domain として残さず、ディスクだけを保管する
前提を確認する
作業前に、KVM ホスト、ISO、イメージディレクトリ、autoinstall 用 seed の配信元を確認します。ここが曖昧なままだと、virt-install の失敗原因が ISO なのか、HTTP 配信なのか、libvirt なのか分かりにくくなります。
virsh --connect qemu:///system version
ls -ld /var/lib/libvirt/images /var/lib/libvirt/images/iso
ls -lh /var/lib/libvirt/images/iso/
curl -I http://10.1.0.89/autoinstall/ubuntu-template/autoinstall の seed は、KVM ホストまたは到達可能な管理ホストから HTTP で配信します。ISO 内に seed を焼き込む方法もありますが、テンプレートを作り直す運用では HTTP 配信の方が修正しやすいです。
autoinstall seed を用意する
Ubuntu Server の autoinstall では、user-data と meta-data を NoCloud datasource として配信します。ここでは最小例として、HTTP 配信用ディレクトリを用意します。
sudo mkdir -p /var/www/html/autoinstall/ubuntu-template
sudo tee /var/www/html/autoinstall/ubuntu-template/meta-data <<'EOF'
instance-id: ubuntu-template
local-hostname: ubuntu-template
EOF
sudo tee /var/www/html/autoinstall/ubuntu-template/user-data <<'EOF'
#cloud-config
autoinstall:
version: 1
identity:
hostname: ubuntu-template
username: myadmin
password: "$6$replace-with-hashed-password"
ssh:
install-server: true
allow-pw: false
storage:
layout:
name: lvm
packages:
- qemu-guest-agent
late-commands:
- curtin in-target --target=/target -- systemctl enable qemu-guest-agent
EOF実運用では、パスワードハッシュ、SSH 公開鍵、初期パッケージ、cloud-init の扱いを環境に合わせて調整します。記事としては、テンプレート作成の流れを追うために最小構成で示します。
virt-install スクリプトを作成する
virt-install は引数が長くなりやすいので、テンプレートごとにスクリプト化しておくと再実行しやすくなります。以下は 40G のテンプレートを作る例です。
sudo tee /usr/local/bin/virt-install-ubuntu-template-40g.sh <<'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.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
--extra-args "cloud-config-url=/dev/null ip=dhcp autoinstall ds=nocloud-net;s=http://10.1.0.89/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 バージョンを指定して進めることがあります。ここは将来的に環境側の libosinfo が更新されると変わる可能性があります。
テンプレート VM を作成する
スクリプトを実行すると、libvirt domain が作成され、ISO から自動インストールが始まります。インストールが進んでいる間は、domain の状態を確認します。
sudo /usr/local/bin/virt-install-ubuntu-template-40g.sh
virsh --connect qemu:///system list --all
virsh --connect qemu:///system dominfo ubuntu-template-40g
virsh --connect qemu:///system console ubuntu-template-40g自動インストールが完了すると VM は停止します。停止しない場合は、autoinstall の設定、HTTP seed の配信、ISO パス、console 指定を確認します。
停止完了を待つ
テンプレートディスクとして使う前に、インストール中の VM が停止していることを確認します。起動中のディスクを複製元として扱うと、ファイルシステムの整合性を壊す可能性があります。
while true; do
state="$(virsh --connect qemu:///system domstate ubuntu-template-40g 2>/dev/null || true)"
echo "$state"
[ "$state" = "shut off" ] && break
sleep 10
donelibvirt domain を削除してディスクだけ残す
テンプレート VM は、インストール済みディスクを作るための一時的な domain として扱います。インストールが終わったら libvirt domain を undefine し、qcow2 ディスクだけを残します。
sudo virsh --connect qemu:///system undefine ubuntu-template-40g --nvram
ls -lh /var/lib/libvirt/images/ubuntu-template-40g.qcow2
virsh --connect qemu:///system list --allこの時点で ubuntu-template-40g という domain は消えますが、ubuntu-template-40g.qcow2 は残ります。このディスクが後続の VM 作成で使う複製元です。
テンプレートディスクを保護する
テンプレートディスクを誤って起動・上書きしないように、運用上は読み取り専用の扱いにするか、複製専用ディレクトリとして明確に管理します。
sudo chown root:root /var/lib/libvirt/images/ubuntu-template-40g.qcow2
sudo chmod 0644 /var/lib/libvirt/images/ubuntu-template-40g.qcow2
qemu-img info /var/lib/libvirt/images/ubuntu-template-40g.qcow2テンプレートから VM 用ディスクを作る
実際の VM は、テンプレート qcow2 をコピーして作ります。単純コピーでも構いませんが、ディスクを複製したあとに hostname、machine-id、cloud-init 状態などをどう扱うかを決めておく必要があります。
sudo cp --sparse=always \
/var/lib/libvirt/images/ubuntu-template-40g.qcow2 \
/var/lib/libvirt/images/ubuntu-test.qcow2
sudo qemu-img info /var/lib/libvirt/images/ubuntu-test.qcow2テンプレート方式は便利ですが、複製後の個体差をどう入れるかが重要です。後続の VM 作成記事では、libvirt XML、MAC アドレス、ネットワーク接続、VM 名を含めて個別 VM として定義します。
確認ポイント
- ISO と autoinstall seed に KVM ホストから到達できる
virt-installの引数をスクリプトとして残している- インストール完了後に VM が停止している
- libvirt domain を undefine し、テンプレートディスクだけを残している
- テンプレートディスクを直接運用 VM として使わない
- 複製後の VM 個体差を後続の VM 作成手順で扱う
まとめ
Ubuntu 26.04 の KVM VM テンプレートは、VM を作るための完成済み qcow2 ディスクです。テンプレート domain を残して運用するのではなく、インストール済みディスクだけを複製元として管理することで、VM 作成の再現性を高められます。
次は、このテンプレートディスクを使って、実際の VM インスタンスを作成する手順へ進みます。
関連記事
- Ubuntu 26.04 サーバー管理ガイド
- Ubuntu 26.04 KVM の基本構築 – libvirt / OVS / OVN の土台を作る
- Ubuntu 26.04 KVM Bridge ネットワークの基本設定 – Linux bridge / OVS / OVN の使い分け
- Ubuntu 26.04 KVM VM の作成
- Ubuntu 26.04 KVM VM の ACL
- Ubuntu 26.04 KVM HugePages の基本
- Ubuntu 26.04 仮想マシンの性能確認
- VM パフォーマンス Day4 – ストレージ I/O 最適化と virtio / raw / qcow2 / io_uring の考え方



