『体験しながら学ぶネットワーク技術入門』の検証環境を Apple Silicon Mac 上で構築

**【2024/1/19追記】**[公式サポートページ](https://www.sbcr.jp/support/4815617794/)にて Apple Silicon 対応が発表されました。そのため，本記事は全て古い情報となります。

---

[前記事](https://qiita.com/doraTeX/items/4ff049269e1c024219b5)の続編です。

https://qiita.com/doraTeX/items/4ff049269e1c024219b5

この書籍の公式サポート環境は，**Ubuntu 20.04 on WSL2 on Windows 11 (x86_64)** という環境です。非公式サポートながら，**Ubuntu 20.04 on Multipass on Intel Mac** という環境も考慮されており，書籍の中で検証環境インストール法が1ページにわたり説明されているほか，[サポートページ](https://www.sbcr.jp/support/4815617794/)にもMac用セットアップスクリプトがダウンロードできます。

残念ながら，現状(2024/1/16)では Apple Silicon 搭載 Mac では動作しませんが，[サポートページ](https://www.sbcr.jp/support/4815617794/)には「**対応検討中**」とあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41739/90d727cd-f49b-f6ad-7389-6dd5f9b373ab.png)

[前記事](https://qiita.com/doraTeX/items/4ff049269e1c024219b5)で分析したとおり，Apple Silicon Mac で動作しない主な理由は使用する Docker イメージが x86_64 (amd64) 版であることに起因します。ですが，[DockerHub のレポジトリ](https://hub.docker.com/u/sphalerite1313)を見ると，まさに今 ARM 版 Docker イメージの作成が進んでおり，Apple Silicon への対応が進められていると見られます。

というわけで，もう少し待てば Apple Silicon への対応がアナウンスされるものと期待されます。

ですが，公式対応を待ちきれなかったので，新しい ARM 版 Docker イメージを利用して，自前で Apple Silicon 対応を行いました。

# Apple Silicon Mac での検証環境構築手順

## 1. Multipass をインストール

Multipass の[公式サイト](https://multipass.run/install)から macOS 版の Multipass の pkg インストーラをダウンロードしてインストールするか，または Homebrew で Multipass をインストールします。

```sh:Homebrew から Multipass をインストールする場合
$ brew install --cask multipass
```


## 2. Intel Mac 用セットアップスクリプトをダウンロードしてホーム直下に展開

[サポートページ](https://www.sbcr.jp/support/4815617794/)から Intel Mac 用セットアップスクリプト `tinet_mac.zip` をダウンロードし，ホームディレクトリ直下に `tinet` ディレクトリとして配置します。

## 3. Intel Mac 用設定ファイルを Apple Silicon 用に書き換え

`*.yaml` の Docker イメージを指定している部分について，Docker イメージ名の末尾に `_arm` を付け加えます。

```sh:設定ファイルの書き換え
$ cd ~/tinet
$ sed -i '' '/^[[:space:]]*image: /s/$/_arm/' *.yaml
```


## 4. Multipass で Ubuntu 20.04 の仮想マシンを作成

```sh
$ multipass launch 20.04 --cpus 2 \
  --name UBUNTU \
  --mount $HOME/tinet:/mnt/c/tinet
```

## 5. Multipass のシェルに入る

```sh
$ multipass shell UBUNTU
```

## 6. 仮想マシン内の root ユーザのパスワードを設定して su する

```sh
ubuntu@UBUNTU:~$ sudo passwd root
New password:〈パスワード入力〉
Retype new password:〈パスワード再入力〉
passwd: password updated successfully
ubuntu@UBUNTU:~$ su
Password:〈パスワード入力〉
root@UBUNTU:/home/ubuntu#
```


## 7. 仮想マシン内でセットアップスクリプトを実行

```sh
root@UBUNTU:/home/ubuntu# bash /mnt/c/tinet/setup_mac.sh
```


## 8. 仮想マシン内で ARM 版 Linux 用 tinet バイナリをビルドして差し替え

上記セットアップスクリプトでインストールされる `tinet` のバイナリは x86_64 用になっているので，自前で arm64 用 `tinet` バイナリをビルドして，`setup_mac.sh` がインストールしたものと差し替えます。

```sh:仮想マシン内の root で
cd /tmp
# tinetのレポジトリをクローン
git clone https://github.com/tinynetwork/tinet tinet && cd $_
# Dockerイメージのgoコンパイラを使ってtinetをビルド
docker run --rm -i -t -v $PWD:/v -w /v golang:1.17 go build
# カレントディレクトリに生成されたARM版tinetバイナリをデプロイして差し替え
cp tinet /bin
cp tinet /usr/bin
# 作業用ディレクトリ・Dockerイメージを削除
cd
rm -rf /tmp/tinet
docker rmi golang:1.17
```

## 9. チェックスクリプトで確認

```sh
root@UBUNTU:/home/ubuntu# bash /mnt/c/tinet/check_mac.sh
（中略）
========================================================
All checks passed successfully.
========================================================
```

`All checks passed successfully.` と出れば成功です。


## 10. 検証環境の構築

```sh
root@UBUNTU:/home/ubuntu# tinet up -c /mnt/c/tinet/spec_01.yaml | sh -x
root@UBUNTU:/home/ubuntu# tinet conf -c /mnt/c/tinet/spec_01.yaml | sh -x
```

これがエラーなく終了すれば検証環境構築成功です。

## 11. 検証環境の動作確認

```sh
root@UBUNTU:/home/ubuntu# docker exec -it cl1 /bin/bash
root@cl1:/#
```

ホスト名の表示が `@UBUNTU` から `@cl1` に変わります。

```sh
root@cl1:/# curl -k https://www.example.com/
sv1.example.com
```

`sv1.example.com` と返ってくれば，検証環境が正しく動作していることになります。