Slide 1

Slide 1 text

SONiC動作の仕組み June 28, 2019 Masaru OKI @masaru0714

Slide 2

Slide 2 text

SONiCの起動シーケンス 1. Linux kernel起動 2. rcスクリプト起動 3. systemdにより各サービス起動 ○ bgp.service ○ database.service ○ lldp.service ○ swss.service ○ syncd.service ○ など 4. 各サービスの起動スクリプトで dockerコンテナが起動

Slide 3

Slide 3 text

サービスの起動(database) 1. database.service ○ ExecStartPre=/usr/bin/database.sh start 2. database.sh ○ SKUをチェックし既存 docker imageと不一致の場合イメージを再作成 ○ docker start database ○ docker imageはdocker-database:latest 3. database docker (docker-database) ○ supervisordが走る ○ command=により/usr/bin/redis-server /etc/redis/redis.confが実行される 4. database.sh(docker startのあと) ○ sonic-cfggen -j /etc/sonic/config_db.json --write-to-db でJSONからDBに変換 3

Slide 4

Slide 4 text

サービスの起動(bgp) 1. bgp.service ○ ExecStartPre=/usr/bin/bgp.sh start 2. bgp.sh ○ SKUをチェックし既存 docker imageと不一致の場合イメージを再作成 ○ docker start bgp ○ docker imageはdocker-fpm-frr:latestを使う 3. bgp docker (docker-fpm-frr) ○ supervisordが走る ○ command=/usr/bin/start.sh 4. start.sh ○ テンプレートとConfigからbgpd.conf, zebra.conf, vtysh.confを生成 ○ supervisorctl startを用いてrsyslogd, bgpcfgd, zebra, staticd, bgpd, fpmsyncdを起動

Slide 5

Slide 5 text

サービスの起動(ntp) 1. ntp-config.service ○ ExecStartPre=/usr/bin/ntp-config.sh start 2. ntp-config.sh ○ sonic-cfggen -d -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf Jinja2テンプレート ntp.conf.j2をSONiCコンフィグの内容で置換する。 3. systemctl restart ntpによりntpdが新しい設定で再起動。 {% for ntp_server in NTP_SERVER %} server {{ ntp_server }} iburst {% endfor %} interface ignore wildcard {% if MGMT_INTERFACE %} {% for (mgmt_intf, mgmt_prefix) in MGMT_INTERFACE %} interface listen {{ mgmt_prefix | ip }} {% endfor %} {% else %} interface listen eth0 {% endif %} interface listen 127.0.0.1 5

Slide 6

Slide 6 text

SONiCとdocker ● SONiCは、主要な機能をdockerコンテナ内で動かしている。 ● show servicesコマンドで確認できる、動いているコンテナ ○ syncd docker ○ dhcp_relay docker ○ radv docker ○ telemetry docker ○ snmp docker ○ teamd docker ○ swss docker ○ lldp docker ○ bgp docker ○ pmon docker ○ database docker 6

Slide 7

Slide 7 text

SONiC内部の各コンポーネントの関係 CONFIG_DB APPL_DB ASIC_DB orchagent syncd saiserver intfsyncd neighsyncd fpmsyncd lldp_syncd portsyncd teamsyncd arp_update ntp-config.sh rsyslog-config.sh switch ASIC netlink STATE_DB portmgrd intfmgrd vlanmgrd netdev intfs config_db.json ntpd.conf rsyslogd.conf bgpd bgpcfgd ntpd rsyslogd config command show command sonic-cfggen config save config load hostcfgd /etc/pam.d/comm on-auth-sonic tacplus_nss.conf nsswitch.conf COUNTER_DB warmstart vtysh snmp i.e. ip(8) shadow SAI thrift RPC SAI API call

Slide 8

Slide 8 text

主な機能における関係図 syncd docker (syncd) Switch ASIC database docker (redis server) swss docker (orchagent他) bgp docker (FRR bgpd) rtnetlink socket redis socket redis socket Control via SAI (C API) Ethernet* (tap) SAI hostif socket for BGP protocol Linux kernel rtnetlink socket CLI (config) 8 asic db config db app db

Slide 9

Slide 9 text

CLIでIPアドレスを設定する 1. sudo config interface ip add … 2. (config db) 3. orchagent 4. (asic db) 5. syncd 6. Switch ASIC syncd docker (syncd) Switch ASIC database docker (redis server) swss docker (orchagent他) bgp docker (FRR bgpd) rtnetlink socket redis socket redis socket Control via SAI (C API) Ethernet* (tap) SAI hostif socket for BGP protocol Linux kernel rtnetlink socket CLI (config) 9 asic db config db app db 1 2 3 4 5 6

Slide 10

Slide 10 text

BGPのプロトコルパケットの送受信 1. bgpd 2. (Ethernet*) 3. syncd (SAI hostif) 4. Switch ASIC 送信の場合。受信は逆順。 syncd docker (syncd) Switch ASIC database docker (redis server) swss docker (orchagent他) bgp docker (FRR bgpd) rtnetlink socket redis socket redis socket Control via SAI (C API) Ethernet* (tap) SAI hostif socket for BGP protocol Linux kernel rtnetlink socket CLI (config) 10 asic db config db app db 3 4 2 1

Slide 11

Slide 11 text

BGPによるルーティング情報変更 1. bgpd 2. rtnetlink 3. fpmsyncd 4. (app db) 5. orchagent 6. (asic db) 7. syncd 8. Switch ASIC syncd docker (syncd) Switch ASIC database docker (redis server) swss docker (orchagent他) bgp docker (FRR bgpd) rtnetlink socket redis socket redis socket Control via SAI (C API) Ethernet* (tap) SAI hostif socket for BGP protocol Linux kernel rtnetlink socket CLI (config) 11 asic db config db app db 4 3 6 7 8 1 2 5

Slide 12

Slide 12 text

SFP, PSU, FAN制御 ● カーネルモジュールが用意され、いずれも I2Cで制御する。 ● FAN ○ xxxxxxxxx_monitor_fan.py (xxxxxxxxxはSKU名) ○ 常に動いていて、とくにやれることはない ● PSU ○ xxxxxxxxx_monitor_psu.py (xxxxxxxxxはSKU名) ○ /usr/bin/psud ○ show platform psustatusで状態参照できる ● SFP ○ eeprom.py, sfputil.pyがportconfigコマンドやshowコマンドから呼ばれる ○ show interfaces transceiver presenceなどで状態参照できる ○ portconfigコマンドで速度や FEC設定を変更できる

Slide 13

Slide 13 text

まとめ ● SONiCは主な機能をdockerコンテナで提供している ● daemonの設定はJinja2テンプレートからconfファイルを生成している ● Config DBに書き、ASIC DBに変換し、syncdによってスイッチASICに設定を反映させる ● Routing protocolやFDBについてはLinux kernelの機能を利用している ● ハードウェア制御はPythonスクリプトを使いI2Cを介して実行