仮想マシンのインストールで貴重な時間を無駄にするのはやめよう
VirtualBoxでUbuntu Serverをインストールするために、ただ20分間画面を眺めて待っていたことがあるなら、その退屈さがよくわかるはずです。Docker SwarmやKubernetesのテスト用に3〜5ノードのクラスターを構築する場合、その作業は苦行になります。ISOファイルをマウントし、ユーザー名を設定し、パスワードを入力して待つというプロセスは、もはや時代遅れです。
私のホームラボでは、Proxmox上で約12台のVMを管理しています。しかし、個人のノートPCのVirtualBoxで素早くテストしたいときは、いつもCloud-Initを使っています。これこそが、以前は30分かかっていた仮想マシンの構築を、わずか2分足らずで完了させる秘訣です。
一般的な仮想マシン作成方法の比較
作業に取り掛かる前に、なぜCloud-Initがプロフェッショナルの間で第一の選択肢となっているのかを見てみましょう:
1. ISOからの手動インストール
- 実態: 「次へ」をクリックするために画面の前で待機する必要があります。
- 課題: 非常に時間がかかり、IPやパスワードの入力ミスも発生しやすいです。この方法には再現性が全くありません。
2. Vagrantの使用
- 実態: Vagrantfileを使用すれば、かなり高速で便利です。
- 課題: Vagrant Cloudからのイメージダウンロードが非常に遅いことがあります。また、VirtualBox의 ネットワーク層を深くカスタマイズするのも少し複雑です。
3. 「ゴールデンイメージ」からのクローン
- 実態: 既存の仮想マシンをコピーします。
- 課題: VM間でMachine-IDやSSHホストキーが重複してしまいます。システムを「クリーン」にするためのスクリプトを実行する手間が増え、そうしないとロギングの競合などが発生しやすくなります。
4. Cloud-Init(現代の標準)
Cloud-initは、起動時(boot-time)に仮想マシンを構成するツールです。ユーザー、SSHキー、インストールが必要なパッケージを定義したYAMLファイルを用意するだけで済みます。これは、AWSやGoogle Cloudが毎日数百万台の仮想マシンを起動しているのと同じ方法です。
なぜCloud-InitがVirtualBoxで動作するのか?
通常、Cloud-initはクラウドプロバイダーのメタデータサービスからデータを取得します。VirtualBoxでは、NoCloudデータソースという手法を使ってこれを模倣します。ネットワーク経由で問い合わせる代わりに、マシンに直接接続された仮想ディスク(非常に軽量なISOファイル)から設定を読み込ませます。
実践的な導入手順
ステップ1:Cloud Imageのダウンロード(約500MBのみ)
数GBもある重いインストール用ISOファイルは無視してください。Cloud Image(.ovaまたは.vmdk)をダウンロードする必要があります。これらは容量が最適化されており、Cloud-initがプリインストールされています。
Ubuntuのダウンロードリンク: Ubuntu Cloud Images.
ステップ2:user-data設定ファイルの作成
user-dataという名前のファイル(拡張子なし)を作成します。ここで仮想マシンに何をさせるかを指示します:
#cloud-config
# ユーザーの作成とパスワードなしsudo権限の付与
users:
- name: techadmin
groups: sudo
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh_authorized_keys:
- ssh-rsa AAAAB3... (ここにSSH公開鍵を貼り付けます)
# 自動アップデートとパッケージのインストール
package_update: true
packages:
- qemu-guest-agent
- curl
- git
# インストール完了後に実行するコマンド
runcmd:
- [ systemctl, start, qemu-guest-agent ]
- echo "サーバーのセットアップが完了しました!" > /etc/motd
マシンの識別用にmeta-dataファイルも忘れずに作成してください:
instance-id: lab-vm-01
local-hostname: ubuntu-lab
ステップ3:「Seed」ISOファイルのパッケージング
VirtualBoxはYAMLファイルを直接読み込むことはできません。次のコマンドを使用して、それらを小さなISOファイルにまとめる必要があります:
Linux/macOSの場合:
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
Windowsを使用している場合は、WSL(Windows Subsystem for Linux)をインストールすることで、このコマンドを簡単に実行できます。
ステップ4:VirtualBoxでの設定
- 新しいVMを作成し、ハードディスクとしてステップ1でダウンロードしたCloud Imageファイルを選択します。
- 設定 > ストレージに移動します。
- コントローラー: IDEの項目で光学ドライブを追加し、作成した
seed.isoファイルを選択します。 - ネットワークをブリッジアダプターに変更し、仮想マシンがホストマシンと同じセグメントのIPを取得できるようにします。
ステップ5:起動して確認
起動ボタンを押します。コンソール画面に自動コマンドが実行されているのが見えるはずです。Cloud-initがバックグラウンドでユーザー作成、SSH構成、指定したパッケージのインストールを行っています。約1分後、直接仮想マシンにSSH接続できるようになります:
ssh [email protected]
Cloud-Initを使用する際の重要な注意点
何度もデバッグを繰り返した結果、得られた重要な注意点を共有します:
- 空白のエラー: YAMLは非常に厳格です。スペースが1つ多いだけで、Cloud-initはエラーを吐きます。ISOをパッケージングする前に、オンラインのYAMLチェッカーを使用することをお勧めします。
- 実行は一度きり: Cloud-initは初回起動時にのみ設定を実行します。その後ISOファイルを修正しても、仮想マシンを完全にリセットしない限り、設定は更新されません。
- 後片付け: マシンが起動しSSH接続に成功したら、管理を楽にするために
seed.isoファイルをアンマウントしても構いません。
Cloud-initをマスターすることは、Infrastructure as Code(コードによるインフラ構成)の考え方に進むための重要なステップです。手動でインストール作業を行う代わりに、コードに仕事を任せましょう。ラボの構築が成功することを願っています!

