Slide 1

Slide 1 text

SONiCを 移植してみよう June 28, 2019 Masaru OKI @masaru0714

Slide 2

Slide 2 text

モチベーション ● SONiCを使いたいが未実装の機能や、対応していないスイッチがある。 ○ SONiC本家に公式対応があれば、当然そちらを使う。 ○ SONiC本家の開発ロードマップ があるが、実作業は遅れがち。 ○ 独自移植や独自機能拡張に取り組むケース ■ 本家の対応が望めない場合 ■ スケジュールの関係 ■ コストとの兼ね合い ○ 本家が公式対応したが、すでに独自実装を用意し検証済だった場合 ■ そのまま独自実装を使い続ける ■ 本家に切り替える。再検証が必要になる 2

Slide 3

Slide 3 text

今回のターゲット ● Accton (Edgecore) AS7726-32X ● Broadcom Trident 3 (BCM56870)搭載ホワイトボックススイッチ ○ 100GbE x 32ポート。 ● SONiCはまだ公式に対応していない ○ 「動かないんだけど」と Google Groupsに投稿したら 「edgecoreのサポートに問い合わせてくれ」と言われた ○ 問い合わせる前にどこまでできるか見極めようと思った ○ commit logなどを見ていると、バイナリ自体は Trident 3対応していそうな予感があった ○ 設定ファイルをいじくる程度で動くのでは ? 3

Slide 4

Slide 4 text

事前調査 ● 無変更のSONiCを入れられるか、入れるとどうなるかを確認。 ○ インストール: できる ○ ブート: できる ○ 動作: FANの回転数が制御できている。 PSUの状態取得ができる。それだけ。 ● パケット転送は動作しない。 ○ インタフェースが見えない。 (本来はEthernet0, Ethernet4, ...が見えるはず) ○ ログを読むと初期化でエラーが発生している。 ○ config_db.json が空だった→用意しても変化なし。 4

Slide 5

Slide 5 text

移植の前準備 ● ビルド環境としてDockerが必要。 ○ 公式サイトの手順に従い、Docker CEをインストールしておく。 ■ Ubuntuでapt-getを使うと古いバージョンをつかまされ、うまく動かない …… ○ ビルドに使うアカウントを docker groupに所属させておく。 5

Slide 6

Slide 6 text

ソースコードの取得とビルド ● 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

Slide 7

Slide 7 text

移植で必要になるディレクトリとファイル ● 下記は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

Slide 8

Slide 8 text

ログ調査 ● なにかを読み込もうとして失敗している。動かない原因はこれ? 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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

新しい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

Slide 13

Slide 13 text

ログ調査再び ● 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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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 (以下略)

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

config_checker ● ビルド時にconfig.bcmの内容をチェックする。 ● ホワイトリスト形式で、リストに存在しない属性キーワードはエラー。 ● 今回移植のために追加したキーワードは軒並みエラー。 ● ホワイトリストは sonic-device-data/tests/permitted_list ○ キーワードを並べるだけで、値のチェックはされない。 ● 本来はBroadcomとネゴって追加してもらう必要がある模様。 ● 勝手にキーワードを追加してビルドを通してみた。 18

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

インタフェース情報参照の確認 ● 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

Slide 21

Slide 21 text

パケット送受信の確認 ● Ethernet0にIPアドレスを付与、つないだ相手側にもIPアドレスを付与。 ● pingすると無事応答があった。 ● フローとしてはEthernet0(tap)でパケットを受けてASIC経由で送信。 ping Ethernet0 SAI hostif SAI send Trident 3 QSFP28 Linux kernel s101-001-0 SAI hostif? SAI trap? Trident 3 QSFP28 AS7726-32X (勝手改造SONiC) S5232F-ON (OS10EE) 21

Slide 22

Slide 22 text

触ってみてわかる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

Slide 23

Slide 23 text

一応動作はしたが、残課題あり ● show loggingで観察しているといくつかエラーが記録されていた。 ○ counter情報が取得できない旨のエラー ○ snmp関連のエラー ○ 温度情報が取得できないエラー ● pingが通ったのでiperfで測ってみたら8Mbps(!)しか出なかった。 ○ 相手があるテストなのでどこに遅い原因があるかは不明、要調査。 ■ マネジメントポート同士で測ると 9Gbps出ていた。 ○ roadmapにperformance improvementとあるが、関係するかもしれない。 23

Slide 24

Slide 24 text

移植作業まとめ ● 本来必要だが本家で作業済みだった項目 ○ device/[VENDOR]/[PLATFORM]を用意する ○ platform/[ASIC]/sonic-platform-module- [VENDOR]/[SKU]を用意する ● Broadcom Trident 3向けに作業した項目 ○ config.bcmを用意し、記述を加える ○ sai.profileのpathを変更する ○ pkgファイルを入手し、docker-syncd-brcmから見えるよう / にsymlinkを置く 24

Slide 25

Slide 25 text

全体のサマリー ● Trident 3搭載ホワイトボックススイッチにSONiCを移植 ● 当該機種はPRによりdevice, platformのファイルが用意されていたのが幸い ○ 正式対応の準備と思われる ● pkgファイルの用意とその他の小変更で無事動作した ● ただし正式対応でないことから課題も多く残っている ● 移植の勘所はつかめた感触 25