SONiCを移植してみよう

 SONiCを移植してみよう

SONiCはホワイトボックススイッチ用のNOSですが、あらゆるスイッチに対応しているわけではありません。本資料では、SONiCに対応していないスイッチの上でSONiCを動作させる移植作業について実体験に基づいて解説します。

Fab252f33476e4b269b402cbcb6d4db2?s=128

Masaru OKI

June 28, 2019
Tweet

Transcript

  1. 2.

    モチベーション • SONiCを使いたいが未実装の機能や、対応していないスイッチがある。 ◦ SONiC本家に公式対応があれば、当然そちらを使う。 ◦ SONiC本家の開発ロードマップ があるが、実作業は遅れがち。 ◦ 独自移植や独自機能拡張に取り組むケース

    ▪ 本家の対応が望めない場合 ▪ スケジュールの関係 ▪ コストとの兼ね合い ◦ 本家が公式対応したが、すでに独自実装を用意し検証済だった場合 ▪ そのまま独自実装を使い続ける ▪ 本家に切り替える。再検証が必要になる 2
  2. 3.

    今回のターゲット • Accton (Edgecore) AS7726-32X • Broadcom Trident 3 (BCM56870)搭載ホワイトボックススイッチ

    ◦ 100GbE x 32ポート。 • SONiCはまだ公式に対応していない ◦ 「動かないんだけど」と Google Groupsに投稿したら 「edgecoreのサポートに問い合わせてくれ」と言われた ◦ 問い合わせる前にどこまでできるか見極めようと思った ◦ commit logなどを見ていると、バイナリ自体は Trident 3対応していそうな予感があった ◦ 設定ファイルをいじくる程度で動くのでは ? 3
  3. 4.

    事前調査 • 無変更のSONiCを入れられるか、入れるとどうなるかを確認。 ◦ インストール: できる ◦ ブート: できる ◦

    動作: FANの回転数が制御できている。 PSUの状態取得ができる。それだけ。 • パケット転送は動作しない。 ◦ インタフェースが見えない。 (本来はEthernet0, Ethernet4, ...が見えるはず) ◦ ログを読むと初期化でエラーが発生している。 ◦ config_db.json が空だった→用意しても変化なし。 4
  4. 6.

    ソースコードの取得とビルド • git clone https://github.com/Azure/sonic-buildimage • cd sonic-buildimage • make

    init • make configure PLATFORM=broadcom • make target/sonic-broadcom.bin ◦ 環境にもよるが、2~3時間かかる。 ◦ make allでもいいが、Arista EOS向けのバイナリも生成する。 • 一度ビルドすると小変更では再ビルドが走らない。 ◦ make cleanする。 ◦ 完全にごみを消すには make resetを実行。 6
  5. 7.

    移植で必要になるディレクトリとファイル • 下記はPRがあり、本家にマージ済みだった。 • device/accton/x86_64-accton_as77260_32x-r0 ◦ Accton-AS7726-32X/port_config.ini ◦ Accton-AS7726-32X/sai.profile ◦

    default_sku ◦ installer.conf ◦ plugins/eeprom.py ◦ plugins/psuutil.py ◦ plugins/sfputil.py • platform/broadcom/sonic-platform-modules-accton/as7726-32x ◦ classes ◦ modules ◦ service ◦ setup.py ◦ utils カーネルモジュール PSU, FAN, LED管理サービス ASIC設定ファイルのパス ポートごとのレーン割り当て SFPおよびPSU制御ユーティリティ 7
  6. 8.

    ログ調査 • なにかを読み込もうとして失敗している。動かない原因はこれ? localhost INFO syncd#supervisord: syncd 0:_cmd_cancun_file_load: Fail to

    open/load file bcm56870_a0_cmh.pkg. (Invalid parameter)#015 localhost INFO syncd#supervisord: syncd 0:_cmd_cancun_file_load: Fail to open/load file bcm56870_a0_cch.pkg. (Invalid parameter)#015 localhost INFO syncd#supervisord: syncd 0:_cmd_cancun_file_load: Fail to open/load file bcm56870_a0_ceh.pkg. (Invalid parameter)#015 localhost INFO syncd#supervisord: syncd 0:soc_cancun_cch_reg_set: CCH file is not loaded#015 localhost INFO syncd#supervisord: syncd 0:_cmd_cancun_file_load: Fail to open/load file bcm56870_a0_cih.pkg. (Invalid parameter)#015 localhost INFO syncd#supervisord: syncd UNIT0 CANCUN: #015 localhost INFO syncd#supervisord: syncd #011CIH: NOT LOADED#015 localhost INFO syncd#supervisord: syncd #015 localhost INFO syncd#supervisord: syncd #011CMH: NOT LOADED#015 localhost INFO syncd#supervisord: syncd #015 localhost INFO syncd#supervisord: syncd #011CCH: NOT LOADED#015 localhost INFO syncd#supervisord: syncd #015 localhost INFO syncd#supervisord: syncd #011CEH: NOT LOADED#015 localhost INFO syncd#supervisord: syncd #015 localhost INFO syncd#supervisord: syncd rc: localhost INFO syncd#supervisord: syncd MMU initialized#015 localhost INFO syncd#supervisord: syncd 0:soc_cancun_cch_reg_set: CCH file is not loaded#015 localhost INFO syncd#supervisord: syncd 0:bcm_esw_port_init: Error unit 0: Failed software port init: Feature not initialized#015 localhost INFO syncd#supervisord: syncd 0:_bcm_modules_init: bcm_init failed in port#015 8
  7. 9.

    pkgファイルはスイッチ実機の中にあった • GRUB Menu(ONIE)に最初からあるDIAGを選択 • シェルプロンプトが出るので探してみると、ログにあったファイルを発見 Accton Diagnostic Image: 0.0.1.0

    kernel: Linux 3.14.37 date: Jan 3 14:13:28 UTC 2018 Welcome to Accton diagnostic! root@(none):/# find . -name bcm*.pkg ./usr/local/bin/bcm56870_a0_cmh.pkg ./usr/local/bin/bcm56870_a0_cih.pkg ./usr/local/bin/bcm56870_a0_cfh.pkg ./usr/local/bin/bcm56870_a0_ceh.pkg ./usr/local/bin/bcm56870_a0_cch.pkg root@(none):/# 9
  8. 10.

    dockerコンテナの内容調整 • pkgファイルを参照するのはsyncd(からリンクされたSAIライブラリ) • syncdは、syncd docker内で動作する。 • つまり、syncd dockerからpkgファイルが見える必要がある。 •

    ホストの/usr/share/sonic/device/[PLATFORM]/[SKU] → syncd dockerの/usr/share/sonic/hwsku として見える ◦ device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/ ◦ pkgファイルはここに置くとインストールイメージに含まれる • syncdはパスなしでpkgファイルを読み込もうとする。 ◦ cdして実行するか、/ から見えるようにするか ◦ / から見えるようsymlinkを作ることに ▪ platform/broadcom/docker-syncd-brcm/Dockerfile.j2に変更を加えた 10
  9. 11.

    Dockerfile.j2変更内容 diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index 328f698f..98ff6428 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2

    +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -27,6 +27,13 @@ RUN chmod +x /usr/bin/dsserve /usr/bin/bcmcmd COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +# CANCUN firmwares for Trident 3 +RUN ln -s /usr/share/sonic/hwsku/bcm56870_a0_cch.pkg / +RUN ln -s /usr/share/sonic/hwsku/bcm56870_a0_ceh.pkg / +RUN ln -s /usr/share/sonic/hwsku/bcm56870_a0_cfh.pkg / +RUN ln -s /usr/share/sonic/hwsku/bcm56870_a0_cih.pkg / +RUN ln -s /usr/share/sonic/hwsku/bcm56870_a0_cmh.pkg / + ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs 11
  10. 12.

    新しいSONiCイメージで動作確認 • ログから読み込みエラーは消えた。 • しかしインタフェースが見えず通信できない問題は継続。 sonic INFO syncd#supervisord: syncd UNIT0

    CANCUN: #015 sonic INFO syncd#supervisord: syncd #011CIH: LOADED#015 sonic INFO syncd#supervisord: syncd #011Ver: 05.01.08#015 sonic INFO syncd#supervisord: syncd #015 sonic INFO syncd#supervisord: syncd #011CMH: LOADED#015 sonic INFO syncd#supervisord: syncd #011Ver: 05.01.08#015 sonic INFO syncd#supervisord: syncd #011SDK Ver: 06.05.14#015 sonic INFO syncd#supervisord: syncd #015 sonic INFO syncd#supervisord: syncd #011CCH: LOADED#015 sonic INFO syncd#supervisord: syncd #011Ver: 05.01.08#015 sonic INFO syncd#supervisord: syncd #011SDK Ver: 06.05.14#015 sonic INFO syncd#supervisord: syncd #015 sonic INFO syncd#supervisord: syncd #011CEH: LOADED#015 sonic INFO syncd#supervisord: syncd #011Ver: 05.01.08#015 sonic INFO syncd#supervisord: syncd #011SDK Ver: 06.05.14#015 12
  11. 13.

    ログ調査再び • SAIライブラリの内部APIらしきbrcm_sai_create_switch()でエラー。 • エラーの理由はログからは読み取れない。 • SAIのcreate switch APIが失敗の模様、動かない原因はおそらくこれ。 sonic

    ERR syncd#syncd: _brcm_sai_create_trap_resource:4327 field group config create failed with error Feature unavailable (0xfffffff0). sonic CRIT syncd#syncd: _brcm_sai_dm_init:9494 initializing hostif state failed with error -2. sonic CRIT syncd#syncd: brcm_sai_create_switch:621 initializing modules data failed with error -2. sonic ERR syncd#syncd: :- processEvent: attr: SAI_SWITCH_ATTR_INIT_SWITCH: true sonic ERR syncd#syncd: :- processEvent: attr: SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: 0x562fb32c63c0 sonic ERR syncd#syncd: :- processEvent: attr: SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: 0x562fb32c63d0 sonic ERR syncd#syncd: :- processEvent: attr: SAI_SWITCH_ATTR_SWITCH_SHUTDOWN_REQUEST_NOTIFY: 0x562fb32c63e0 sonic ERR syncd#syncd: :- processEvent: attr: SAI_SWITCH_ATTR_SRC_MAC_ADDRESS: B8:6A:97:8B:A6:FC sonic ERR syncd#syncd: :- processEvent: failed to execute api: create, key: SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000, status: SAI_STATUS_NOT_SUPPORTED sonic ERR syncd#syncd: :- syncd_main: Runtime error: :- processEvent: failed to execute api: create, key: SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000, status: SAI_STATUS_NOT_SUPPORTED 13
  12. 14.

    SAI create switch API • スイッチASICの初期化を実行する。 • Broadcom ASIC用の実体はlibsai.so.1.0の中にある。 ◦

    libsai.so.1.0はlibsaibcm_3.5.2.3_amd64.deb の中にある。 ◦ debファイルはビルド時にインターネットより取得。 ▪ platform/broadcom/sai.mk の中に取得元URL情報。 • 調べてみると、SAIライブラリ内でsai.profileを参照している。 ◦ sai.profileはconfig.bcmファイルのパスが書かれたテキストファイル。 ◦ つまり、どうやらconfig.bcmなるファイルを読み込むらしい。 ◦ pkgファイルも初期化時に読み込んでいる模様。 14
  13. 15.

    config.bcm • Broadcom ASIC向けの設定ファイル。 ◦ 属性=値 の行が並ぶ。ただし何の設定かわからない項目も。 • Broadcom SDK(非公開)の初期化APIで参照される模様。

    • 搭載スイッチのハードウェアに依存する場合もあるらしい。 • OpenNSL(githubにてバイナリ公開のAPI)の設定ファイルはこれらしい。 15 core_clock_frequency=1525 dpp_clock_ratio=2:3 oversubscribe_mode=1 pbmp_xport_xe=0x4888888888888888c2222222222222222 parity_enable=0 mem_cache_enable=0 l2_mem_entries=32768 l3_mem_entries=16384 fpem_mem_entries=131072 (以下略)
  14. 16.

    AS7726-32X用config.bcm • sai.profileの中身 ◦ SAI_INIT_CONFIG_FILE=/etc/bcm/td3-as7726-32x100G.config.bcm • しかし実機で確認するとこのファイルは存在しない。 ◦ docker exec

    -it syncd ls /etc/bcm で確認 • 別のpathにtd3-as7726-32x100G.config.bcmが置かれていた。 ◦ syncd docker: /usr/share/sonic/hwsku/td3-as7726-32x100G.config.bcm • 手元でsai.profileを編集し、置かれているpathに変更 16
  15. 17.

    config.bcmへの追加設定の必要性 • 動作結果: 変わらず。ログも変わらず。 • DIAG内にあったconfig.bcmと比較すると、記述不足がある模様。 • PRのコメントにも記載があったので、追加してみる。 @@ -33,6

    +33,12 @@ bcm_tunnel_term_compatible_mode=1 phy_an_c73=1 +help_cli_enable=1 +ifp_inports_support_enable=1 +memlist_enable=1 +port_flex_enable=1 +reglist_enable=1 + dport_map_port_1=1 17
  16. 18.

    config_checker • ビルド時にconfig.bcmの内容をチェックする。 • ホワイトリスト形式で、リストに存在しない属性キーワードはエラー。 • 今回移植のために追加したキーワードは軒並みエラー。 • ホワイトリストは sonic-device-data/tests/permitted_list

    ◦ キーワードを並べるだけで、値のチェックはされない。 • 本来はBroadcomとネゴって追加してもらう必要がある模様。 • 勝手にキーワードを追加してビルドを通してみた。 18
  17. 19.

    config.bcm追記版SONiCを動かしてみる ログからエラーが消えた! sonic INFO syncd#supervisord: syncd #015 sonic INFO syncd#supervisord:

    syncd #011CMH: LOADED#015 sonic INFO syncd#supervisord: syncd #011Ver: 05.01.08#015 sonic INFO syncd#supervisord: syncd #011SDK Ver: 06.05.14#015 sonic INFO syncd#supervisord: syncd #015 sonic INFO syncd#supervisord: syncd #011CCH: LOADED#015 sonic INFO syncd#supervisord: syncd #011Ver: 05.01.08#015 sonic INFO syncd#supervisord: syncd #011SDK Ver: 06.05.14#015 sonic INFO syncd#supervisord: syncd #015 sonic INFO syncd#supervisord: syncd #011CEH: LOADED#015 sonic INFO syncd#supervisord: syncd #011Ver: 05.01.08#015 sonic INFO syncd#supervisord: syncd #011SDK Ver: 06.05.14#015 sonic INFO syncd#supervisord: syncd #015 sonic INFO syncd#supervisord: syncd rc: sonic INFO syncd#supervisord: syncd MMU initialized#015 sonic INFO syncd#supervisord: syncd *** unit 0: ports capable of limited speed range cut-thru#015 sonic INFO syncd#supervisord: syncd rc: Port modes initialized#015 sonic INFO syncd#supervisord: syncd Common SDK init completed#015#015 19
  18. 20.

    インタフェース情報参照の確認 • show interfaces statusを実行→インタフェースがついに見えた! admin@sonic-edgecore:~$ show interfaces status Interface

    Lanes Speed MTU Alias Vlan Oper Admin Type Asym PFC ----------- --------------- ------- ----- ------------- ------ ------ ------- --------------- ---------- Ethernet0 1,2,3,4 100G 9100 hundredGigE1 routed up up QSFP28 or later N/A Ethernet4 5,6,7,8 100G 9100 hundredGigE2 routed up up QSFP28 or later N/A Ethernet8 9,10,11,12 N/A 9100 hundredGigE3 routed down up N/A N/A Ethernet12 13,14,15,16 N/A 9100 hundredGigE4 routed down up N/A N/A Ethernet16 17,18,19,20 N/A 9100 hundredGigE5 routed down up N/A N/A Ethernet20 21,22,23,24 N/A 9100 hundredGigE6 routed down up N/A N/A Ethernet24 25,26,27,28 N/A 9100 hundredGigE7 routed down up N/A N/A Ethernet28 29,30,31,32 N/A 9100 hundredGigE8 routed down up N/A N/A Ethernet32 33,34,35,36 N/A 9100 hundredGigE9 routed down up N/A N/A Ethernet36 37,38,39,40 N/A 9100 hundredGigE10 routed down up N/A N/A Ethernet40 41,42,43,44 N/A 9100 hundredGigE11 routed down up N/A N/A Ethernet44 45,46,47,48 N/A 9100 hundredGigE12 routed down up N/A N/A Ethernet48 49,50,51,52 N/A 9100 hundredGigE13 routed down up N/A N/A Ethernet52 53,54,55,56 N/A 9100 hundredGigE14 routed down up N/A N/A 20
  19. 22.

    触ってみてわかるSONiC • 機種の指定はconfig_db.jsonの”DEVICE_METADATA”内にある。 ◦ 初期起動時にONIEなどから抽出され自動設定。実機と不一致の場合手で修正 ◦ Acctonの設定を丸ごとコピペした DELTAのスイッチはAcctonと思い込んでしまい動かない • 100Gは25Gx4なので、見えるポートはEthernet0,

    Ethernet4, Ethernet8, … ◦ 40Gは10Gx4なので以下同文 • FECは未指定時none ◦ 対向機器ではrs (reed-solomon)だったため、不一致で当初つながらず ◦ portconfigコマンドで設定できる • tcpdump -i Ethernet0などとするとBGPやLLDPのパケットが見える ◦ CPUで処理するパケットが見える。 ASIC内で処理が完結するパケットは見えない ◦ CoPP (Control Plane Policing)の設定で制御できる模様 ◦ pingが通せたのも実はこれ 22
  20. 23.

    一応動作はしたが、残課題あり • show loggingで観察しているといくつかエラーが記録されていた。 ◦ counter情報が取得できない旨のエラー ◦ snmp関連のエラー ◦ 温度情報が取得できないエラー

    • pingが通ったのでiperfで測ってみたら8Mbps(!)しか出なかった。 ◦ 相手があるテストなのでどこに遅い原因があるかは不明、要調査。 ▪ マネジメントポート同士で測ると 9Gbps出ていた。 ◦ roadmapにperformance improvementとあるが、関係するかもしれない。 23
  21. 24.

    移植作業まとめ • 本来必要だが本家で作業済みだった項目 ◦ device/[VENDOR]/[PLATFORM]を用意する ◦ platform/[ASIC]/sonic-platform-module- [VENDOR]/[SKU]を用意する • Broadcom

    Trident 3向けに作業した項目 ◦ config.bcmを用意し、記述を加える ◦ sai.profileのpathを変更する ◦ pkgファイルを入手し、docker-syncd-brcmから見えるよう / にsymlinkを置く 24
  22. 25.

    全体のサマリー • Trident 3搭載ホワイトボックススイッチにSONiCを移植 • 当該機種はPRによりdevice, platformのファイルが用意されていたのが幸い ◦ 正式対応の準備と思われる •

    pkgファイルの用意とその他の小変更で無事動作した • ただし正式対応でないことから課題も多く残っている • 移植の勘所はつかめた感触 25