【2024/1/19追記】公式サポートページにて Apple Silicon 対応が発表されました。そのため,本記事は全て古い情報となります。
前記事の続編です。
この書籍の公式サポート環境は,Ubuntu 20.04 on WSL2 on Windows 11 (x86_64) という環境です。非公式サポートながら,Ubuntu 20.04 on Multipass on Intel Mac という環境も考慮されており,書籍の中で検証環境インストール法が1ページにわたり説明されているほか,サポートページにもMac用セットアップスクリプトがダウンロードできます。
残念ながら,現状(2024/1/16)では Apple Silicon 搭載 Mac では動作しませんが,サポートページには「対応検討中」とあります。
前記事で分析したとおり,Apple Silicon Mac で動作しない主な理由は使用する Docker イメージが x86_64 (amd64) 版であることに起因します。ですが,DockerHub のレポジトリを見ると,まさに今 ARM 版 Docker イメージの作成が進んでおり,Apple Silicon への対応が進められていると見られます。
というわけで,もう少し待てば Apple Silicon への対応がアナウンスされるものと期待されます。
ですが,公式対応を待ちきれなかったので,新しい ARM 版 Docker イメージを利用して,自前で Apple Silicon 対応を行いました。
Apple Silicon Mac での検証環境構築手順
1. Multipass をインストール
Multipass の公式サイトから macOS 版の Multipass の pkg インストーラをダウンロードしてインストールするか,または Homebrew で Multipass をインストールします。
$ brew install --cask multipass
2. Intel Mac 用セットアップスクリプトをダウンロードしてホーム直下に展開
サポートページから Intel Mac 用セットアップスクリプト tinet_mac.zip
をダウンロードし,ホームディレクトリ直下に tinet
ディレクトリとして配置します。
3. Intel Mac 用設定ファイルを Apple Silicon 用に書き換え
*.yaml
の Docker イメージを指定している部分について,Docker イメージ名の末尾に _arm
を付け加えます。
$ cd ~/tinet
$ sed -i '' '/^[[:space:]]*image: /s/$/_arm/' *.yaml
4. Multipass で Ubuntu 20.04 の仮想マシンを作成
$ multipass launch 20.04 --cpus 2 \
--name UBUNTU \
--mount $HOME/tinet:/mnt/c/tinet
5. Multipass のシェルに入る
$ multipass shell UBUNTU
6. 仮想マシン内の root ユーザのパスワードを設定して su する
ubuntu@UBUNTU:~$ sudo passwd root
New password:〈パスワード入力〉
Retype new password:〈パスワード再入力〉
passwd: password updated successfully
ubuntu@UBUNTU:~$ su
Password:〈パスワード入力〉
root@UBUNTU:/home/ubuntu#
7. 仮想マシン内でセットアップスクリプトを実行
root@UBUNTU:/home/ubuntu# bash /mnt/c/tinet/setup_mac.sh
8. 仮想マシン内で ARM 版 Linux 用 tinet バイナリをビルドして差し替え
上記セットアップスクリプトでインストールされる tinet
のバイナリは x86_64 用になっているので,自前で arm64 用 tinet
バイナリをビルドして,setup_mac.sh
がインストールしたものと差し替えます。
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. チェックスクリプトで確認
root@UBUNTU:/home/ubuntu# bash /mnt/c/tinet/check_mac.sh
(中略)
========================================================
All checks passed successfully.
========================================================
All checks passed successfully.
と出れば成功です。
10. 検証環境の構築
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. 検証環境の動作確認
root@UBUNTU:/home/ubuntu# docker exec -it cl1 /bin/bash
root@cl1:/#
ホスト名の表示が @UBUNTU
から @cl1
に変わります。
root@cl1:/# curl -k https://www.example.com/
sv1.example.com
sv1.example.com
と返ってくれば,検証環境が正しく動作していることになります。