Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SONiCを自前でビルドする話

 SONiCを自前でビルドする話

SONiC Workshop Japan 2024の発表スライド。
SONiCのビルド方法、カスタマイズ方法、およびソースコードを変更する際の手法について解説します。

Masaru OKI

May 24, 2024
Tweet

More Decks by Masaru OKI

Other Decks in Technology

Transcript

  1. © Internet Initiative Japan Inc. 目次 自己紹介 みなさん、SONiCをビルドしてますか? ビルドするモチベーション ビルド方法サマリー

    カスタマイズしてビルドする バージョンを固定してビルドする ソースコードを変更する(1,2,例) 変更を含めてビルドするスクリプトをつくりました ビルドに失敗することもある まとめ 2
  2. © 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
  3. © 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
  4. © Internet Initiative Japan Inc. ビルドするモチベーション カスタマイズしたい • ユーザ、パスワードを変更したい •

    標準で組み込まれてない機能を組み込みたい(たとえばREST API) • 不要な機能を外したい(たとえばNAT) • ビルドを速くしたい(たとえばdpkgキャッシュを有効にする) バージョンを固定したい • daily buildでは品質を担保できない(動く動かないがギャンブル) ソースコードを変更したい • バグ修正 • 機能追加 5
  5. © 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
  6. © 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
  7. © 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
  8. © 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
  9. © 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
  10. © 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
  11. © 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
  12. © 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