尽きない悩み:ローカルテスト環境の構築に時間を取られすぎる問題
エンジニアとして働き始めた頃、2ノードのDocker Swarmを試したり、Ubuntu Server特有のバグを再現したりといったテスト環境を作るたびに、丸半日を費やしていました。開発マシンに直接インストールするとOSが散らかり、ランタイムのバージョン競合も心配です。かといって2.6GBのISOファイルをダウンロードし、VirtualBoxを開いてポチポチと手作業でメモリを設定し、ブリッジネットワークを割り当て、ユーザー名やパスワードを入力するのは骨が折れます。数台分も繰り返せば、ノートPCだけでなく自分自身のバッテリーまで切れてしまうほどでした。
自宅にはProxmoxを動かしているホームラボがあり、10台以上のVMが稼働しています。しかし、常に自宅サーバーの前にいられるわけでも、安定してVPN接続できる環境ばかりでもありません。カフェでノートPCを開いたとき、本当に必要なのは「10分間シェルスクリプトをサクッと試し、用が済んだら跡形もなく消せるクリーンなUbuntu環境」なのです。
従来のソリューションが抱える課題とは?
なぜローカルマシン上に独立したOS環境を用意するのはこれほど面倒なのでしょうか?おなじみのツールを振り返ってみましょう。
- VirtualBox / VMware Workstation: GUI(グラフィカルユーザーインターフェース)のオーバーヘッドが大きく、バックグラウンドだけでも最低1.5〜2GBのメモリを消費します。マウスによる手動操作が前提で、複数ノードをまとめて立ち上げるような自動化スクリプトが書きにくいのが難点です。
- Vagrant: 自動化には適していますが、
Vagrantfileの記述が冗長になりがちです。初回boxのダウンロードに時間がかかり、VirtualBoxのバージョンアップ時にブリッジネットワークのエラーが起きやすい問題もあります。 - Windows上のWSL2: 日常的なコマンド操作には非常に便利です。しかしWSL2は内部NATを介してWindowsとカーネルやネットワークネームスペースを共有しています。systemdの深い設定をテストしたり、独立したUFW/iptablesファイアウォールを構築したり、ノードごとに個別のIPアドレス帯を割り当てたい場合には、窮屈な制約に直面します。
- Docker: コンテナはホストマシンのカーネルを共有します。カーネルモジュールのテストや、systemdによる完全なinitプロセスの起動、完全に分離されたネットワーク環境のエミュレーションを行いたい場合、Dockerは仮想マシンの代替にはなり得ません。
Multipass:Canonicalが提供する軽量Ubuntu仮想マシン環境
Multipassは、Ubuntuの開発元であるCanonical社が直接手がける仮想化ツールです。ISOファイルから手動でインストールする手間はなく、公式の超軽量Ubuntu Cloud Imageを直接取得して起動します。さらに、OSネイティブのハイパーバイザー(LinuxではKVM、WindowsではHyper-V、macOSではHypervisor.framework)を活用するため、仮想マシンの起動とIPアドレスの割り当てがわずか15〜20秒ほどで完了します。
1. Multipassのインストール
Linux(Ubuntu、Debian、Fedora、Arch)の場合
MultipassはSnapパッケージとして提供されています。ターミナルを開き、以下の2つのコマンドを実行します。
sudo snap install multipass
multipass version
Windows 10/11の場合
PowerShellを管理者として実行し、WinGetを使用するのが最も手軽です。
winget install Canonical.Multipass
MultipassはデフォルトでHyper-Vを使用します(Windows ProまたはEnterpriseが必要です)。Windows Homeを利用している場合は、multipass set local.driver=virtualboxコマンドを実行することで、バックエンドドライバをVirtualBoxに切り替えることができます。
2. 最初の仮想マシンを起動する
GUIウィンドウを開く必要は一切ありません。すべての操作がターミナルだけで完結します。
スペックを指定して仮想マシンを作成
最新のUbuntu LTSをベースにした仮想マシン「dev-box」を作成し、2コアCPU、2GBメモリ、10GBストレージを割り当てるには、次のコマンドを実行します。
multipass launch --name dev-box --cpus 2 --memory 2G --disk 10G
最新版ではなく特定のバージョン(例:22.04)を指定したい場合:
multipass launch 22.04 --name worker-node --cpus 1 --memory 1G --disk 8G
仮想マシンの一覧とIPアドレスの確認
multipass list
ターミナルに各インスタンスの状態と内部IPv4アドレスが表示されます。
Name State IPv4 Image
dev-box Running 10.147.214.45 Ubuntu 24.04 LTS
worker-node Running 10.147.214.88 Ubuntu 22.04 LTS
3. 仮想マシン内部の操作
SSHキー設定なしで直接シェルにログイン
Multipassは、sudo権限を持つubuntuユーザーのアカウントへ自動的にセッションを接続してくれます。
multipass shell dev-box
ホストマシンに戻りたいときは、exitと入力するだけです。
SSH接続せずにリモートでコマンドを実行
パッケージを素早くインストールしたり、ホスト側からポート確認を行いたいだけなら、execサブコマンドが便利です。
multipass exec dev-box -- sudo apt update && sudo apt install -y nginx
multipass exec dev-box -- curl -I http://localhost
4. ホストと仮想マシン間でコードディレクトリをマウント
ホストマシンのVS Codeでコードを編集し、そのディレクトリを仮想マシン内に直接マウントしてランタイムを実行できます。
# 構文: multipass mount <ホスト側のパス> <VM名>:<VM内のパス>
mkdir -p ~/my-project
multipass mount ~/my-project dev-box:/home/ubuntu/project
~/my-projectで行ったファイルの変更は、scpやrsyncを使わずとも仮想マシン内の/home/ubuntu/projectへ即座に反映されます。
5. スナップショットによる状態の保存
複雑なセットアップスクリプトを走らせたり、システム設定ファイルを大幅に書き換えたりする前に、スナップショットを作成しておけば安心です。
# 状態のスナップショットを作成
multipass snapshot dev-box --name clean-state
# わずか数秒で以前の状態に復元
multipass restore dev-box.clean-state
6. テスト完了後のリソースクリーンアップ
作業が終わったら、わずか3つのコマンドでディスク容量とメモリを解放できます。
# 昼休みなど作業を中断する際にVMを一時停止してメモリを節約
multipass stop dev-box
# 仮想マシンを削除対象に指定
multipass delete dev-box
# ディスク上のデータを完全に消去
multipass purge
まとめ
ISOファイルの手動インストールやネットワーク設定に30分も手こずる代わりに、Multipassを使えばワークフローはわずか4つのステップに凝縮されます。環境を立ち上げるlaunch、コードを同期するmount、検証を行うshell、そして後片付けのpurgeです。高速・軽量かつ完全に独立したLinux環境を必要とするすべての開発者やDevOpsエンジニアにとって、ターミナルに常備しておくべき必携ツールと言えるでしょう。
