はじめに
Proxmox VEでUbuntu ServerのVMを何台も作るなら、ISOから毎回インストールするより、Ubuntu Cloud Image + Cloud-init + VMテンプレート の構成にした方が便利です。
Cloud-initを使うことで、VMクローン時にユーザー名、SSH公開鍵、IPアドレス、DNSなどをProxmox側から注入できるためです。
環境
この記事での想定環境は次の通りです。
テンプレートVMID: 9000
テンプレート名: ubuntu-2404-cloudinit
ストレージ: local-lvm
ネットワークブリッジ: vmbr0
環境に合わせて、local-lvm や vmbr0 は変更してください。
Ubuntu 24.04 LTS Cloud Imageをダウンロード
ProxmoxノードのShellに入ります。
cd /var/lib/vz/template/iso
Ubuntu 24.04 LTS、Noble NumbatのCloud Imageをダウンロードします。
Ubuntu公式のreleaseディレクトリには、ubuntu-24.04-server-cloudimg-amd64.img が配布されています。(Ubuntu Cloud Images)
wget https://cloud-images.ubuntu.com/releases/noble/release/ubuntu-24.04-server-cloudimg-amd64.img
cloud-images.ubuntu.com/noble/current/ にはDaily Buildもあります。
通常は releases/noble/release/ のイメージをおすすめします。
Cloud Imageに QEMU Guest Agentをインストール
テンプレート化する前に、Ubuntu Cloud Imageへ qemu-guest-agent を入れておきます。
apt update
apt install -y libguestfs-tools
virt-customize -a ubuntu-24.04-server-cloudimg-amd64.img \
--install qemu-guest-agent \
--run-command 'systemctl enable qemu-guest-agent'
Guest Agentを使うと、Proxmox側からVMのIPアドレスなどを確認しやすくなります。
また、これ以降はProxmoxVEのWebGUIからも設定できます。
テンプレート用VMを作成
まず、空のVMを作成します。
qm create 9000 \
--name ubuntu-2404-cloudinit \
--memory 2048 \
--cores 2 \
--net0 virtio,bridge=vmbr0 \
--ostype l26
ここではまだOSはインストールしません
Cloud Imageをディスクとして取り込むためのVMを設定するだけです。
Cloud ImageをProxmoxのディスクとして取り込む
ダウンロードした .img ファイルを、ProxmoxのVMディスクとしてインポートします。
qm importdisk 9000 ubuntu-24.04-server-cloudimg-amd64.img local-lvm
成功するとSuccessfully imported disk as 'unused0:local-lvm:vm-9000-disk-0'と出力されます。
インポート後、そのディスクをVMの scsi0 に接続します。
qm set 9000 \
--scsihw virtio-scsi-pci \
--scsi0 local-lvm:vm-9000-disk-0
ストレージ名が local-lvm ではない場合は、自分の環境に合わせて変更してください。
Cloud-initドライブを追加する
次に、Cloud-init用のドライブを追加します。
qm set 9000 --ide2 local-lvm:cloudinit
成功したらgenerating cloud-init ISOと出力され、GUIからも確認できます。
Proxmoxでは、このCloud-initドライブ経由でユーザー名、SSH鍵、ネットワーク設定などをVMに渡します。
起動設定とコンソール設定
Cloud Imageのディスクから起動するように設定します。
qm set 9000 --boot c --bootdisk scsi0
シリアルコンソールの設定も入れておきます。
qm set 9000 --serial0 socket --vga serial0
QEMU Guest Agentも有効化しておきます。
qm set 9000 --agent enabled=1
Cloud-initの初期値を設定
テンプレートにCloud-initの基本設定を入れておきます。
qm set 9000 --ciuser ubuntu
SSH公開鍵を設定します。
qm set 9000 --sshkeys ~/.ssh/id_ed25519.pub
パスワードを設定する場合は次のようにします。
なお、Ubuntu Cloud ImageはデフォルトではパスワードでSSHにログインできません。
qm set 9000 --cipassword 'パスワードを入力'
DHCPでIPアドレスを取得する場合は、次のようにします。
qm set 9000 --ipconfig0 ip=dhcp
固定IPにしたい場合は、次のように指定します。
qm set 9000 --ipconfig0 ip=192.168.1.50/24,gw=192.168.1.1
qm set 9000 --nameserver 1.1.1.1
テンプレートではDHCPにしておき、クローン後のVMごとに固定IPを設定する運用がおすすめです。
ディスクサイズの拡張
Ubuntu Cloud Imageの初期ディスクサイズは小さめです。テンプレート化する前に、必要に応じて拡張しておきます。
ディスクを32GBにする場合は次のようにします。
qm resize 9000 scsi0 32G
Cloud Image側では、初回起動時にCloud-initやgrowpartによってルートパーティションが拡張される構成になっていることが多いです。
VMをテンプレート化する
ここまで設定したら、VMをテンプレート化します。
qm template 9000
これで、ProxmoxのGUI上でもテンプレートとして表示されます。
テンプレート化する前は、VMを起動しないほうが安全です。
起動してしまうと、machine-idやSSH host keyなどが生成され、クローン間で重複する原因となることがあります。
テンプレートからVMを作成
作成したテンプレートから、新しいVM(ID150)をクローンします。
qm clone 9000 150 \
--name ubuntu-test \
--full true
クローンしたVMにCloud-init設定を入れます。
qm set 150 --ciuser ubuntu
qm set 150 --sshkeys ~/.ssh/id_ed25519.pub
qm set 150 --ipconfig0 ip=dhcp
固定IPにする場合は、次のようにします。
qm set 150 --ipconfig0 ip=192.168.1.151/24,gw=192.168.1.1
qm set 150 --nameserver 1.1.1.1
VMを起動します。
qm start 100
SSHで接続する
DHCPで起動した場合、ProxmoxのGUIやルーターのDHCPリース情報からIPアドレスを確認します。
Guest Agentが使える状態であれば、次のコマンドでネットワーク情報を確認できます。
qm guest cmd 100 network-get-interfaces
SSHで接続します。
ssh -i ~/.ssh/id_ed25519 ubuntu@192.168.1.151
補足
Ubuntu Cloud Imagesは、Ubuntu公式のクラウド向けイメージです。
通常のISOインストーラーではなく、すでにインストール済みのディスクイメージとして配布されており、Ubuntu公式ページでもCloud Imagesは「pre-installed disk images」と説明されています。(Ubuntu Cloud Images)
また、Proxmox公式ドキュメントでもCloud-initディスクを追加してVMテンプレート化する方法が記載されています。(Proxmox VE)
