【もうできない】私でもできる！M2MacBookでarm 64版VyOSコンテナ作成

:::note warn
ここで言う「私でもできる！」は筆者でもできるという意味であり、これを読んだ全ての人ができるという意味ではないので注意
:::


## 2024/11/22追記
もうできなくなっちゃいました。

## 10/03追記
vyos1.5で動作することの検証をしました
- おまけ(docker hubに任意のイメージをpushする)

を追加しました

## やりたいこと
AppleSiliconチップのMacBookにインストールしたDockerで動くarm64のVyOSコンテナの作成
(執筆時は現在最新バージョンの1.4のDockerイメージを作成)
## 結論
arm v8が悪い
## 環境
|実行環境| PC | OS | CPU |Ram | 
|-|-|-|-|-|
|ローカル| MacBookAir|  macOS 13.3.1 | Apple M2 | 16GB |
|仮想環境 |(UTM) |debian-12.1.0 | ARM64(aarch64) | 4GB|

## 大まかな手順
- dockerが動作するまでの環境構築
- [VyOSのビルド公式リポジトリ](https://github.com/vyos/vyos-build/tree/crux) と[linux-kernel](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git)のクローン
- クローンしたファイルの編集
- dockerコンテナ内に入る
- linuxカーネルのビルド
- そのほかのビルド
- isoのビルド
- isoからDockerイメージの作成
## 手順
ホストマシン上でdebianをvmwareやUTMなどを使って仮想環境を作成
今回は`UTM` と`debian-12.1.0-arm64-netinst`を使用
名前だけ指定して他のパラメータはデフォルト設定

初期設定後`ip a`でネットワークを確認してターミナルからssh
```
$ ip a 
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:20:5a:33 brd ff:ff:ff:ff:ff:ff
    altname enp2s0
    inet 192.168.137.131/24 brd 192.168.137.255 scope global dynamic ens160
       valid_lft 1593sec preferred_lft 1593sec
    inet6 fe80::20c:29ff:fe20:5a33/64 scope link 
       valid_lft forever preferred_lft forever
```
これ以降は全てsshで作業を行う(コピペが面倒なので)

### 初期設定
- sudoの追加
    sudoがないのでsudoのインストール
```
~$ su
apt update
apt upgrade
apt install sudo 
```
sudoグループにユーザを追加
```
su -
visudo
```

```text:/etc/sudoers
%wheel  ALL=(ALL)       ALL
[ユーザ名] ALL=(ALL)       ALL 
```
保存して`sudo pwd`などを実行してsudo権限があることを確認[[参考文献1]](https://it.notepad-blog.com/tool/207/)
- dockerのインストール
スクリプトを使用してインストールと動作確認[[参考文献2]](https://docs.docker.com/engine/install/debian/)
```
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo docker run hello-world
```
### リポジトリのクローン
まず作業ディレクトリを作成して公式のリポジトリをクローンする
```
mkdir vyos
cd ./vyos/
git clone https://github.com/vyos/vyos-build.git
```
`/vyos-build/packages/linux-kernel/`にlinuxのカーネルをクローン
```
cd ./vyos-build/packages/linux-kernel/
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
```

クローンが終わったら`/vyos-build/data/defaults.toml`を見て`kernel_version`に合わせてlinuxのリポジトリをチェックアウトする(今回は`kernel_version = "6.1.43"`)
```
cd ./linux/
git checkout v6.1.43 
```
### ファイルの編集
公式リポジトリの状態だとarmでは動作しないのでファイルの書き換えを行う
```
cd ~/vyos/vyos-build/
vim ./data/architectures/arm64.toml 
```

`/vyos-build/data/architectures/arm64.toml`はほぼ全書き換えなので書き換え後を載せます
```/vyos-build/data/architectures/arm64.toml 
additional_repositories = [
  "deb [arch=arm64] https://repo.saltproject.io/py3/debian/11/arm64/3004 bullseye main"
]

kernel_flavor = "arm64-vyos"

# Packages included in ARM64 images by default
packages = ["vyos-linux-firmware", "telegraf", "grub-efi-arm64", "openvpn-dco"]

bootloaders = "grub-efi"
```
変えたものは
- `additional_repositories`の変更
- `kernel_flavor`から`v8-`を削除
- パッケージの追加

`(~~省略~~)/linux-kernel/arch/arm64/configs/vyos_defconfig`の編集


```text:linux-kernel/arch/arm64/configs/vyos_defconfig
cat ./vyos_defconfig  |grep CONFIG_LOCALVERSION
CONFIG_LOCALVERSION="-v8" <-ここのv8を消す！！！！
```
編集後
```text:vyos_defconfig
cat ./vyos_defconfig  |grep CONFIG_LOCALVERSION
CONFIG_LOCALVERSION=""
```
のようになってればOK

### telegrafの導入
telegrafをインストールしないといけない[[参考文献3]](https://qiita.com/DJ_Kaosun/items/6fc072e8490725e6c037)ので　
```
cd ./packages
curl -OL https://dl.influxdata.com/telegraf/releases/telegraf_1.27.3-1_arm64.deb
```
curlで指定しているリンクはhttps://github.com/influxdata/telegraf/releases の`arm64` `Debian`のダウンロードリンクを指定

### ビルド
`/vyos-build`ディレクトリに移動してからdockerコンテナに入る。

```
cd ../
sudo docker run --rm -it --privileged -v $(pwd):/vyos -w /vyos vyos/vyos-build:current-arm64 bash
```

カーネルのビルドを行う。
```
cd ./packages/linux-kernel/
sudo ./build-kernel.sh 
```

ファームウェアのクローンとビルド
```
git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
sudo ./build-linux-firmware.sh
```
accel-pppのクローンとビルド
```
git clone https://github.com/accel-ppp/accel-ppp.git
sudo ./build-accel-ppp.sh
```

最後にisoのビルド
`--build-by`は自分の名前を入れておく。適当でも動く
```
cd /vyos
sudo ./build-vyos-image iso --architecture arm64 --build-by "yanbaru"
```

### Dockerイメージの作成
まず作成したisoを`/vyos`にコピー
```
cd ~/vyos
cp ./vyos-build/build/vyos-1.4-rolling-202308081319-arm64.iso .
```
次に作業ディレクトリを作ってisoをマウント
```
mkdir  rootfs
sudo mount -o loop ./vyos-1.4-rolling-202308081319-arm64.iso ./rootfs/
```
`read-only`の警告が出ても無視して継続

`squashfs-tools`のインストール
```
sudo apt install -y squashfs-tools
```

マウントしたisoからファイルを取り出す
```
sudo unsquashfs -f -d unsquashfs/ rootfs/live/filesystem.squashfs
```

取り出したファイルをtarでアーカイブしてdockerイメージを作成
```
sudo tar -C unsquashfs -c . | sudo docker import - vyos-1.4-arm64
```

## 動作確認
イメージを動かしてみる
```
sudo docker images
REPOSITORY        TAG             IMAGE ID       CREATED         SIZE
vyos-1.4-arm64    latest          735deca60d6b   8 seconds ago   1.6GB
sudo docker run -d --rm  --privileged -v /lib/modules:/lib/modules vyos-1.4-arm64 /sbin/init 
sudo docker ps
sudo docker exec -it 4df0601f89dc su - vyos
vyos@4df0601f89dc:~$c
```
動いた！！

あとはこれをお手元になんらかの方法で持ってきてDockerで動かせばOK(Docker Hub)とか
        
## 困ったこと
ビルドやiso作成中に以下のようなエラーが発生してビルド等が終了する。
```
E: Release file for http://〜〜〜 is not valid yet (invalid for another 37min 22s). Updates for this repository will not be applied.
```
これはコンテナの時刻がズレて発生しているので1度コンテナを出てから再度入って止まったコマンドを実行すると動く[[参考文献4]](https://ginpen.com/2021/06/05/apt-update-release-file-is-not-valid-yet/)。

## おまけ 10/03追加
docker hubに任意のイメージをpushする
```
docker login
docker tag {イメージID} {dockerID}/{イメージ名:tag}
docker push {dockerID}/{イメージ名:tag}   
```
## 最後に
[公式ビルドガイド](https://docs.vyos.io/en/latest/contributing/build-vyos.html#build-iso)と[RPi版のビルド](https://github.com/runborg/vyos-pi-builder/tree/master)とその[解説記事](https://qiita.com/DJ_Kaosun/items/6fc072e8490725e6c037)に基づいて作成しました。参考サイトに感謝申し上げます。 また時間があれば編集とビルドを行うスクリプトを作成予定です。

## Special Thanks
[cffnpwr](https://qiita.com/cffnpwr)に手伝ってもらいました。ありがとうございます。

## 参考文献
[1] 【CeontOS7】「sudoers ファイル内にありません。この事象は記録・報告されます」というメッセージが出た時の対処
 https://it.notepad-blog.com/tool/207/

[2] Linux に Docker を一発インストールするワンライナー
https://qiita.com/KEINOS/items/bdc9450c1a88c210aa88

[3]Raspberry Pi 4 Model B 上で VyOS を動かす
https://qiita.com/DJ_Kaosun/items/6fc072e8490725e6c037

[4] WSLのapt updateでRelease file is not valid yetと言われたらWSLの時刻がずれてるかも。
https://ginpen.com/2021/06/05/apt-update-release-file-is-not-valid-yet/


## 動作確認済み環境
- vyos1.4
    - arm64
    - amd64
- vyos1.5
    - arm64