Ubuntu Weekly Recipe

第590回Windows/macOS/Linuxで使える仮想マシン管理ツールmultipass』

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パッケージをインストールする方法が一番かんたんです。

$ sudo snap install multipass --classic --beta

multipassはまだ安定版をリリースしていないのでbetaチャンネルからダウンロードします。また、それなりにパッケージサイズが大きいため、余力のあるインターネット回線を利用してください。

multipassでインスタンスを作成する

multipassをインストールするとmultipassデーモンが動き出します。multipassコマンドはこのmultipassデーモンとUnixドメインソケット経由で通信しながら、仮想マシンインスタンスを操作するのです。このあたりはLXDと同じ形ですね。

まずはmultipassコマンドが使えるか確認してみましょう。

$ multipass help
Usage: multipass [options] <command>
Create, control and connect to Ubuntu instances.

This is a command line utility for multipass, a
service that manages Ubuntu instances.

Options:
  -h, --help     Display this help
  -v, --verbose  Increase logging verbosity, repeat up to three times for more
                 detail

Available commands:
  delete    Delete instances
  exec      Run a command on an instance
  find      Display available images to create instances from
  get       Get a configuration option
  help      Display help about a command
  info      Display information about instances
  launch    Create and start an Ubuntu instance
  list      List all available instances
  mount     Mount a local directory in the instance
  purge     Purge all deleted instances permanently
  recover   Recover deleted instances
  restart   Restart instances
  set       Set a configuration option
  shell     Open a shell on a running instance
  start     Start instances
  stop      Stop running instances
  suspend   Suspend running instances
  transfer  Transfer files between the host and instances
  umount    Unmount a directory from an instance
  version   Show version details

これを見れば、もうおおよその使い方はわかると思います。

実際にインスタンスを作成する前に、ベースイメージのリストを確認しておきます。

$ multipass find
Image                   Aliases           Version          Description
snapcraft:core          core16            20191003         Snapcraft builder for Core 16
snapcraft:core18                          20191003         Snapcraft builder for Core 18
core                    core16            20190806         Ubuntu Core 16
core18                                    20190806         Ubuntu Core 18
16.04                   xenial            20191002.1       Ubuntu 16.04 LTS
18.04                   bionic,lts        20191008         Ubuntu 18.04 LTS
19.04                   disco             20191008         Ubuntu 19.04
daily:19.10             devel,eoan        20191010         Ubuntu 19.10

一番左がベースファイルイメージ名でその右隣がエイリアスです。イメージ名の前には「リモートサーバー名:」が付くこともあります。--show-unsupportedオプションを付けると、サポートの切れたイメージも表示されます。どうしても古いUbuntuを利用しなくてはならない場合に思い出すと良いでしょう[2]⁠。

仮想マシンを起動するにはmultipass launchを実行します。

$ multipass launch --name foo
Launched: foo

ここでは「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で確認できます。

$ multipass list
Name                    State             IPv4             Image
foo                     Running           10.58.110.234    Ubuntu 18.04 LTS

1度ベースイメージをダウンロードしたら、オリジナルが更新されない限りはそれを使い続けます。つまり新しいインスタンスの作成は、仮想マシンの起動とcloud-initの実行だけで完了します。

$ time multipass launch --name bar
Launched: bar

real    0m35.678s
user    0m0.026s
sys     0m0.021s

LXDに比べると当然時間はかかっているものの、30秒強でインスタンスの準備が完了していますね。

multipass stopでインスタンスを停止できます。-t XでX分後の停止をスケジュールします。

$ multipass stop bar
$ multipass list
Name                    State             IPv4             Image
bar                     Stopped           --               Ubuntu 18.04 LTS
foo                     Running           10.58.110.234    Ubuntu 18.04 LTS

multipass startでインスタンスの起動、multipass restartでインスタンスの再起動です。

multipass deleteでインスタンスを削除できます。

$ multipass delete bar
$ multipass list
Name                    State             IPv4             Image
foo                     Running           10.58.110.234    Ubuntu 18.04 LTS
bar                     Deleted           --               Not Available

しかし「削除状態」になるだけで、実際にデータがすべて削除されるわけではありません。multipass listでステータスが表示されているように、イメージファイルもそのまま残っています。⁠削除状態」になったインスタンスはmultipass recoverで復旧できます。

$ multipass recover bar
$ multipass list
Name                    State             IPv4             Image
bar                     Stopped           --               Ubuntu 18.04 LTS
foo                     Running           10.58.110.234    Ubuntu 18.04 LTS

「誤って削除」してしまった場合も安心です。削除状態のインスタンスを、⁠本当に削除」したい場合は、multipass purgeコマンドを使います。

削除状態にしておく
$ multipass delete bar
$ multipass list
Name                    State             IPv4             Image
foo                     Running           10.58.110.234    Ubuntu 18.04 LTS
bar                     Deleted           --               Not Available

削除状態のインスタンスをすべて消去
$ multipass purge
$ multipass list
Name                    State             IPv4             Image
foo                     Running           10.58.110.234    Ubuntu 18.04 LTS

消去してしまうと復旧はできなくなる
$ multipass recover bar
recover failed: The following errors occurred:
instance "bar" does not exist

multipass purgeするとインスタンスのデータはすべて消されます。⁠誤って本当に削除」してしまった場合の復旧手段はありませんので注意してください。ちなみに引数もなく、削除状態は「すべて」消去します。

インスタンスにログインする

multipass shellコマンドを使うと指定したインスタンスにログインできます。

$ multipass shell foo
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Oct 12 15:12:41 JST 2019

  System load:  0.0               Processes:           80
  Usage of /:   20.8% of 4.67GB   Users logged in:     0
  Memory usage: 11%               IP address for ens3: 10.58.110.234
  Swap usage:   0%


0 packages can be updated.
0 updates are security updates.


Last login: Sat Oct 12 15:12:15 2019 from 10.58.110.1
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

multipass@foo:~$

実際には単にインスタンス上で動いているOpenSSHサーバーを経由して、SSHログインしているだけです。しかしながらインスタンスのIPアドレスなどを調べることなく、名前だけでログインできるのは便利でしょう。

ちなみにmultipassアカウントはcloud-init経由で作られています。具体的なcloud-initの内容は「/var/snap/multipass/common/data/multipassd/vault/instances/foo/cloud-init-config.iso」の中を見ると確認できます。

$ sudo mount -o loop /var/snap/multipass/common/data/multipassd/vault/instances/foo/cloud-init-config.iso /mnt
$ ls /mnt/
meta-data  user-data  vendor-data
$ cat /mnt/user-data
#cloud-config
{}
$ cat /mnt/vendor-data
#cloud-config
growpart:
    mode: auto
    devices: [/]
    ignore_growroot_disabled: false
users:
    -   default
manage_etc_hosts: true
ssh_authorized_keys:
    -   ssh-rsa (略) multipass@localhost
timezone: Asia/Tokyo
system_info:
    default_user:
        name: multipass
$ sudo umount /mnt

ポイントは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コマンドを使うと「インスタンスの中でコマンドを実行した結果」をホスト上で取得できます。

$ multipass exec foo -- lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic

ホストとインスタンスの間のファイル送受信

SSHサーバーが動いている以上、ホストとインスタンスの間ではscpコマンドでファイルの送受信が可能です。それを踏まえてmultipassにはmultipass transferコマンドというホストとインスタンス間やインスタンス同士でファイルを送受信するためのインターフェースが存在します。

$ multipass exec foo ls
$ touch src.dat
$ multipass transfer src.dat foo:dst.dat
$ multipass exec foo ls
dst.dat

送受信するファイルは「インスタンス名:ファイル名」です。インスタンス名を省略したらホストのファイルを指定したことになります。ファイル名はフルパスでない場合、送信先のホームディレクトリに保存されます。

もうひとつの方法がmultipass mountコマンドを用いて、ホストのディレクトリをインスタンス内部にマウントする方法です。これにはsshfsが使われます。

ファイルの準備
$ mkdir src
$ touch src/test.dat
$ ls -l src
合計 0
-rw-rw-r-- 1 shibata shibata 0 10月 12 21:20 test.dat

マウントする前だとディレクトリ自体が存在しない
$ multipass exec foo ls dst
ls: cannot access 'dst': No such file or directory

ローカルのsrcをインスタンス上のdstとしてマウントする
$ multipass mount src foo:dst

dstディレクトリが自動作成されてマウントされていることがわかる
$ multipass exec foo -- ls -l dst
total 0
-rw-rw-r-- 1 multipass multipass 0 Oct 12 21:20 test.dat
$ multipass exec foo mount | grep dst
:/home/shibata/src on /home/multipass/dst type fuse.sshfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)

アンマウント
$ multipass umount foo:dst

ちなみにインスタンス内部のディレクトリをホストにマウントすることはできないようです。インスタンス間のマウントも想定していないようですが、ホスト上の同じディレクトリを、異なるインスタンス間でマウントすれば問題ないでしょう。

cloud-initでインスタンスを構築する

Ubuntuのベースイメージはcloud-initに対応しています。つまりcloud-initを用いれば、起動時にイメージの初期設定を行えるのです。cloud-initに関しては第561回を参照してください。

試しに標準ユーザーのパスワードを「ubuntu」に、またSSH接続時のパスワード認証を有効化してみましょう。

$ cat >cloud-config.yaml <<EOF
#cloud-config
password: ubuntu
chpasswd: { expire: False }
ssh_pwauth: True
EOF

このcloud-config.yamlを適用するには、multipass launch時に--cloud-initオプションを指定します。

$ multipass launch --name baz --cloud-init cloud-config.yaml
Launched: baz

ファイル名をcloud-config.yamlの代わりに-にすると標準入力からデータを読みますので、自動化する際に使うと良いでしょう。

これによりインスタンス上のmultipassアカウントにパスワードが設定されます。パスワードログインするために、multipass shellではなく普通のsshコマンドを使ってみましょう。

$ multipass list
Name                    State             IPv4             Image
baz                     Running           10.58.110.172    Ubuntu 18.04 LTS
foo                     Running           10.58.110.234    Ubuntu 18.04 LTS

$ ssh multipass@10.58.110.172
The authenticity of host '10.58.110.172 (10.58.110.172)' can't be established.
ECDSA key fingerprint is SHA256:va9z6ybaB8seg0ARyt9jeH/mu+qCWNAEwpxqZt8d2p0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.58.110.172' (ECDSA) to the list of known hosts.
multipass@10.58.110.172's password:
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Oct 13 01:02:14 JST 2019

  System load:  0.03              Processes:           82
  Usage of /:   20.8% of 4.67GB   Users logged in:     0
  Memory usage: 11%               IP address for ens3: 10.58.110.172
  Swap usage:   0%


0 packages can be updated.
0 updates are security updates.


Last login: Sun Oct 13 01:01:18 2019 from 10.58.110.1
multipass@baz:~$

無事に設定が反映されているようですね。実際に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のアイコンが表示されるようになるはずです。

図1 実際にできるのはインスタンスの状態表示と停止・シェルの起動ぐらい
画像

他にもmultipass-guiという完全なGUIクライアントもあるようです。snapから簡単にインストールできるのですが、1年以上更新されていません。実際に使ってみると、うまくステータスを取得できなかったり、途中でコアダンプしたりするので、実際に使うためにはそれなりに手を入れる必要があるでしょう。

バックエンドを変更する

仮想マシンのバックエンドはmultipass setコマンドで変更できます。Linux版の場合、インストール直後のバックエンドはqemuになっているはずです。

$ multipass get local.driver
qemu

Linux版のバージョン8.0でサポートしているバックエンドは、qemuとlibvirtのふたつとなります。libvirtに切り替える場合、あらかじめホストにlibvirtがインストールされている必要があります。さらに既存のインスタンスはすべて削除されてしまいました。他にもいくつか問題があるようです。

よって実際に切り替えられるとはいいがたい状況なのですが、もし試してみたい場合は次のように実行してください。

$ sudo multipass set local.driver=libvirt

たとえばWindows版でバックエンドをHyper-VからVirtualBoxに切り替えたいのであれば、上記の「libvirt」「virtualbox」に変更します。

おすすめ記事

記事・ニュース一覧