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

SONiCを自前でビルドする話

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 SONiCを自前でビルドする話

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

Avatar for Masaru OKI

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