Slide 1

Slide 1 text

SONiCを自前でビルドする話 2024年5月24日 @docomo R&D OPENLAB ODAIBA 株式会社インターネットイニシアティブ 沖 勝 SONiC Workshop Japan 2024 1

Slide 2

Slide 2 text

© Internet Initiative Japan Inc. 目次 自己紹介 みなさん、SONiCをビルドしてますか? ビルドするモチベーション ビルド方法サマリー カスタマイズしてビルドする バージョンを固定してビルドする ソースコードを変更する(1,2,例) 変更を含めてビルドするスクリプトをつくりました ビルドに失敗することもある まとめ 2

Slide 3

Slide 3 text

© Internet Initiative Japan Inc. 自己紹介 名前 沖 勝 (おき まさる) IIJで主にソフトウェア設計・実装の仕事をしています 主な活動 1992 LHa for UNIX 移植してJUNET(fj.sources)に公開 1996 NetBSD/x68k portmasterとしてNetBSDの開発に携わる 2001 IIJのルータ機器SEIL(ザイル)シリーズの開発に携わる 2013 NTTのOpenFlowソフトウェアスイッチ Lagopusの開発に携わる 2016 プログラマブルASICによるGTP-U処理PoCの開発に携わる 2018 ホワイトボックススイッチ+SONiCを動作検証 現在 社内インフラ刷新の検討したり内製ソフトウェアの開発など 3

Slide 4

Slide 4 text

© Internet Initiative Japan Inc. みなさん、SONiCをビルドしてますか? 公式がAzure pipelinesで自動ビルドしている ● https://github.com/sonic-net/sonic-buildimage/blob/master/README.md からたどれます ビルドしない人向け情報 ● https://sonic.software/ 最新ビルドイメージへのリンク集(このページ自体は非公式) 試しに動かしてみたいだけなら上記のものを用いれば十分です。 実機がなくてもSONiC-VS(Virtual Switch)をKVMやGNS3などで動かせます。 話者はおおよそ週に一度程度ですが、 最新ソースを取り込んで自前の修正を含めたSONiCをビルドしています。 4

Slide 5

Slide 5 text

© Internet Initiative Japan Inc. ビルドするモチベーション カスタマイズしたい ● ユーザ、パスワードを変更したい ● 標準で組み込まれてない機能を組み込みたい(たとえばREST API) ● 不要な機能を外したい(たとえばNAT) ● ビルドを速くしたい(たとえばdpkgキャッシュを有効にする) バージョンを固定したい ● daily buildでは品質を担保できない(動く動かないがギャンブル) ソースコードを変更したい ● バグ修正 ● 機能追加 5

Slide 6

Slide 6 text

© Internet Initiative Japan Inc. ビルド方法サマリー 環境によるが、目安として速くて30分程度、遅いと数時間かかる git clone https://github.com/sonic-net/sonic-buildimage cd sonic-buildimage make init make configure PLATFORM=ASIC_VENDOR make all # target/sonic-$PLATFORM.binが作られる(VSはsonic-vs.img.gz) PLATFORMとして指定するASIC_VENDOR ● barefoot Intel (Barefoot) Tofino ● broadcom Broadcom Trident, Tomahawk, Jericho ● mellanox NVIDIA (Mellanox) Spectrum ● vs x86仮想マシン など (caviumやp4はビルドできなくなって久しいです ) 6

Slide 7

Slide 7 text

© Internet Initiative Japan Inc. カスタマイズしてビルドする rules/config.userに記述すると、rules/configの値を上書きする make configureで設定が反映される ユーザ、パスワードを変更する USERNAME=sonic PASSWORD=YourPassword@SONiC # 平文です REST API機能を有効にする INCLUDE_RESTAPI=y NAT機能を無効にする INCLUDE_NAT=n DPKGキャッシュを有効にする SONIC_DPKG_CACHE_METHOD=rwcache 7

Slide 8

Slide 8 text

© Internet Initiative Japan Inc. バージョンを固定してビルドする sonic-net/sonic-buildimageをforkして自前で管理する タグをつけておき、以後はタグを指定しcheckoutしビルドする # forkしてclone (ghコマンドの例。あらかじめgh auth loginしておく) # fork先はorigin、fork元はupstreamで参照できる gh repo fork https://github.com/sonic-net/sonic-buildimage -–clone cd sonic-buildimage # 202311ブランチで固定する git checkout 202311 # タグをつけてoriginにpushする git tag BUILD_TEST_001 git push origin BUILD_TEST_001 # (checkoutは省略して)ビルドする make init make configure PLATFORM=broadcom make all 8

Slide 9

Slide 9 text

© Internet Initiative Japan Inc. ソースコードを変更する1 sonic-buildimage直下のファイルを変更する場合 1. forkする gh repo fork https://github.com/sonic-net/sonic-buildimage -–clone 2. forkしたリポジトリのファイルを変更する 例 htopをビルドするイメージに追加する sonic-buildimage/build_debian.shを変更(下記箇所にhtop \を追記) ## Pre-install the fundamental packages ## (中略) sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install \ (ここ) file \ 3. commit, pushする(tagなども適宜) git checkout -b htop # この例では変更をtopic branch ‘htop’に入れることにする git add build_debian.sh git commit -m ‘Add htop’ git push origin htop 4. (checkoutして)ビルドする 9

Slide 10

Slide 10 text

© Internet Initiative Japan Inc. ソースコードを変更する2 submodule(たとえばsrc/sonic-swss)のファイルを変更する方法 1. 変更後にdiffを作り保存し、都度patchを当てる submoduleをforkしない。シンプルだがpatchの管理が煩雑になりがち patch -p1 < patch/00-sonic-swss-nlmsg.patch 2. submoduleをforkし変更する。sonic-buildimageからの参照先を変更する 本家の変更を追従するのがやや手間(submodule参照先がconflictするため) git submodule set-url src/sonic-swss https://github.com/iMasaruOki/sonic-swss 3. submoduleをforkし変更する。本家のローカルコピーに変更差分を適用する 本家へのPRがやりやすくなる、master以外にも適用できる cd src/sonic-swss git remote add mine https://github.com/iMasaruOki/sonic-swss git rebase mine/nlmsg_newaddr # topic branchを作り変更をあらかじめpushしておいたものを適用 10

Slide 11

Slide 11 text

© Internet Initiative Japan Inc. ソースコードを変更する2 例 方法3の例(make init以降がsubmoduleの変更) git clone https://github.com/sonic-net/sonic-buildimage cd sonic-buildimage git remote add mine https://github.com/iMasaruOki/sonic-buildimage git rebase mine/copp-vrrp # VRRPのパケットをCPUに上げる変更を適用 git rebase mine/keepalived # keepalivedを組み込む変更を適用 make init # submoduleをひっぱってくる cd src/sonic-swss git remote add mine https://github.com/iMasaruOki/sonic-swss git rebase mine/nlmsg_newaddr # Ethernet*へのIP付与時にAPPL_DBを更新する変更を適用 cd ../.. make configure PLATFORM=broadcom make target/sonic-broadcom.bin 11

Slide 12

Slide 12 text

© Internet Initiative Japan Inc. 変更を含めてビルドするスクリプトをつくりました https://github.com/iMasaruOki/sonic-custom-build JSONでリポジトリやtopic branchの情報を記述。変更を取り込みビルドする $ cat config.json { "repository": "https://github.com/sonic-net/sonic-buildimage", "local-repository": "https://github.com/iMasaruOki", "remote-name": "mine", "local-changes": { "sonic-buildimage": [ "copp-vrrp", "keepalived" ], "sonic-buildimage/src/sonic-swss": [ "nlmsg_newaddr" ] } } $ ./sonic-custom-build -p broadcom -b master build-all 12

Slide 13

Slide 13 text

© Internet Initiative Japan Inc. ビルドに失敗することもある ビルド失敗の原因はさまざま。よく遭遇する失敗の原因を並べます 1. 本家のソースコードの不備 更新を待ちましょう。本日はここまで。 2. 外部サイトの不調 リトライしてだめだったら、改善するのを待ちましょう。 3. 本家ソースコードの更新とconflictして変更を適用できない topic branchをcheckoutし、本家をrebaseで取り込みます。 git checkout copp-vrrp; git rebase origin/master; git push -f mine copp-vrrp conflictしないこともありますが、した場合は修正してgit rebase –continue 4. ディスク空き容量不足 DPKGキャッシュがあふれてることが多いです。古いのは消しましょう。 cd /var/cache/sonic; fd –change-older-than 1week –exec rm -r 13

Slide 14

Slide 14 text

© Internet Initiative Japan Inc. まとめ お試しであればビルド済みイメージを使うのが手っ取り早いです ビルドする理由はいろいろあります カスタマイズはrules/config.userに書くのが便利 ソースコードを変更する場合はforkすると管理が楽です submoduleの変更も含めてビルドするスクリプトをつくりました ぜひ皆さんもSONiCをビルドしましょう! 14