Proxmoxでテンプレート作成
これの続き
手動でインストールしたUbuntuをベースにして複数のVMをクローンしようかと思ったのですが、Proxomoxでcloud-initを使えるようなのでそれを利用。
Ubuntu Serverのインストーラとcloud-initが一部競合する(/etc/netplan/にそれぞれファイルを置くとか)なので、公開されているクラウド用Ubuntuイメージを使う方針に。
これを参考に
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