multipassはWindows/macOS/Linuxで使える仮想マシン管理ツールです。特にUbuntuサーバーのインストールされた仮想マシンを気軽に用意したい時に、その効果を発揮します。今回は「オンプレミスで動くなんちゃってAWS EC2」的に利用できるmultipassのかんたんな使い方を紹介しましょう。
LXDのようなインターフェースを備えたCLIツール
multipassはCanonicalが開発している、Windows/macOS/Linuxで使える仮想マシン管理ツールです。まだ「ベータ版」という扱いではあるものの、次のような機能を備えており、気軽にUbuntuがインストールされたサーバーインスタンスを構築できるのが特徴です。
CLIをメインにしたUI
- コマンド1つで仮想マシンを作成&起動できる
- 仮想マシンの作成・起動・停止・削除に加えて、ログインやファイルのやり取りもコマンドで実現
cloud-initによる仮想マシンの設定が可能
多種多様なバックエンドのサポート
- Linux用バックエンドにはQEMU/KVMを使いつつ、libvirtにも切り替え可能
- Windows上ならHyper-VをmacOS上ならHyperKitをサポート
自作のイメージの起動
なお、一般的な仮想マシン管理ツールと比べると、次のようなデメリットも存在します。
グラフィック機能の非サポート
- あくまでサーバー用途
- デスクトップ環境を試したいのであれば従来のツールの利用をおすすめ
ホストの外からのアクセス関連設定機能がない
- ホストの外から作成した仮想マシンにアクセスしたいならホストOSごとの設定が必要
- 仮想マシンからインターネットへのアクセスは可能
いずれにせよ実運用で使うには、まだまだ機能不足です。とはいえ「LXDみたいに気軽に仮想マシンインスタンスを立ち上げたり、ログインして使ってみたい」という用途であれば十分でしょう。
特にWindowsやmacOSでも、CLIから容易にUbuntuインスタンスを作成できるため、使い方によっては現時点でも非常に便利なツールとなるはずです[1]。
multipassのインストール
multipassはWindowsやmacOSにも対応しています。multipassの公式サイトからexeファイルやpkgファイルのリンクがはられていますので、それをダウンロードしてインストールしてください。原則として、WindowsならHyper-VもしくはVirtualBoxが、macOSならHyperKitが有効化・インストールされていることが前提となります。
UbuntuをはじめとするLinux向けにはsnapパッケージが用意されています。第582回を参考にまずはsnap環境を構築してください。GitHub上にLinux版のソースコードが公開されているので、それをビルド・インストールしても良いでしょう。
Ubuntuであればsnapパッケージをインストールする方法が一番かんたんです。
multipassはまだ安定版をリリースしていないのでbetaチャンネルからダウンロードします。また、それなりにパッケージサイズが大きいため、余力のあるインターネット回線を利用してください。
multipassでインスタンスを作成する
multipassをインストールするとmultipassデーモンが動き出します。multipassコマンドはこのmultipassデーモンとUnixドメインソケット経由で通信しながら、仮想マシンインスタンスを操作するのです。このあたりはLXDと同じ形ですね。
まずはmultipass
コマンドが使えるか確認してみましょう。
これを見れば、もうおおよその使い方はわかると思います。
実際にインスタンスを作成する前に、ベースイメージのリストを確認しておきます。
一番左がベースファイルイメージ名でその右隣がエイリアスです。イメージ名の前には「リモートサーバー名:」が付くこともあります。--show-unsupported
オプションを付けると、サポートの切れたイメージも表示されます。どうしても古いUbuntuを利用しなくてはならない場合に思い出すと良いでしょう[2]。
仮想マシンを起動するにはmultipass launch
を実行します。
ここでは「foo」という名前で仮想マシンを作成しています。本来コマンドの最後には「ベースイメージ名」もしくは「ベースイメージファイル」を指定します。今回のように未指定なら、「lts」つまり上記multipass find
の結果ならUbuntu 18.04 LTSが使われるのです[3]。
「--name foo
」を省いた場合、自動的に名前が付けられます。また「primary」という名前を付けると、他のサブコマンドでも名前の指定を省略できます。
取得したベースイメージは「/var/snap/multipass/common/cache/multipassd/vault/images/bionic-20191008/」以下にキャッシュとして保存されます。よって次のインスタンス作成からはすばやくイメージを起動できます。インスタンス用のイメージは「/var/snap/multipass/common/data/multipassd/vault/instances/」以下にコピー・保存されます。
ちなみに仮想マシンインスタンスは、1個のCPU、5GiBのストレージ、1GiBのメモリーで作られます。設定を変えたい場合はそれぞれ「-c
」「-d
」「-m
」オプションを利用してください。
作成したインスタンスは「multipass list
」で確認できます。
1度ベースイメージをダウンロードしたら、オリジナルが更新されない限りはそれを使い続けます。つまり新しいインスタンスの作成は、仮想マシンの起動とcloud-initの実行だけで完了します。
LXDに比べると当然時間はかかっているものの、30秒強でインスタンスの準備が完了していますね。
multipass stop
でインスタンスを停止できます。「-t X
」でX分後の停止をスケジュールします。
multipass start
でインスタンスの起動、multipass restart
でインスタンスの再起動です。
multipass delete
でインスタンスを削除できます。
しかし「削除状態」になるだけで、実際にデータがすべて削除されるわけではありません。multipass list
でステータスが表示されているように、イメージファイルもそのまま残っています。「削除状態」になったインスタンスはmultipass recover
で復旧できます。
「誤って削除」してしまった場合も安心です。削除状態のインスタンスを、「本当に削除」したい場合は、multipass purge
コマンドを使います。
multipass purge
するとインスタンスのデータはすべて消されます。「誤って本当に削除」してしまった場合の復旧手段はありませんので注意してください。ちなみに引数もなく、削除状態は「すべて」消去します。
インスタンスにログインする
multipass shell
コマンドを使うと指定したインスタンスにログインできます。
実際には単にインスタンス上で動いているOpenSSHサーバーを経由して、SSHログインしているだけです。しかしながらインスタンスのIPアドレスなどを調べることなく、名前だけでログインできるのは便利でしょう。
ちなみにmultipassアカウントはcloud-init経由で作られています。具体的なcloud-initの内容は「/var/snap/multipass/common/data/multipassd/vault/instances/foo/cloud-init-config.iso」の中を見ると確認できます。
ポイントはdefault_user
としてmultipassを指定していること、そしてそのユーザーのログイン用に鍵を登録していることです。この鍵はmultipassが作っている鍵であり、multipass
コマンド経由のSSHログインに使われます。
multipassユーザーのパスワードはロックされています。しかしながら/etc/sudoers.d/90-cloud-init-users
にて、パスワード無しでsudo
コマンドを実行できるようにもなっています。よってsudo passwd multipass
を実行し、パスワードを設定したら、90-cloud-init-users
を消しておきましょう。
LXDのlxc exec
コマンドのように、multipass exec
コマンドを使うと「インスタンスの中でコマンドを実行した結果」をホスト上で取得できます。
ホストとインスタンスの間のファイル送受信
SSHサーバーが動いている以上、ホストとインスタンスの間ではscp
コマンドでファイルの送受信が可能です。それを踏まえてmultipassにはmultipass transfer
コマンドというホストとインスタンス間やインスタンス同士でファイルを送受信するためのインターフェースが存在します。
送受信するファイルは「インスタンス名:ファイル名」です。インスタンス名を省略したらホストのファイルを指定したことになります。ファイル名はフルパスでない場合、送信先のホームディレクトリに保存されます。
もうひとつの方法がmultipass mount
コマンドを用いて、ホストのディレクトリをインスタンス内部にマウントする方法です。これにはsshfsが使われます。
ちなみにインスタンス内部のディレクトリをホストにマウントすることはできないようです。インスタンス間のマウントも想定していないようですが、ホスト上の同じディレクトリを、異なるインスタンス間でマウントすれば問題ないでしょう。
cloud-initでインスタンスを構築する
Ubuntuのベースイメージはcloud-initに対応しています。つまりcloud-initを用いれば、起動時にイメージの初期設定を行えるのです。cloud-initに関しては第561回を参照してください。
試しに標準ユーザーのパスワードを「ubuntu」に、またSSH接続時のパスワード認証を有効化してみましょう。
このcloud-config.yaml
を適用するには、multipass launch
時に「--cloud-init
」オプションを指定します。
ファイル名を「cloud-config.yaml
」の代わりに「-
」にすると標準入力からデータを読みますので、自動化する際に使うと良いでしょう。
これによりインスタンス上のmultipassアカウントにパスワードが設定されます。パスワードログインするために、multipass shell
ではなく普通のssh
コマンドを使ってみましょう。
無事に設定が反映されているようですね。実際にcloud-initがどう動いているかは、インスタンス上の/var/log/cloud-init-output.log
や/var/log/cloud-init.log
を参照してください。
GUIから管理する
multipassにはmultipass.gui
コマンドという、システムトレイにmultipassのインスタンスリストを表示する機能が同梱されています。
multipass.guiを起動するにはデスクトップ環境が動いている必要があります。GNOME Shellなら、Super+Aキーでアプリケーションリストから「multipass」を検索し、表示されるアイコンを実行すると良いでしょう。
トップバーの右上に、multipassのアイコンが表示されるようになるはずです。
他にも「multipass-gui」という完全なGUIクライアントもあるようです。snapから簡単にインストールできるのですが、1年以上更新されていません。実際に使ってみると、うまくステータスを取得できなかったり、途中でコアダンプしたりするので、実際に使うためにはそれなりに手を入れる必要があるでしょう。
バックエンドを変更する
仮想マシンのバックエンドはmultipass set
コマンドで変更できます。Linux版の場合、インストール直後のバックエンドはqemuになっているはずです。
Linux版のバージョン8.0でサポートしているバックエンドは、qemuとlibvirtのふたつとなります。libvirtに切り替える場合、あらかじめホストにlibvirtがインストールされている必要があります。さらに既存のインスタンスはすべて削除されてしまいました。他にもいくつか問題があるようです。
よって実際に切り替えられるとはいいがたい状況なのですが、もし試してみたい場合は次のように実行してください。
たとえばWindows版でバックエンドをHyper-VからVirtualBoxに切り替えたいのであれば、上記の「libvirt」を「virtualbox」に変更します。