私のHomeLabにおけるISO時代の終焉
半年前、私のHomeLabのワークフローは非常に効率の悪いものでした。新しいノードが必要になるたびに、ISOをダウンロードしてマウントし、Ubuntuインストーラーの同じ画面を何千回もクリックしていました。それは反復的でミスが起きやすく、膨大な時間の無駄でした。基本的なプロンプトが表示されるまでに15分から20分も費やしていることに気づいたのです。
Cloud-initのワークフローに移行したことで、すべてが変わりました。今では、デプロイ時間は15分から正確に28秒まで短縮されました。このセットアップを本番環境で半年間運用していますが、一度も失敗したことはありません。3ノードのK3sクラスターを立ち上げる場合でも、一時的なデータベースを構築する場合でも、プロセスは常に同一で、瞬時に完了します。
ISO vs. Cloud-init:従来の方法が損失を招く理由
2台以上のVMを管理している場合、手動での方法はボトルネックになります。なぜ業界がこの方法から離れたのかを見ていきましょう。
従来のISO方式
これは「肉体労働」的なアプローチだと考えてください。VMを物理的なデスクトップのように扱います。仮想CD-ROMから起動し、言語を選択し、ディスクをパーティション分割し、インストーラーがパッケージを取得するのを待ちます。単発のプロジェクトなら機能しますが、スケールさせることはできません。5ノードのクラスターが必要な場合、これらの手順を5回繰り返すことになります。
Cloud-initテンプレート方式
Cloud-initは、AWSやDigitalOceanなどのクラウドプロバイダーにおける標準です。インストーラーを使用する代わりに、Canonicalが提供するプリインストール済みの「ゴールドイメージ(Gold Image)」を使用します。そこにSSHキー、ネットワーク設定、ユーザーアカウントなどの構成を直接注入します。Proxmoxはこのイメージをクローンし、カスタムメタデータを適用します。コーヒーを一口飲む前に、VMの準備が整います。
実用面でのメリットとデメリット
この方法が優れている理由
- 爆速のスピード: SSDストレージであれば、リンククローンの作成には約3秒しかかかりません。
- 構成の不一致(ドリフト)ゼロ: すべてのVMが、まったく同じセキュリティパッチとユーザー権限で開始されます。
- Infrastructure as Code: 後にTerraformやAnsibleなどのツールを使用したい場合、このセットアップは必須の第一歩となります。
- ヘッドレスセットアップ: ProxmoxのVNCコンソールを二度と開く必要はありません。VMが起動した瞬間から、SSHキーが利用可能です。
わずかなハードル
- 一度限りの作業: 最初のテンプレートを作成するために、コマンドラインで約10分費やす必要があります。
- ディスクのリサイズ: クラウドイメージは通常サイズが小さいため(約2GB)、Proxmox側でディスクを拡張することを忘れないでください(これは自動化も可能です)。
前提条件
この手順は、Proxmox VE 8.1上でUbuntu 24.04 LTS (Noble Numbat)を使用して実行しています。これらのコマンドは、Ubuntu 22.04やDebian 12のイメージとも互換性があります。
以下が必要です:
- 動作中のProxmox VEノード。
- ProxmoxホストへのSSHアクセス(Webシェルのコンソールにコマンドを貼り付けるのは非常に困難です)。
- Linuxターミナルの基本的な知識。
ステップバイステップ:Ubuntuテンプレートの作成
GUIでの誤クリックを防ぎ、再現性を確保するためにCLIを使用します。以下のコマンドをProxmoxホストで直接実行してください。
1. 公式イメージのダウンロード
まず、検証済みの最新Ubuntuクラウドイメージを取得します。通常、/tmpのような一時フォルダーに保存します。
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
2. ゲストツールの組み込み
クラウドイメージは最小限の構成であるため、qemu-guest-agentが含まれていないことがよくあります。起動前にこれをイメージに注入することで、ProxmoxがVMのIPアドレスを即座に認識できるようになります。
# パッケージリストを更新し、libguestfs-toolsをインストール
apt-get update && apt-get install libguestfs-tools -y
# イメージにqemu-guest-agentをインストール
virt-customize -a noble-server-cloudimg-amd64.img --install qemu-guest-agent
3. VMシェルの定義
ID 9000を使用して新しいVMを作成します。テンプレートのベースラインとして、メモリ2GB、2CPUコアを割り当てます。
qm create 9000 --name "ubuntu-2404-template" --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
4. 仮想ディスクのインポート
このステップで、UbuntuイメージをProxmoxのストレージに移動します。local-lvmの部分は、zfs-thinやcephなど、ご自身の環境のストレージ名に置き換えてください。
# イメージをストレージにインポート
qm importdisk 9000 noble-server-cloudimg-amd64.img local-lvm
# インポートしたディスクをSCSIデバイスとしてセット
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0
5. Cloud-initとハードウェア設定
Cloud-initのメタデータを保持するための小さな仮想ドライブを追加します。また、シリアルコンソールを有効にします。これにより、Proxmoxコンソールでクラウドイメージを表示する際の「ブラックスクリーン」問題を回避できます。
# Cloud-initドライブを追加
qm set 9000 --ide2 local-lvm:cloudinit
# ブート順序を設定
qm set 9000 --boot c --bootdisk scsi0
# シリアルコンソールを有効化
qm set 9000 --serial0 socket --vga serial0
# QEMU Guest Agentを有効化
qm set 9000 --agent enabled=1
6. テンプレートの完成
構成を確定し、VMを読み取り専用のテンプレートに変換します。
qm template 9000
新しいVMを起動する方法
これでテンプレートの準備が整いました。デプロイするには、Proxmoxのサイドバーでテンプレートを右クリックし、Cloneを選択します。独立性を高めるには「Full Clone」、ディスク容量を節約するには「Linked Clone」を選択してください。新しいVMを起動する前に、Cloud-Initタブに移動して以下を設定します:
- User: 管理者ユーザー名(例:
devops)。 - Password: 強力なパスワード(ただしSSHキーの使用を推奨)。
- SSH Keys: 自身の
id_rsa.pubをここに貼り付けます。安全なラボ環境には必須です。 - IP Config: 多くのHomeLabではDHCPを使用しますが、ここで静的IPを固定することも可能です。
Regenerate Image(イメージを再生成)を押し、起動をクリックして20秒待ちます。これで、新しいサーバーに直接SSHでログインできるようになります。
6ヶ月運用してみた結論
この方法に切り替えて以来、手動でOSをインストールしたことは一度もありません。私のHomeLabは、雑然とした実験場の集まりではなく、プロフェッショナルな環境のように感じられます。メニューのクリック作業に飽き飽きしており、本来の目的であるソフトウェアの実行に集中したいのであれば、これはProxmoxのワークフローにおける最高のアップグレードになるでしょう。高速で安定しており、毎月何時間ものストレスから解放してくれます。

