私でもできる！amd64版VyOSのコンテナ作成

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

:::note warn
この記事は[私でもできる！M2MacBookでarm 64版VyOSのコンテナ作成](https://qiita.com/yanbaru/items/c2b828a556d23f8da25e)をもとに作成しています。
:::

## やりたいこと
- vyos1.4のDockerコンテナ作成
- [私の書いた記事](https://qiita.com/yanbaru/items/c2b828a556d23f8da25e)をもとにamd64で動くコンテナの作成

## 環境
|実行環境| PC | OS | CPU |Ram | 
|-|-|-|-|-|
|ローカル| 自作PC　|  Windows10 | i7-10700 | 16GB |
|仮想環境 |VirtualBox |debian-12.1.0 | 4コア| 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などを使って仮想環境を作成
今回は`VirtualBox` と`debian-12.1.0-amd64-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.45"`)
```
cd ./linux/
git checkout v6.1.45 
```


### 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_amd64.deb
```
curlで指定しているリンクはhttps://github.com/influxdata/telegraf/releases の`amd64` `Debian`のダウンロードリンクを指定

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

```
cd ../
sudo docker run --rm -it --privileged -v $(pwd):/vyos -w /vyos vyos/vyos-build:current 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 amd64 --build-by "yanbaru"
```

### Dockerイメージの作成
まず作成したisoを`/vyos`にコピー
```
cd ~/vyos
cp ./vyos-build/build/vyos-1.4-rolling-202308140706-amd64.iso .

```
次に作業ディレクトリを作ってisoをマウント
```
mkdir  rootfs
sudo mount -o loop ./vyos-1.4-rolling-202308140706-amd64.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-amd64
```

## 動作確認
イメージを動かしてみる
```
sudo docker images
REPOSITORY        TAG             IMAGE ID       CREATED         SIZE
yanbaru/vyos-1.4   amd64     9b8933195e41   45 minutes ago   1.77GB
sudo docker run -d --rm  --privileged -v /lib/modules:/lib/modules vyos-1.4-amd64 /sbin/init 
sudo docker ps
sudo docker exec -it d53801b306d9 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/)。

## 最後に
[公式ビルドガイド](https://docs.vyos.io/en/latest/contributing/build-vyos.html#build-iso)に基づいて作成しました。参考サイトに感謝申し上げます。
## 参考文献
[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/