Ubuntu 20.04でMultipassをブリッジネットワークで動かす(Ver1.7.0)

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

筆者はUbuntuのmultipassコマンドが大好きっ子です。
お手軽なコマンド体系と楽ちん操作で、仮想マシンを動かしたり止めたりが簡単にできるので、良い機能だなと思います。

しかし、ネットワーク部分があまりいけてませんでした。しかし、ブリッジインターフェースを使うことができるようになりました。

という記事を書きました(汗)。

Ubuntu 20.04でMultipassをブリッジネットワークで動かす(Ver1.6.2まで) - Qiita
https://qiita.com/ynott/items/d8cf08c1f4a279e37177

設定方法が分かりにくいとか、GitHubのIssueで文句を言いましたところmultipass Ver.1.7.0が__[リリース](https://discourse.ubuntu.com/t/announcing-the-multipass-1-7-release/23298)__され、ちょっと設定方法が変わったようです
(文句を言ったから直してくれたわけではなくロードマップにあったようです)。

そこで、Ver.1.7.0の設定方法を試してみました。という記事になります。

# 1. 環境情報

OS: Ubuntu 20.04.2 LTS (GNU/Linux 5.8.0-59-generic x86_64)
Network: 192.168.xxx.0/24
NIC: enp2s0
Ubuntu母艦マシンIP: 192.168.xxx.yyy
multipass: Version 1.7.0

# 2. 前提

- ~~multipassのネットワークは、ネットワークのブリッジを先に作っておく必要があります。~~(1.7.0から不要です。Multipassがブリッジインターフェースを作成します
- ~~ネットワークブリッジは、netplanで作るのがお勧めです(NetworkManagerでも作れなくはないと思いますが、私はできませんでした)~~
- Ubuntu母艦マシンは固定IPにします(DHCPでも大丈夫だと思います)。
- lxdが必要です。
- multipass 1.7.0でテストしています。

# 3. multipassをインストール

```bash
$ sudo snap install multipass
multipass 1.7.0 from Canonical✓ installed
```

既に1.7.0がインストールされている場合は不要です。

この時点で`multipass networks`のコマンドは、qemuのままなのでエラーになります。

```
$ multipass networks
networks failed: The networks feature is not implemented on this backend.
```

# 4. zfsをインストール

この後でLXDのdefaultストレージプールを編集するときに必要になるのでzfsutilsも入れておきましょう。

```bash
sudo apt install zfsutils-linux
```

# 5. lxdをインストール

```bash
$ sudo snap install lxd
lxd 4.16 from Canonical✓ installed
```

こちらも既に 4.16がインストールされている場合は不要です。

**~~1.6.2で必要だった初期設定は不要になりました。~~ 嘘です。必要でした。下記に追記しています**

## 5-1. lxdを初期化

multipass 1.6.2と同じです。

```
$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (lvm, zfs, ceph, btrfs, dir) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=30GB]: 100GB
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]:
Would you like the LXD server to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
```

デフォルトと違う注意ポイントは以下の2つです。

LXDのストレージプールはデフォルトの30GBでもいいですが、増やしておきましょう。

```
Size in GB of the new loop device (1GB minimum) [default=30GB]: 100GB
```

network bridgeインターフェースは、multipassが作るようになったのでlxdで作る必要はありません(multipass 1.6.2と同じ)。
`no` と答えます。

```
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
```

# 6. multipassをlxdに接続する
## 6-1. multipassのローカルドライバーをqemuからlxdに変更

```bash
$ sudo multipass set local.driver=lxd
```

変更できたか確認する

```bash
$ multipass get local.driver
lxd
```

## 6-2. multipassをlxdに接続

```bash
$ sudo snap connect multipass:lxd lxd
```

接続できたので`multipass networks`コマンドを再度実行

```
$ multipass networks
Name    Type      Description
enp2s0  ethernet  Ethernet device
mpbr0   bridge    Network bridge for Multipass
```

mpbr0が追加されているのが確認できます。
しかし、`enp2s0`のブリッジインターフェースはまだ作成されていません。

## 6-3. LXDのストレージプールを確認

zfsのストレージプールを確認します。

```
$ sudo lxc storage list
+---------+--------+--------------------------------------------+-------------+---------+
|  NAME   | DRIVER |                   SOURCE                   | DESCRIPTION | USED BY |
+---------+--------+--------------------------------------------+-------------+---------+
| default | zfs    | /var/snap/lxd/common/lxd/disks/default.img |             | 0       |
+---------+--------+--------------------------------------------+-------------+---------+
```

100GBになっているのを確認(デフォルトは30GB)

```
$ sudo ls -la /var/snap/lxd/common/lxd/disks/default.img -h
-rw------- 1 root root 94G  8月  9 14:34 /var/snap/lxd/common/lxd/disks/default.img
```

## 6-4. multipassで使用するブリッジインターフェースを指定する

ネットワークインターフェースが複数ある場合は、ブリッジネットワークで使うインターフェースを指定しておく。

```
sudo multipass set local.bridged-network=enp2s0
```

# 7. multipassでブリッジネットワークを作成する
## 7-1. multipass でインスタンスを1つ起動する

`--bridged` オプションを付けてlaunchする。
**_注意！！！：この時にブリッジインターフェースが作成されるのでネットワークが1回切断される。あわてない用に気をつける_**
(一回切断されるがインスタンスは継続して作成されるようです)


> **NetworkManagerの場合は、新しいブリッジインターフェースが作成されます。
> 既存のインターフェースにIPアドレスを付けていても引き継いでくれないので注意してください。
> 新しいインターフェースにIPアドレスを再度付け直す必要があります。
> ネットワークインターフェースが1つしかない場合には接続できなくなります**

```bash
$ multipass launch --bridged 20.04
Multipass needs to create a bridge to connect to enp2s0.
This will temporarily disrupt connectivity on that interface.

Do you want to continue (yes/no)? yes
Starting ethereal-bettong \
Socket error Event: 32 Error: 10053.
Connection closing...Socket close.

Connection closed by foreign host.
```

再接続してインスタンスの作成を確認する

```bash
$ multipass list
Name                    State             IPv4             Image
ethereal-bettong        Running           10.74.86.201     Ubuntu 20.04 LTS
                                          192.168.xxx.5
```

192.168.xxx.5がブリッジネットワークに付与されたIPアドレス

## 7-2. ブリッジネットワークインターフェースを確認する

`multipass networks` コマンドでブリッジインターフェースを確認する

```bash
$ multipass networks
Name       Type      Description
br-enp2s0  bridge    Network bridge with enp2s0
enp2s0     ethernet  Ethernet device
mpbr0      bridge    Network bridge for Multipass
```

`br-enp2s0`が追加されている。

## 7-3. ブリッジインターフェースを指定してインスタンスを作成する

`br-enp2s0`がブリッジインターフェースとして作成されたのが分かったので、こちらを利用してインスタンスを起動してみる

```bash
$ multipass launch --bridged --network name=br-enp2s0,mode=manual
Launched: eloquent-emu
$ multipass list
Name                    State             IPv4             Image
eloquent-emu            Running           10.74.86.8       Ubuntu 20.04 LTS
                                          192.168.XXX.2
```

`mode=manual`を指定しているのにIPアドレスがついているのはご愛敬ですね。

## 8. まとめ

ブリッジネットワークを作らなくてよくなったのと、lxd initしなくてよくなったのは楽になりました。
(ブリッジインターフェースを作るときに切れてしまうのは仕方ないですが、心臓にはよくありません)

ちょっと触っていて、ブリッジインターフェースが動かなくなったりして接続が切れることがありました。
(sudo snap stop multipass したからかも..)

それ以外は快適です。

## 9. 注意点

* multipassのバックエンドがqemuからlxdに切り替えると既存の仮想マシンは見えなくなります！
* multipassが起動している状態で`zfsutils-linux`をインストールすると以下のログがでてインストールが完了しません。
* `zvol_wait[33286]: cannot open 'rpool/export/vault/block': dataset does not exist`
* 以下のようにすればインストールが完了します。
    * 1. `multipass stop --all`でインスタンスを全て停止
    * 2. `sudo snap stop multipass`でmultipassを停止 
* ネットワークインターフェースの管理にNetworkManagerを使っていると新しいブリッジインターフェースが作成されたときにIPアドレスが切り替わります。DHCP環境でない場合にはIPアドレスが割り振られず接続できなくなります。