vyosをまたisoからbuildした

# vyosのdocker imageをisoからbuildした話し

## vyosがまた使えなくなった

会社のansible勉強会的な取り組みで、vyosをdockerで使っています。  
vyosは無料で使えるので、ありがたい限りなのですが、たまに想定外なふるまいをします。  
2年前くらいには先人が作成してくださったdocker imageを使っていたのですが、routerのoperation modeに入るためのuserが突如作られなくなってしまい、その時に初めて自分でisoからbuildしてみました。  
しかし、その時ちゃんと記録を残していなかったので、今回また苦労することに。  
というわけで、今回こそちゃんと記録を残します

## 今回起こったこと

今回はconfigをcommitできなくなってしまいました。  
それどころか、起動時の初期configも読み込めないです。  

```
# 初期configがない！
vyos@vyos:~$ show configuration 
Configuration under specified path is empty
vyos@vyos:~$ 

# commitもできない！      
vyos@vyos:~$ configure 
[edit]
vyos@vyos# set system host-name 'vyos_test'
[edit]
vyos@vyos# compare 
+system {
+    host-name vyos_test
+}
[edit]
vyos@vyos# commit

Invalid host name vyos_test

[[]] failed
Commit failed
Failed to generate committed config
[edit]
vyos@vyos# 
```

起動ログを読んでみても、

```
Mar  5 13:18:48 vyos vyos-configd[48]: Sending response 1
Mar  5 13:18:48 vyos systemd[1]: opt-vyatta-config-tmp-new_config_660.mount: Succeeded.
Mar  5 13:18:48 vyos vyos-router[105]:  configure
Mar  5 13:18:48 vyos vyos-router[885]:  failed!
Mar  5 13:18:48 vyos systemd[1]: Reloading.
Mar  5 13:18:49 vyos vyos-config[121]: Configuration error
```

起動時のconfigureさえできてないんだなーという程度のことしか分からず...  

ということで、imageを再度buildしてみることにしました。

## 手順

ざっくりと流れを説明すると、

1. vyosのisoをbuildするためのdocker imageをpull
1. isoをmakeするためのscriptをgit clone
1. build用のdocker containerでscriptを動かして、isoをmakeする
1. hostに戻って、squashfs-toolsでごにょごにょしてdocker imageを作る(よく分かってない)
1. vyosのdocker imageをdocker runして確認

てな感じです。  

公式Doc
https://docs.vyos.io/en/equuleus/contributing/build-vyos.html
https://docs.vyos.io/en/latest/contributing/build-vyos.html
https://docs.vyos.io/en/latest/installation/virtual/docker.html


### 下準備
今回はEC2でAmazon Linuxを立てて、dockerをinstallして、そこでもちゃもちゃしました。  
というのも、今まで使ってたvyosのimageが何故かubuntuのdockerやrhel系のpodmanで、operation modeに入れない現象が解決しておらず、Amazon Linuxだけは改善していたんです。  
（今回imageを作り直したら、その問題も無事解決しました！）

### vyosのisoをbuildする用のdocker imageをpull

今回は最初は上手くいく見通しが全く立ってなかったので、vyosのversion1.3と1.4を並行して進めました。

```bash
# 1.3
$ docker pull vyos/vyos-build:equuleus

# 1.4
$ docker pull vyos/vyos-build:current
```

### makeするためのscriptをcloneしてmake

```bash
# 1.3
$ cd ~
$ mkdir vyos13
$ cd vyos13
$ git clone -b equuleus --single-branch https://github.com/vyos/vyos-build
$ cd vyos-build
$ docker run --rm -it --privileged -v $(pwd):/vyos -w /vyos vyos/vyos-build:equuleus bash

# ここでdocker containerに入るので、pormptが"vyos_bld@d4220bb519a0:/vyos"に変わる
$ ./configure --architecture amd64
$ sudo make iso
```

これで1hくらい待つと、`build`というディレクトリに`vyos-1.3-rolling-<datetime>-amd64.iso`ができあがります。  
dockerの中で作ったファイルですが、ちゃんとvolume mountされているので、host側にも残ってます。

1.4もほぼ同じなのですが、scriptが`configure`ではなく`build-vyos-image`でした。

```bash
# 1.4
$ cd ~
$ mkdir vyos14
$ cd vyos14
$ git clone -b current --single-branch https://github.com/vyos/vyos-build
$ cd vyos-build
$ docker run --rm -it --privileged -v $(pwd):/vyos -w /vyos vyos/vyos-build:current bash

# ここでdocker containerに入るので、pormptが"vyos_bld@8153428c7e1f:/vyos$"に変わる

$ sudo ./build-vyos-image iso --architecture amd64
$ sudo make iso

```

### isoからcontainer imageを作成

ここからは1.3も1.4もファイル名程度の差分しかないので、1.3を例に書いていきます。  
このあたりは、前回buildしたときはちゃんとコマンドの意味を調べたのですが、それはとうの昔の話し。  
もうさっぱり覚えていません。  
そして、今回は何も考えずに公式Docのコピペで済ませてしまいました。  

```bash
$ pwd
# -> /home/ec2-user/vyos13

$ cp vyos-build/build/vyos-1.3-rolling-<datetime>-amd64.iso .
$ mkdir rootfs
$ sudo mount -o loop vyos-1.3-rolling-<datetime>-amd64.iso rootfs
$ sudo yum install -y squashfs-tools
$ mkdir unsquashfs
$ sudo unsquashfs -f -d unsquashfs/ rootfs/live/filesystem.squashfs
$ sudo tar -C unsquashfs -c . | docker import - vyos-1.3-rolling-<datetime>-amd64
```

`docker images`してみたら、無事できてました。  

```bash
REPOSITORY        TAG                        IMAGE ID       CREATED       SIZE
vyos              1.3-rolling-202303060135   51b2597b0b75   4 hours ago   1.25GB
vyos/vyos-build   equuleus                   d561207f43bd   3 days ago    4.06GB
vyos/vyos-build   current                    85c2221781ca   11 days ago   4.63GB
```

### 恐る恐るのdocker runからのshow configuration


```bash
$ docker run -d --rm --name vyos13 --privileged -v /lib/modules:/lib/modules vyos:1.3-rolling-202303060135 /sbin/init
$ docker exec -it vyos13 su - vyos

# containerに入りました

vyos@vyos:~$ show configuration 
interfaces {
    loopback lo {
    }
}
system {
    config-management {
        commit-revisions 100
    }
    conntrack {
        modules {
            ftp
            h323
            nfs
            pptp
            sip
            sqlnet
            tftp
        }
    }
    console {
        device ttyS0 {
            speed 115200
        }
    }
    host-name vyos
    login {
        user vyos {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
            }
        }
    }
    ntp {
        server time1.vyos.net {
        }
        server time2.vyos.net {
        }
        server time3.vyos.net {
        }
    }
    syslog {
        global {
            facility all {
                level info
            }
            facility protocols {
                level debug
            }
        }
    }
}
vyos@vyos:~$ 
```

ひゅー！vyattaね！

## その後

commitもできたし、ansibleでの設定変更も無事できることが確認できました。  
というわけで、`docker push`しましたので、vyosで遊んでみたい方はどうぞ使ってみてください。  
ちゃんとしたメンテナンスは全然してないので、その点は悪しからずで。

```bash
docker run -d --rm --privileged -v /lib/modules:/lib/modules shihou/vyos13:latest /sbin/init

docker run -d --rm --privileged -v /lib/modules:/lib/modules shihou/vyos14:latest /sbin/init
```