Proxmox VEには、VMのテンプレート化とクローン機能があり、さらにCloud-Initを使って初期設定込みで簡単にVMをプロビジョニングできる機能がある。
もうすぐFedora40やUbuntu 24.04がリリースされそうなので、その時にサラサラとテンプレート作成できるように、この機能を使う準備についておさらい。
といっても、ドキュメントの通り順番にコマンド実行していけば作成できる。
ちなみにここではUbuntuの情報はあふれてるので、ここではFedora 40 betaでお試し。 (Ubuntuの場合も参考程度に記載してる)
テンプレートの作成
まずはCloudイメージを使ったVMを作り、それをテンプレートに変換、という手順。
UIが用意されてるか微妙なので、ドキュメント通りCLIで実行する。
ベースになるCloudイメージの入手
Proxmox VEのテンプレート・クローン・Cloud-Init機能を使うためのベースイメージはクラウドイメージを使用する。
Fedoraはここから入手。
ここから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 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の同等機能を使う想定だったりするのかな?