2023/01/02 追記
GitHub でフォークして、とりあえず動くようにしてみた。
2023/01/03 追記
プルリクが通って、この記事の分は vyos-pi-builder に反映された。この記事みたいなことをやらなくても動くようになってるはず。
はじめに
vyos-pi-builder ってのを見つけて「おーこんなのあるんだ、なら簡単にできるやろ。」と思ったが、うまく動かないというorz (2022/12/20 現在)
カーネルのビルドとか初体験だし、有識者から見ると「なんでそんなことしてるの?」ってところが多々あると思います。私の知識向上のため、ぜひご指導ご鞭撻のほどお願いいたします!
ubuntu と docker の準備
さほど縛りはなかろうが、私が作業した環境はこんな感じ。
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
Package: docker-ce
Version: 5:20.10.22~3-0~ubuntu-jammy
Priority: optional
Section: admin
Maintainer: Docker <support@docker.com>
Installed-Size: 88.5 MB
Depends: containerd.io (>= 1.4.1), docker-ce-cli, iptables, libseccomp2 (>= 2.3.0), libc6 (>= 2.34), libdevmapper1.02.1 (>= 2:1.02.97), libsystemd0
Recommends: apparmor, ca-certificates, docker-ce-rootless-extras, git, libltdl7, pigz, procps, xz-utils
Suggests: aufs-tools, cgroupfs-mount | cgroup-lite
Conflicts: docker (<< 1.5~), docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package
Replaces: docker-engine
Homepage: https://www.docker.com
Download-Size: 20.5 MB
APT-Manual-Installed: yes
APT-Sources: https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
Description: Docker: the open-source application container engine
Docker is a product for you to build, ship and run any application as a
lightweight container
.
Docker containers are both hardware-agnostic and platform-agnostic. This means
they can run anywhere, from your laptop to the largest cloud compute instance and
everything in between - and they don't require you to use a particular
language, framework or packaging system. That makes them great building blocks
for deploying and scaling web apps, databases, and backend services without
depending on a particular stack or provider.
Package: qemu-user-static
Version: 1:6.2+dfsg-2ubuntu6.6
Built-Using: gcc-12 (= 12.1.0-2ubuntu1~22.04), glib2.0 (= 2.72.1-1), glibc (= 2.35-0ubuntu3), gnutls28 (= 3.7.3-4ubuntu1.1), liburing (= 2.1-2build1), zlib (= 1:1.2.11.dfsg-2ubuntu9.2)
Priority: optional
Section: universe/otherosfs
Source: qemu
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian QEMU Team <pkg-qemu-devel@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 130 MB
Provides: qemu-user-binfmt
Recommends: binfmt-support
Suggests: sudo
Conflicts: qemu-user-binfmt
Breaks: binfmt-support (<< 2.1.7~)
Homepage: http://www.qemu.org/
Download-Size: 13.0 MB
APT-Manual-Installed: yes
APT-Sources: http://jp.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages
Description: QEMU user mode emulation binaries (static version)
QEMU is a fast processor emulator: currently the package supports
ARM, CRIS, i386, M68k (ColdFire), MicroBlaze, MIPS, PowerPC, SH4,
SPARC and x86-64 emulation. By using dynamic translation it achieves
reasonable speed while being easy to port on new host CPUs.
.
This package provides the user mode emulation binaries, built
statically. In this mode QEMU can launch Linux processes compiled for
one CPU on another CPU.
.
qemu-user-static package will register binary formats which the provided
emulators can handle, so that it will be possible to run foreign binaries
directly.
リポジトリのクローン
まず、vyos-pi-builder と vyos-build リポジトリをクローンする。すべてはここから始まる。
git clone https://github.com/runborg/vyos-pi-builder
cd vyos-pi-builder
git clone -b current --single-branch https://github.com/vyos/vyos-build
cd ..
各ファイルの変更 (vyos-pi-builder 関連)
そして、おもむろに vyos-pi-builder/Makefile
を書き換える。元のままだと docker のオプションが古いのか、うまく動かない。
あと、カーネルもビルドしなきゃならんので、それ用の記述も増やす。
Makefile のインデントはタブ。
container:
- sudo rm -rf vyos-build
- git clone -b current --single-branch https://github.com/vyos/vyos-build
- sudo docker build --arch arm64 vyos-build/docker -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -t vyos/vyos-build:current-arm64
+ sudo docker build --platform arm64 vyos-build/docker -t vyos/vyos-build:current-arm64
+ pi-kernel:
+ sudo docker run --rm -it --platform arm64 --privileged -v "$(shell pwd)":/vyos -v /dev:/dev --sysctl net.ipv6.conf.lo.disable_ipv6=0 vyos/vyos-build:current-arm64 /bin/bash -c 'cd /vyos; /bin/bash -x build-pi-kernel.sh'
- iso-local:
- sudo docker run --rm -it --arch arm64 --privileged -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -v "$(shell pwd)":/vyos -v /dev:/dev --sysctl net.ipv6.conf.lo.disable_ipv6=0 localhost/vyos/vyos-build:current-arm64 /bin/bash -c 'cd /vyos; /bin/bash -x build-image.sh'
iso-registry:
- sudo docker run --rm -it --arch arm64 --privileged -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -v "$(shell pwd)":/vyos -v /dev:/dev --sysctl net.ipv6.conf.lo.disable_ipv6=0 vyos/vyos-build:current-arm64 /bin/bash -c 'cd /vyos; /bin/bash -x build-image.sh'
+ sudo docker run --rm -it --platform arm64 --privileged -v "$(shell pwd)":/vyos -v /dev:/dev --sysctl net.ipv6.conf.lo.disable_ipv6=0 vyos/vyos-build:current-arm64 /bin/bash -c 'cd /vyos; /bin/bash -x build-image.sh'
で、カーネル ビルド用のスクリプトを作る。
touch vyos-pi-builder/build-pi-kernel.sh
chmod 775 vyos-pi-builder/build-pi-kernel.sh
vi vyos-pi-builder/build-pi-kernel.sh
set -x
set -e
ROOTDIR=$(pwd)
cd vyos-build/packages/linux-kernel/
git clone https://github.com/raspberrypi/linux
./build-kernel.sh
git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
#ln -s linux/drivers/firmware linux-firmware
./build-linux-firmware.sh
git clone https://github.com/accel-ppp/accel-ppp.git
./build-accel-ppp.sh
vyos-pi-builder/build-image.sh
も弄っていく。まず、せっかく変更した vyos-build 内のファイルを削除されると泣くので、そこを削除。
あと、最近 vyos-build のフレーバー システムが変わった (というか現在進行形で変更中?) らしく、そこもなんとかする。ビルド フレーバーの指定方法がよく判らんかったから、無理矢理感がハンパない。
# (前略)
# Clean out the build-repo and copy all custom packages
- rm -rf vyos-build
- git clone http://github.com/vyos/vyos-build vyos-build
for a in $(find build -type f -name "*.deb" | grep -v -e "-dbgsym_" -e "libnetfilter-conntrack3-dbg"); do
echo "Copying package: $a"
cp $a vyos-build/packages/
done
cd vyos-build
echo "Copy new default configuration to the vyos image"
cp ${ROOTDIR}/config.boot.default data/live-build-config/includes.chroot/opt/vyatta/etc/config.boot.default
# Build the image
- VYOS_BUILD_FLAVOR=data/generic-arm64.json
- ./configure
- make iso
+ /vyos/vyos-build/build-vyos-image iso --architecture arm64
cd $ROOTDIR
# Build u-boot
bash build-u-boot.sh
# (後略)
各ファイルの変更 (vyos-build 関連)
VyOS の中で telegraf とかいうパッケージを使ってるらしく、live-build の処理の途中でインストールが走る。ので、所定の場所にパッケージ リポジトリの GPG 鍵を置く。
wget -qO- https://repos.influxdata.com/influxdb.key > vyos-pi-builder/vyos-build/data/live-build-config/archives/influxdb.key.chroot
vyos-build で用意されている arm64.toml もいろいろ足りないから追加する。
+ additional_repositories = [
+ "deb [arch=arm64] https://repos.influxdata.com/debian bullseye stable"
+ ]
+
+ kernel_flavor = "arm64-vyos"
+
# Packages added to images for x86 by default
packages = [
+ "vyos-linux-firmware",
+ "telegraf",
"grub-efi-arm64"
]
bootloaders = "grub-efi"
カーネルのバージョンによくわからん「-v8」が付くから、無理やり動かすためにスクリプトをちょっと変える。(美しいとか関係なく、とにかく動かす!)
- --linux-packages linux-image-{{kernel_version}} \
+ --linux-packages linux-image-{{kernel_version}}-v8 \
- FW_FILES=$(find ${LINUX_SRC}/debian/linux-image/lib/modules/${KERNEL_VERSION}${KERNEL_SUFFIX}/kernel/drivers/net -name *.ko | xargs modinfo | grep "^firmware:" | awk '{print $2}')
+ FW_FILES=$(find ${LINUX_SRC}/debian/linux-image/lib/modules/${KERNEL_VERSION}-v8${KERNEL_SUFFIX}/kernel/drivers
ビルドしてみる
各 make で、それぞれ 1 ~ 2 時間かかる…。
まずは Docker コンテナ。
cd vyos-pi-builder
make container
次に、カーネル。
make pi-kernel
そしてついに、VyOS。
make iso-registry
Raspberry Pi Imager で焼き焼き & いざ起動
vyos-pi-builder/vyos-bcm2711-rpi-4-b.img
を microSD に焼く。
Wi-Fi を使えるようにする (VyOS 上での対処)
やっと動いた VyOS だが、Wi-Fi が使えない…。有線 LAN でインターネットに接続できるようにして、足りないファイルを持ってくる。本当はイメージ作成の段階で入れたほうがキレイなんだろうが、もういいでしょ…。
sudo -i
vi /etc/apt/sources.list
deb http://ftp.de.debian.org/debian bullseye main non-free-firmware
apt update
apt install firmware-brcm80211
vi /lib/firmware/brcm/brcmfmac43455-sdio.txt
modprobe -r brcmfmac
modprobe brcmfmac
ファイルの内容は以下。
/lib/firmware/brcm/brcmfmac43455-sdio.txt
# Cloned from bcm94345wlpagb_p2xx.txt
NVRAMRev=$Rev: 498373 $
sromrev=11
vendid=0x14e4
devid=0x43ab
manfid=0x2d0
prodid=0x06e4
#macaddr=00:90:4c:c5:12:38
nocrc=1
boardtype=0x6e4
boardrev=0x1304
#XTAL 37.4MHz
xtalfreq=37400
btc_mode=1
#------------------------------------------------------
#boardflags: 5GHz eTR switch by default
# 2.4GHz eTR switch by default
# bit1 for btcoex
boardflags=0x00480201
boardflags2=0x40800000
boardflags3=0x44200100
phycal_tempdelta=15
rxchain=1
txchain=1
aa2g=1
aa5g=1
tssipos5g=1
tssipos2g=1
femctrl=0
AvVmid_c0=0,157,1,126,1,126,1,126,1,126
pa2ga0=-170,5896,-680
pa2ga1=-156,4032,-547
pa5ga0=-150,5547,-628,-150,5583,-640,-158,5608,-649,-160,5757,-673
pa5ga1=-109,3831,-519,-88,3821,-512,-125,3731,-528,-103,3829,-516
itrsw=1
pdoffsetcckma0=2
pdoffset2gperchan=0,-2,1,0,1,0,1,1,1,0,0,-1,-1,0
pdoffset2g40ma0=16
pdoffset40ma0=0x8888
pdoffset80ma0=0x8888
extpagain5g=2
extpagain2g=2
tworangetssi2g=1
tworangetssi5g=1
# LTECX flags
# WCI2
ltecxmux=0
ltecxpadnum=0x0504
ltecxfnsel=0x22
ltecxgcigpio=0x32
maxp2ga0=80
ofdmlrbw202gpo=0x0022
dot11agofdmhrbw202gpo=0x4442
mcsbw202gpo=0x98444422
mcsbw402gpo=0x98444422
maxp5ga0=82,82,82,82
mcsbw205glpo=0xb9555000
mcsbw205gmpo=0xb9555000
mcsbw205ghpo=0xb9555000
mcsbw405glpo=0xb9555000
mcsbw405gmpo=0xb9555000
mcsbw405ghpo=0xb9555000
mcsbw805glpo=0xb9555000
mcsbw805gmpo=0xb9555000
mcsbw805ghpo=0xb9555000
swctrlmap_2g=0x00000000,0x00000000,0x00000000,0x010000,0x3ff
swctrlmap_5g=0x00100010,0x00200020,0x00200020,0x010000,0x3fe
swctrlmapext_5g=0x00000000,0x00000000,0x00000000,0x000000,0x3
swctrlmapext_2g=0x00000000,0x00000000,0x00000000,0x000000,0x3
vcodivmode=1
deadman_to=481500000
ed_thresh2g=-54
ed_thresh5g=-54
eu_edthresh2g=-54
eu_edthresh5g=-54
ldo1=4
rawtempsense=0x1ff
cckPwrIdxCorr=3
cckTssiDelay=150
ofdmTssiDelay=150
txpwr2gAdcScale=1
txpwr5gAdcScale=1
dot11b_opts=0x3aa85
cbfilttype=1
fdsslevel_ch11=6
# Improved Bluetooth coexistence parameters from Cypress
btc_mode=1
btc_params8=0x4e20
btc_params1=0x7530
おまけ: ShellInABox を入れる
ここまでで VyOS on Raspberry Pi は動くようになる。あとはおまけ。VyOS に ShellInABox を入れてみる。
sudo -i
vi /etc/apt/sources.list
deb http://ftp.de.debian.org/debian bullseye main
apt update
apt install shellinabox
まぁなんというか、ふつー。でも、VyOS にパッケージを簡単に追加できるって知らなかったから、「おー!」って感じでした。
おまけ 2: iPhone で USB テザリング
ついでに、iPhone の USB テザリング用のパッケージでも入れておくか。使うかはわからんが。
apt install ipheth-utils libimobiledevice-utils usbmuxd
ってやって一旦シャットダウン後、iPhone を USB-A - Lightning ケーブルで繋げて電源 ON した。そうすると、iPhone が eth0 として一旦認識された後、eth1 に代わるという動きをした。
そのせいか、オンボードのネットワーク インターフェイスが見えなくなってしまった。(eth1 の iPhone しかない)
オンボードを元々 eth1 にすれば、iPhone は eth0 で安定してくれるだろうとの憶測から、それをやってみる。
最近の他の Linux ディストリビューションと同様に、udev の設定を弄る。
設定には MAC アドレスが必要。00:90:4c:c5:12:37
は仮の値なので、自分のデバイスの MAC アドレスを書く。
sudo -i
vi /etc/udev/rules.d/70-persistent-net.rules
# eth1
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:90:4c:c5:12:37", ATTR{type}=="1", NAME="eth1"
この後、再起動して無事に eth0 (iPhone) と eth1 (オンボード) が見えるようになった。
show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface IP Address S/L Description
--------- ---------- --- -----------
eth0 - u/u
eth1 - u/D
lo 127.0.0.1/8 u/u
::1/128
wlan0 - u/D
なお、もともと eth0 で設定していたオンボード LAN の設定は飛ぶので、作業前に控えておく必要がある。まぁ以下のコマンドの結果を取っておけば OK。
show configuration commands
おわり。あとは、これを持ち歩いて使ってみる。