SONiCをはじめてみよう

 SONiCをはじめてみよう

ホワイトボックススイッチ実機及びPCの仮想マシン上にSONiCをインストールし動作させるまでを、順を追って説明します。

Fab252f33476e4b269b402cbcb6d4db2?s=128

Masaru OKI

June 28, 2019
Tweet

Transcript

  1. SONiCをはじめてみよう June 28, 2019 Masaru OKI @masaru0714

  2. 用意するもの • ターゲットマシン ◦ ホワイトボックススイッチ 1台 ◦ あるいは、仮想マシンが動かせる Linuxマシン1台 •

    インストールするのに必要な機材 ◦ インターネット回線(イメージ取得に使う) ◦ LANが使えるLinuxマシン、あるいはUSBメモリと読み書きできる PC ◦ コンソールケーブル (とUSBシリアル変換) 2
  3. インストール・実機編 3

  4. インストールイメージの入手 • https://github.com/Azure/SONiC/wiki/Supported-Devices-and-Platforms • 上記の表から “SONIC Image” のところにあるバイナリをダウンロード。 ◦ sonic-xxxxxx.bin

    (xxxxxx=broadcom, barefoot, mellanox, …) ◦ Broadcom用のは500MBくらい • お手持ちのスイッチが表にない場合 ◦ 搭載スイッチASICに対応するバイナリを試すと動くかもしれない • 表にあるのに404だったりする場合は ◦ 開発中の最新バイナリのためビルドに失敗していることがある。時間をおいて再チェック ◦ Out of dateでCIの定期ビルド対象となっていないことがある。 (e.g. Cavium, P4) 4
  5. ホワイトボックススイッチの電源投入 • あらかじめシリアルコンソールケーブルを接続しておく。 ◦ 通信設定は 115200bps, 8bit, parity none •

    LANもつないでおく。 • 電源投入するとメモリチェックなどの後、GRUB Menuが表示される。 • タイムアウトで自動的にONIEが起動する。 5
  6. (仮)IPアドレス割り当て • ONIEはLinuxベースのインストーラ。 • 起動するとマネジメントポートでDHCP clientが動く。 • アドレスをもらえた場合 ◦ 完了

    • もらえなかった場合 ◦ 接続しているLANにDHCP serverがいない場合、タイムアウトする。 ◦ とくにログインは必要なく、 Enterでシェルプロンプトが出るのでコマンド入力。 ◦ マネジメントポートはたいてい eth0 ◦ ip address add xxx.xxx.xxx.xxx/xx dev eth0 6
  7. インストール実行 • 手動インストール ◦ インストールイメージを配置したマシンで下記を実行。 ▪ python -m SimpleHTTPServer 8000

    ◦ ONIEが起動しているホワイトボックススイッチで下記を実行。 ▪ onie-nos-install http://配置したマシンのIP:8000/sonic-xxxxxx.bin ▪ xxxxxx = ASICベンダー名。broadcom, mellanoxなど ◦ 十数秒でインストールが完了し、自動リブートする。 ◦ リブートすると、デフォルトで起動するのは ONIEでなくSONiC。 ◦ インストール完了したら SimpleHTTPServerは止めておく。 • 自動インストール ◦ DHCPでリーチャビリティ確保と名前解決できる前提。 ◦ ONIEがトライしているURLでアクセスできる場所にイメージを置く。 ◦ インストール完了後、リブートして SONiCが起動する。 7
  8. インストール・仮想マシン編 8

  9. ファイルの入手 • sonic-vs.img ◦ https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-image/lastSucc essfulBuild/artifact/target/sonic-vs.img.gz ◦ gzip圧縮されているので、伸長しておく。 • sonic.xml

    ◦ https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-all/lastSuccessf ulBuild/artifact/platform/vs/sonic.xml ◦ ソースコードのplatform/vs/sonic.xmlをコピーしてもいい。 9
  10. sonic.xmlの編集 • sonic-vs.imgのパスが書かれているところを 実際に置かれているパスに合わせる。 <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <devices>

    <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='writeback'/> <source file=' /data/sonic/sonic-buildimage/target/sonic-vs.img'/> <target bus='virtio' dev='vda'/> </disk> <serial type='tcp'> <source host='127.0.0.1' mode='bind' service='7000'/> <target port='0'/> <protocol type='telnet'/> </serial> 10
  11. virshを用いて仮想マシンの作成(起動) • virsh create sonic.xml • 成功すると何もなかったかのようにプロンプトに戻ってくる。 • 裏でVMが起動している。 11

  12. ログイン 12

  13. コンソール接続 • 実機の場合、インストール時に引き続きシリアルコンソールで操作する。 • 仮想マシンの場合、telnet 127.0.0.1 7000 • マネジメントポートにIPアドレスを付与すれば外からsshでも接続できる。 13

  14. ログイン • アカウント名は admin 初期パスワード YourPaSsWoRd • ふつうにbashが動いているので、lsもpsもtopもできる。viも入っている。 Last login:

    Tue Jun 18 07:03:44 UTC 2019 on ttyS0 Linux sonic 4.9.0-8-2-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2015-12-19) x86_64 You are on ____ ___ _ _ _ ____ / ___| / _ \| \ | (_)/ ___| \___ \| | | | \| | | | ___) | |_| | |\ | | |___ |____/ \___/|_| \_|_|\____| -- Software for Open Networking in the Cloud -- Unauthorized access and/or use are prohibited. All access and/or use are subject to monitoring. Help: http://azure.github.io/SONiC/ admin@sonic:~$ 14
  15. CLI 15

  16. configコマンドとshowコマンド • bashからそのまま呼び出せるコマンドが用意されている。 • configは設定コマンドで、たいていの場合sudo付きで呼び出す。 • showは状態参照コマンド。 Usage: config [OPTIONS]

    COMMAND [ARGS]... SONiC command line - 'config' command Options: --help Show this message and exit. Commands: aaa AAA command line acl ACL-related configuration tasks bgp BGP-related configuration tasks ecn ECN-related configuration tasks interface Interface-related configuration tasks interface_naming_mode Modify interface naming mode for int load Import a previous saved config DB dump (以下略) Usage: show [OPTIONS] COMMAND [ARGS]... SONiC command line - 'show' command Options: -?, -h, --help Show this message and exit. Commands: aaa Show AAA configuration acl Show ACL related information arp Show IP ARP table bgp BGP information clock Show date and time ecn Show ECN configuration environment Show environmentals (voltages, fans, temps interfaces Show details of the network interfaces (以下略) 16
  17. show version • ログインできたら最初に実行したいコマンド。 $ show version SONiC Software Version:

    SONiC.accton-as7726-32x.0-0e038d69 Distribution: Debian 9.9 Kernel: 4.9.0-8-2-amd64 Build commit: 0e038d69 Build date: Wed May 29 11:59:42 UTC 2019 Built by: ****@******** Platform: x86_64-accton_as7726_32x-r0 HwSKU: Accton-AS7726-32X ASIC: broadcom Serial Number: ************** Uptime: 00:07:58 up 6:51, 1 user, load average: 0.12, 0.14, 0.10 Docker images: REPOSITORY TAG IMAGE ID SIZE docker-syncd-brcm accton-as7726-32x.0-0e038d69 a395bd9982bd 391MB docker-syncd-brcm latest a395bd9982bd 391MB docker-dhcp-relay accton-as7726-32x.0-0e038d69 28bcf20b789d 287MB (以下略) 17
  18. show interfaces status • インタフェースの状態表示。 • 動いていれば下記のように表示される。 ◦ 100G =

    25G x 4のため、Interfaceのsuffixは4ずつ増えている • SONiCでサポートされていないスイッチで実行すると、表示は空っぽ。 $ 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 (以下略) 18
  19. show logging • トラブルシュート最初の一歩。 • 見ての通りごく普通のsyslog。 19 Nov 5 17:56:28.114313

    sonic-edgecore INFO systemd[1]: Started switch state service. Nov 5 17:56:28.117757 sonic-edgecore INFO systemd[1]: Starting SNMP container... Nov 5 17:56:28.118876 sonic-edgecore INFO systemd[1]: Starting TEAMD container... Nov 5 17:56:28.119958 sonic-edgecore INFO systemd[1]: Starting Router advertiser container... Nov 5 17:56:28.126074 sonic-edgecore INFO systemd[1]: Starting BGP container... Nov 5 17:56:28.687299 sonic-edgecore INFO systemd[1]: Starting syncd service... Nov 5 17:56:28.693765 sonic-edgecore NOTICE root: Starting syncd service... Nov 5 17:56:28.698507 sonic-edgecore NOTICE root: Locking /tmp/swss-syncd-lock from syncd service Nov 5 17:56:28.703651 sonic-edgecore NOTICE root: Locked /tmp/swss-syncd-lock (10) from syncd service Nov 5 17:56:28.837214 sonic-edgecore INFO teamd.sh[15787]: Starting existing teamd container with HWSKU Accton-AS7726-32X Nov 5 17:56:28.845826 sonic-edgecore INFO snmp.sh[15785]: Starting existing snmp container with HWSKU Accton-AS7726-32X Nov 5 17:56:28.866916 sonic-edgecore INFO bgp.sh[15799]: Starting existing bgp container with HWSKU Accton-AS7726-32X Nov 5 17:56:28.871208 sonic-edgecore INFO radv.sh[15789]: Starting existing radv container with HWSKU Accton-AS7726-32X
  20. show runningconfiguration • 第3パラメータが必要。 • all ◦ 現在動作している設定を JSON形式で出力する。 •

    bgp ◦ コンテナ内に置かれている bgpd.confを出力する。 • interfaces ◦ マネジメントポート及びループバックの設定 (/etc/network/interfaces)を出力する。 • ntp ◦ /etc/ntp.confを出力する。 • snmp ◦ コンテナ内に置かれている snmpd.confを出力する。 20
  21. /etc/sonic/config_db.json • 設定がJSON形式で納められている。 ◦ https://github.com/Azure/SONiC/wiki/Configuration • SONiC起動時に読まれ、redis-serverのオンメモリDB(Config DB)に収まる。 { "BGP_NEIGHBOR":

    { "10.0.0.1": { "rrclient": "0", "name": "ARISTA01T2", "local_addr": "10.0.0.0", "nhopself": "0", "admin_status": "up", "holdtime": "180", "asn": "65200", "keepalive": "60" }, 21
  22. Config DBとconfig_db.json • DBはオンメモリ(Redis)。Schema定義はない。 • configコマンドは直接Config DBを変更するが、JSONは無変更。 • 各serviceはDBにsubscribeして、変更通知を受け動作に変更を反映させる。 JSON

    Config DB • 起動時 • config load • config reload JSON Config DB • config save 22
  23. マネジメントポートへのIPアドレス付与 • 固定IPアドレスの場合 ◦ 一時的にであれば、 ip(8)を使って設定してよい。 例 ip address add

    192.168.0.10/24 dev eth0 ◦ 恒久的設定はconfig_db.jsonに記述してconfig load_mgmt_config • DHCPの場合 ◦ /sbin/dhclientは用意されているが、今のバージョンは設定できない。 ▪ テンプレート interfaces.j2の記述がstatic固定のため。 "MGMT_INTERFACE": { "eth0|192.168.0.10/24": { "gwaddr": "192.168.0.1" } }, 23
  24. フロントパネルポートへのIPアドレス付与 • sudo config interface ip add <インタフェース名> <IPアドレス> ◦

    例 sudo config interface ip add Ethernet0 10.0.0.1/24 • config_db.jsonでは”INTERFACE”内に記述。 "INTERFACE": { "Ethernet0|10.0.0.1/24": {}, "Ethernet4|10.0.1.1/24": {}, 24
  25. Ethernet*はLinux上にも存在する • ipコマンドで確認できる。SONiCで付与したIPアドレスも見える。 • フロントパネルポートがそのまま見えているのではなくtapが生えている。 • BGP daemonはこのEthernet*を使い通信やFIB変更を実行する。 ◦ スイッチ上からpingすることもできる。これは

    CPUにパケットを送る機能によるもの。 ◦ CPUへのパケット転送許可の制御は Configで可能。COPPの項目を参照。 • ip link set down dev Ethernet0ではフロントパネルポートはdownしない。 ◦ show interfaces statusで確認するとoper upのまま。 ◦ Cumulus Linuxと違い、ipコマンドでのlink操作はできない。 25
  26. Power Off • SONiCでは、ストレージ(SSD)をrw mountしている • overlayfsを多用しているが、念のためshutdown処理した方がよさげ • shutdown -P

    nowでもpower offにならずリブートする ◦ PSUがいわゆるATX電源ではないため ◦ コンソールから操作し、 UEFIかGRUB Menuあたりで止めるのが確実 26
  27. ソフトウェア更新(実機) 27

  28. 更新手順 1. コンフィグをバックアップする 2. ストレージの見えるところにインストールイメージを置く 3. sudo sh ./sonic-xxxxxx.bin (xxxxxxはASICベンダーの名前)

    4. この時点では動作への影響なし 5. sudo shutdown -r now 6. リブートしたらコンソールからログインしてコンフィグを書き戻す 28
  29. 更新に関する注意 • コンフィグは初期状態に戻る。 ◦ 前述の通り、バックアップしておくこと • ssh host keyも再生成される。 ◦

    ssh-keygen -R <ホスト名 | IP>でエントリを消去しないと sshでログインできなくなる • 実質再インストール。 • ONIE Uninstallで消してインストールしなおすのが素直かもしれない。 29
  30. 始めることができた、その後は 30

  31. ようやくスタートライン • この先はなにをやるか次第 • なにができるか(できないか)ドキュメントを読み把握するのがおすすめ • リンク集 ◦ SONiC ▪

    official page https://azure.github.io/SONiC/ ▪ wiki https://github.com/Azure/SONiC/wiki ▪ Google groups https://groups.google.com/forum/#!forum/sonicproject ▪ issues https://github.com/Azure/sonic-buildimage/issues ▪ OCP subproject https://www.opencompute.org/wiki/Networking/SONiC ◦ OCP SAI ▪ OCP subproject https://www.opencompute.org/wiki/Networking/SAI ▪ github https://github.com/opencomputeproject/SAI 31