zaki work log

作業ログやら生活ログやらなんやら

[Proxmox VE] テンプレートとクローンとCloud-Initを使ってVMをサクサクシュッと生やす (Fedora / Ubuntu)

Proxmox VEには、VMのテンプレート化とクローン機能があり、さらにCloud-Initを使って初期設定込みで簡単にVMをプロビジョニングできる機能がある。
もうすぐFedora40やUbuntu 24.04がリリースされそうなので、その時にサラサラとテンプレート作成できるように、この機能を使う準備についておさらい。
といっても、ドキュメントの通り順番にコマンド実行していけば作成できる。

pve.proxmox.com

ちなみにここではUbuntuの情報はあふれてるので、ここではFedora 40 betaでお試し。 (Ubuntuの場合も参考程度に記載してる)

テンプレートの作成

まずはCloudイメージを使ったVMを作り、それをテンプレートに変換、という手順。
UIが用意されてるか微妙なので、ドキュメント通りCLIで実行する。

ベースになるCloudイメージの入手

Proxmox VEのテンプレート・クローン・Cloud-Init機能を使うためのベースイメージはクラウドイメージを使用する。
Fedoraはここから入手。

fedoraproject.org

ここからbeta版のFedora Cloud 40 QEMU (qcow2形式)をダウンロードする。(betaの場合は「Show Beta downloads」のボタンで切り替える)

curl -LO https://download.fedoraproject.org/pub/fedora/linux/releases/test/40_Beta/Cloud/x86_64/images/Fedora-Cloud-Base-Generic.x86_64-40-1.10.qcow2

ちなみにUbuntuクラウドイメージはこちらから。

cloud-images.ubuntu.com

Ubuntu 22.04 LTS (Jammy)であれば以下。

curl -LO https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img

試してないけど 24.04 LTSだとこれかな?今はdaily buildっぽいけど。

curl -LO https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img

これをローカルやNFSストレージなど、PVEで使える場所に配置。

テンプレート元にするVM作成

普通のVMを作るときはIDはだいたい3桁にしてるかもだけど、ドキュメントのサンプルは9000と4桁になってて、実際桁数が異なっているとわかりやすいので、それに倣って4桁IDのテンプレート作成。
手元の環境ではすでにいくつか作成済みなので、ここでは9002を使用。

qm create 9002 --name fedora40beta-template --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci

これで仮想マシン一覧のところに、ID:9002のVMが作成される。

イメージのセット

ダウンロードしたクラウドイメージをローカルストレージ(以下はlocal-lvm)のVMとしてインポート。
import-fromにPVE上で参照できるイメージのパスを指定。

qm set 9002 --scsi0 local-lvm:0,import-from=/mnt/pve/pecorino-dev/template/iso/Fedora-Cloud-Base-Generic.x86_64-40-1.10.qcow2

実行例

root@pve:~# qm set 9002 --scsi0 local-lvm:0,import-from=/mnt/pve/pecorino-dev/template/iso/Fedora-Cloud-Base-Generic.x86_64-40-1.10.qcow2
update VM 9002: -scsi0 local-lvm:0,import-from=/mnt/pve/pecorino-dev/template/iso/Fedora-Cloud-Base-Generic.x86_64-40-1.10.qcow2
  Logical volume "vm-9002-disk-0" created.
transferred 0.0 B of 5.0 GiB (0.00%)
transferred 51.7 MiB of 5.0 GiB (1.01%)
transferred 102.9 MiB of 5.0 GiB (2.01%)
transferred 154.6 MiB of 5.0 GiB (3.02%)
:
:
transferred 5.0 GiB of 5.0 GiB (99.85%)
transferred 5.0 GiB of 5.0 GiB (100.00%)
transferred 5.0 GiB of 5.0 GiB (100.00%)
scsi0: successfully created disk 'local-lvm:vm-9002-disk-0,size=5G'
root@pve:~#

これでVMにディスクがセットされる。

Cloud-Init CD-ROMドライブの追加

Cloud-Initの情報をVM起動時にセットするためのCD-ROMドライブを作成する。

qm set 9002 --ide2 local-lvm:cloudinit

実行例

root@pve:~# qm set 9002 --ide2 local-lvm:cloudinit
update VM 9002: -ide2 local-lvm:cloudinit
  Logical volume "vm-9002-cloudinit" created.
ide2: successfully created disk 'local-lvm:vm-9002-cloudinit,media=cdrom'
generating cloud-init ISO
root@pve:~# 

これで「CloudInitデバイス」が追加される。

さらに、追加したイメージ(ディスク)からブートするように、ブート順を変更。

qm set 9002 --boot order=scsi0

実行例

root@pve:~# qm set 9002 --boot order=scsi0
update VM 9002: -boot order=scsi0
root@pve:~# 

シリアルコンソールの設定を追加。

qm set 9002 --serial0 socket --vga serial0

実行例

root@pve:~# qm set 9002 --serial0 socket --vga serial0
update VM 9002: -serial0 socket -vga serial0
root@pve:~# 

テンプレートへの変換

最後にテンプレートへ変換。

qm template 9002

実行例

root@pve:~# qm template 9002
  Renamed "vm-9002-disk-0" to "base-9002-disk-0" in volume group "pve"
  Logical volume pve/base-9002-disk-0 changed.
  WARNING: Combining activation change with other commands is not advised.
root@pve:~# 

warning出てるけどいつも出るのでたぶん無視していい。(本当?) 変換が完了すると、「仮想マシン一覧」のアイコンが変わりテンプレートになる。

これでいつでもクローン機能を使ってVMをポコポコ生やす準備が「ほぼ」完了。

テンプレートの設定

ベースになるイメージの設定によるけど、CPUやメモリ、ストレージなどがデフォルト値のままで、特にストレージは全然足りない設定になってることが多いので、自分が使いたい初期値に更新する。

ここからはWeb UIで実施

VM設定

VMの設定は基本的にUIでVMを新規作成するときに指定するものと同じで、主に以下の項目。「ハードウェア」から更新する。
(ディスクは「ディスクの動作」->「リサイズ」で増分を指定。減らすのは少なくともUIは無理そう?)

  • メモリ
  • プロセッサ(cpu数/種別)
  • ディスクサイズ

Fedora 40 Betaだと、クラウドイメージからVMを作るとメモリが2GB、CPUが1socket/1core、ストレージが5GBになってるので、欲しいスペックの値に更新する。
この値は「クローン」をした時の初期値になるため、「VMをサクッと作ったときに設定されていたい値」をセットする。
クローン後にも設定できるので、「今回はパワーあるVMが欲しい」みたいな個別設定は、クローンのあとに設定すればよい。

特にRHEL系v9のCPU種別で「x86-64-v2-AES」でないとエラーになるパターンがあるので、CPU種別は設定しておくのと、デフォルトのストレージサイズは結構少ないので、20GBとか検証その他で困らないサイズを指定しておくのが良い。
(イメージの種類によってはデフォルト値のままだと、ブート中にディスクフルになったりするサイズだったりする笑)

他には「オプション」の「QEMU Guest Agent」とかの有効化ね。

Cloud-Init設定

今回のキモがここで、VMをプロビジョニングした時点でユーザーアカウントやネットワーク設定など簡単なOS設定が完了した状態にする、パブリッククラウドのコンピューティングリソースでおなじみの機能を設定。
Proxmox VEのWeb UIでは以下の項目を設定できる。

  • ユーザ
  • パスワード
  • DNSドメイン
  • DNSサーバ
  • SSH公開鍵
  • プロビジョニング時のパッケージアップグレード(apt upgradeやdnf update)の実行有無
  • IPアドレス設定 (固定 / DHCP)

アカウント関連は自分だけが使う環境であればテンプレートの時点でセットしておくと便利。
IPアドレスDHCPでなければVMごとに変わってくるはずなので、テンプレートの時点では空欄にしておいて、クローン後に設定することが多いかも。
この辺りは使い方次第。

ここまで設定できればテンプレートの完成。 あとは収穫。

VMのクローンと起動

仮想マシン一覧」から右クリックメニューの「クローン」で、VMIDとマシン名を入力すればVMがプロビジョニングされる。
(実は「モード」がよくわかってない。完全クローンだと結構時間がかかる)

このVMは前述テンプレートの設定で入力したCPUやメモリ・ストレージサイズ、Cloud-Initの内容がそっくりコピーされているので、テンプレートの内容のままで良ければそのまま開始すればOK
ネットワーク設定などVM毎の設定が必要であれば、クローン直後(初回起動前)に設定する。
(Cloud-Initは初回起動時のみに処理されるので)

今回はネットワーク設定を更新して起動。

コンソールにアクセスすれば、起動は割とすぐ完了してログインプロンプトが表示されるので、Cloud-Initで設定したユーザー名とパスワードでログインができる。
ただ、Cloud-Init自体はログインプロンプト表示後も非同期で処理されており、特にパッケージアップデートを有効にしていると、コンソールログイン後も並行して処理される。

SSHサーバーも早い段階で起動しているので、リモートからSSHアクセスが(公開鍵を設定していればその鍵を使った公開鍵認証で)可能。

環境

PVE 8.1.10 無償ライセンス版


というわけでProxmox VEのテンプレートとクローンとCloud-InitでVMを簡単にプロビジョニングできる機能についてのまとめ。
使える状態のVMを秒で作成できる手軽さは、コンテナ利用に近いものがあるスピード感で、OS設定のレイヤーから環境が欲しい場合はこの便利さはかなり感動もの。

ちなみに機能(感覚的にネットワークセキュリティ系)は結構少なかったりする。
iptablesやfirewalldは入ってないので、IaaSの同等機能を使う想定だったりするのかな?