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してみることにしました。
手順
ざっくりと流れを説明すると、
- vyosのisoをbuildするためのdocker imageをpull
- isoをmakeするためのscriptをgit clone
- build用のdocker containerでscriptを動かして、isoをmakeする
- hostに戻って、squashfs-toolsでごにょごにょしてdocker imageを作る(よく分かってない)
- 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を並行して進めました。
# 1.3
$ docker pull vyos/vyos-build:equuleus
# 1.4
$ docker pull vyos/vyos-build:current
makeするためのscriptをcloneしてmake
# 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
でした。
# 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のコピペで済ませてしまいました。
$ 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
してみたら、無事できてました。
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
$ 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で遊んでみたい方はどうぞ使ってみてください。
ちゃんとしたメンテナンスは全然してないので、その点は悪しからずで。
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