🏘️

Proxmoxでテンプレート作成

2023/08/27に公開

これの続き
https://zenn.dev/takai404/articles/7a3320b8e0bf3a

手動でインストールしたUbuntuをベースにして複数のVMをクローンしようかと思ったのですが、Proxomoxでcloud-initを使えるようなのでそれを利用。

Ubuntu Serverのインストーラとcloud-initが一部競合する(/etc/netplan/にそれぞれファイルを置くとか)なので、公開されているクラウド用Ubuntuイメージを使う方針に。

これを参考に
https://pve.proxmox.com/wiki/Cloud-Init_Support

ProxmoxにrootユーザでSSHログインして以下のコマンドで(テンプレートの元になる)VMを作成

wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci
qm set 9000 --name Ubuntu2204-template
qm set 9000 --scsi0 local-lvm:0,import-from=/root/jammy-server-cloudimg-amd64.img
qm set 9000 --ide2 local-lvm:cloudinit
qm set 9000 --boot order=scsi0
qm set 9000 --serial0 socket --vga serial0

参考のWikiだとこのあとでqm templateコマンドを打ってVMをテンプレートに変換しているのですが、その前にひと手間挟みます。

  • VMにログインするときはSSH公開鍵認証を使いたい
    • ログインパスワードは設定しない
  • SSHで繋ぐためにはIPを知る必要がある
    • cloud-initで設定されたDHCP IPは起動時のスクリーンログをちまちまとスクロールする必要があり手間がかかる
    • ip aコマンドを使うためにはログインする必要がある
    • ProxmoxのVMのSummaryにはIPアドレスを表示してくれる欄がある(けど何も表示されない)
  • ProxmoxのVMのSummaryでIPアドレスを表示するにはqemu-guest-agentがVMにインストールされてる必要がある
  • 一般的にcloud-initではpackagesで指定したパッケージをインストール可能なのでqemu-guest-agentをインストールすればいいように思える
    • ProxmoxのGUIで設定できるのは限られたcloud-initのみ(packagesは使えない)
  • cloud-initで自由に設定を変える(packagesを使うとか)にはcustom cloud init configuration機能を使う必要がある
    • custom cloud init configurationはVMテンプレートをクローンするときにコピーされないので、VMを作るたびに設定する必要がある

このあたりの制約を考えて次の方針にしました。

  • クラウド用Ubuntuイメージを元にVMを作成
  • VMを起動して必要なパッケージをインストール(初回cloud-initが実行されてしまう)
  • 初回cloud-initをなかったことにする(&その他クローンのために諸設定)
  • VMをテンプレート化
  • テンプレートからVMを量産

先のコマンドを打つと「Ubuntu2204-template」というVMができているので、これのClout-Init設定を編集します。
Password: とりあえずなにかパスワードを登録(後で消す)
SSH public key: 標準で入れるSSH公開鍵を登録
Upgrade packages: 起動後にapt upgradeするかどうか?セキュリティ上はONがいいが、検証のために作成削除を繰り返すつもりなのでNoに
IP Config: IPv4をDHCPに
編集したらRegenerate Imageを押す(VMが起動する際にマウントするiso9660形式でラベルがcidataであるデバイスイメージが作成される)。

OptionsでQEMU Guest AgentをEnabledにする(これはハイパーバイザ側の設定なので、VM側にエージェントが別途必要)。

VMを起動

仮想Consoleへパスワードログインしてip aコマンドでIPアドレスを確認

IPが分かったので、SSH鍵を使ってログインする

ssh -l ubuntu 192.168.xx.xx
sudo apt update
sudo apt install -y qemu-guest-agent
echo -n | sudo tee /etc/machine-id
sudo rm -r /var/lib/cloud/
sudo shutdown -h now

qemu-guest-agentをVMにインストール
/etc/machine-idはそのVM固有のIDが入っていて、DHCPクライアントはこのIDを元にリクエストを送るので、クローンした際に同じ値が入っているとIPが重複してしまう。ファイルを空にすることで次回自動生成される。
/var/lib/cloud/ディレクトリ以下のファイルたちは初回cloud-initが実行された際に作成される。クローン後に完全新規でcloud-initをやり直したいのでディレクトリを消しておく

VMが停止したらProxmoxでcloudi-init設定に戻り、Passwordを空欄にする。

VMをテンプレートに変換

今のままだとハードディスクのサイズがダウンロードしていたイメージのサイズと同じなので起動した瞬間にディスク使用率100%になります。VMを作成するたびに必要なサイズに拡張してもよいのですが、忘れそうなのでテンプレートのうちにある程度のサイズに拡張しておきます。

これでやっとテンプレート作成完了。

あとはVMを量産。GUIでも作成できる。

Linked Cloneは差分ディスク
Full Cloneはディスク全体をコピー

CPU, MemoryはVM作成後にHardwareから変更可能。

VMを起動してしばらく待つと(VMのqemu-gaプロセスとハイパーバイザが通信できると)IPアドレスがSummaryのIPsに表示されるので、そのIP宛にSSHでログインできることを確認する。

qemu-guest-agentについて一点補足しておくと、いろいろ実験しているときにIPがうまく表示されなくてはまった。
こちらのフォーラムによるとqemu-guest-agentが起動しないときはVM停止してからVMを起動するとのことで、それに従うと起動できた。(「再起動」ではダメで、ProxmoxのGUIでShutdownして停止していることを確認してからStartする)

Discussion