手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 KVM VM テンプレートの作成 – autoinstall と qcow2 複製の基本

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-datameta-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
done

libvirt 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 KVM VM テンプレートの作成 – autoinstall と qcow2 複製の基本

コメントを残す

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

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

トップへ戻る