手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 KVM VM テンプレートの作成

Ubuntu 26.04 サーバー管理ガイドへ戻る

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-installlibvirtcloud-image-utils が導入済みであること
  • Ubuntu Server ISO を /var/lib/libvirt/images/iso 配下に配置していること
  • autoinstall の user-datameta-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" || true

autoinstall seed を用意する

autoinstall では、user-datameta-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
EOF

user-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
EOF

HTTP で取得できるか確認します。

curl -I http://127.0.0.1/autoinstall/ubuntu-template/user-data
curl -I http://127.0.0.1/autoinstall/ubuntu-template/meta-data

virt-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 --all

shut 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.qcow2

libvirt 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-datameta-data が HTTP で取得できること
  • virt-install でテンプレート用 VM が作成されること
  • インストール完了後に VM が shut off になること
  • テンプレート用 domain を削除しても qcow2 ディスクが残っていること
  • テンプレートディスクから VM 用ディスクを作成できること

テンプレートディスクができると、次は個別 VM の名前、CPU、メモリ、ディスク、NIC を決めて libvirt domain を作成できます。

Ubuntu 26.04 サーバー管理ガイドへ戻る

Ubuntu 26.04 KVM VM テンプレートの作成

コメントを残す

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

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

トップへ戻る