SONiC VS 仮想スイッチを使ってみよう [Community/Edgecore]

# はじめに
「[SONiC VS 仮想スイッチを使ってみよう](https://qiita.com/cyo-chang/items/f007fa93fcff0b2897aa)」という記事に、Broadcom SONiC の VS の導入方法を紹介しました。

いろんな SONiC がありますが、以下のように分類できると考えられます。
|SONiC name |type  |license|note|VS download link
|---|---|---|---|---|
|Community SONiC  |OSS  |-|-|https://sonic.software/
|Broadcom SONiC  |Enterprise SONiC Distribution |必須|-|https://github.com/Broadcom/sonic-VirtualSwitch/releases/tag/3.1.2
|Edgecore SONiC  |Enterprise SONiC Distribution  |-|To download the SONiC image, sign up for an account on the Edgecore support portal|要相談<br>- 代理店経由<br>- Edgecore経由
|Dell SONiC  |Enterprise SONiC Distribution  |必須  |re-branded from Broadcom SONiC|?
|Nvidia SONiC  |proprietary |必須|only compatible with Nvidia HW|?|
|Microsoft, <br>Alibaba SONiC ... |proprietary  |N/A|only deployed in their own Datacenter, no plans to sell SONiC to customers|N/A


日本では、すでに Edgecore SONiC VS 環境で ZTP などの機能を検証したりする事例もありました。(参考： [SONiC ZTPでデータセンターネットワークを作った話](https://www.janog.gr.jp/meeting/janog52/sonicztp/) )

しかしながら、Edgecore SONiCの正式リリース版はまだなく、Edgecore SONiCの VS 環境を活用したい場合は、Edgecoreの代理店にご連絡いただくことで入手可能です。

さて、Edgecore SONiC と Community SONiC の Virtual Switch を試してみましょう。

# 今回の目標
- GNS3 に EC SONiC VS をインポート
- GNS3 に Community SONiC VS をインポート
- Version 確認
- EC/Brcm/Community の を相互接続し、ping 疎通を検証

# Community SONiC VS と EC SONiC VS をインポート
Community と EC について、両方とも以下の手順でインポートできます。
1. イメージファイルを事前に入手・ダウンロード
    - Target
        - Community 202311 
        - EC SONiC 202111.3
1. GNS3 → Edit → Preference → QEMU → Qemu VMs → new
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/51cef3a4-d29b-b180-dbcc-0ef1e3c5ab59.png)

1. イメージを指定し、推奨の RAM サイズは、**4096M** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/82c5cbc2-c92c-d22e-ea62-dfabd698ebb7.png)
1. templates の導入完了を確認 
![OSS-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/dc708c79-0977-e75d-4332-2e043886211e.png)
1. 推奨として、vCPU を 2 する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/6a340b22-59c9-9f2b-6198-a3ccc0e753b0.png)
1. Community とEC 両方とも、`1 * mgmt_port` + `32 * 100G/40G port` の仮想スイッチのため、`adapters` を *33* に設定しておく。また、一個目のポートは mgmt port なので、`first port name` を eth0 に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/09ab3b75-e81d-81dc-f88f-f87ff394bfa8.png)


7. 以上の手順でimport 完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/29a7208c-53b5-7559-bcb4-9b4b432c360e.png)

ただし、GNS3 との interface 名称不一致の現象がありますが、<strong>実は対策があります<strong>

template -> configuration -> configure customer adapters に SONiC の naming に合わせて修正すれば、名称不一致の現象を解消できます。一個ずつ入力して面倒ですが、一度設定すれば、作図する際に間違って違うポートに接続するのを避けますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/7f886c0a-fcee-7d30-2c4d-498b59ad183a.png)

GNS3 とのnaming 問題を解消し、完璧です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/0f8e30da-c6a1-2e0b-3550-cceb59132ffd.png)

# Version 確認
`show version` コマンドを叩いてみると、以下の情報を確認できましたね。(立ち上がった docker のバージョンは省略します。)
|Vendor| SONiC Version                   | Platform                | Distribution | Kernel          | Build Commit | Build Date               |
|--|--------------------------------|-------------------------|--------------|-----------------|--------------|--------------------------|
|Broadcom| SONiC-OS-3.1.2-Enterprise_Base | x86_64-kvm_x86_64-r0    | Debian 9.13  | 4.9.0-11-2-amd64 | 1759d99d0   | Thu Jul  8 18:48:40 UTC 2021 |
|Edgecore| SONiC.Edgecore-SONiC_20221124_131355_ec202111_vs_48 | x86_64-kvm_x86_64-r0    | Debian 11.5 | 5.10.0-8-2-amd64 | ca3fda267   | Thu Nov 24 09:27:45 UTC 2022 |
|Community| SONiC.202311.525638-e0f87535b   | x86_64-kvm_x86_64-r0    | Debian 11.9 | 5.10.0-23-2-amd64 | e0f87535b   | Thu Apr 18 11:44:09 UTC 2024 |

それぞれのビルド情報が見られて、面白いですね。

# EC/Brcm/Community SONiCを相互接続しよう！

:::note warn
Community SONiC VSの場合、以下の testbed 環境に合わせる BGP の config はそのままに残っています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/e833b638-ef90-65c5-5e25-878ea687f333.png)
本記事は、以下の手順で、初期のコンフィグを削除します。
```
admin@sonic:~$ sudo jq 'del(.DEVICE_METADATA.localhost.bgp_asn ,.BGP_NEIGHBOR, .INTERFACE, .LOOPBACK_INTERFACE)' \
                        /etc/sonic/config_db.json > \
                        /tmp/temp_config_db.json && \
                        sudo mv /tmp/temp_config_db.json \
                        /etc/sonic/config_db.json
admin@sonic:~$ sudo config reload -y

```

:::

### Topology 
以下のようにトポロジーを作図します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/efc481a8-90f1-b05e-a900-0b00961f7d79.png)

`sudo config interface startup ${interface_name}` で link up させて、接続中のポートは up になっているか確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/1738a4de-6724-f6d6-bbe4-0a395dfb0542.png)

ping 疎通の環境は以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/b2142ed8-8784-78f1-d6fa-bb1d630fcc3e.png)

### Result
お互いに ping させて、`show arp` 確認してみると、お互いに arp 学習済で、成功しましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/03b5633b-7da5-687c-65f0-5b7d7485bcae.png)


# 最後に
この記事は、これまでに経験した GNS3 の罠にハマらないように考えてメモしました。SONiC VSの環境構築の記事はここまでとなります。

ネット上に、Community SONiCとEC SONiC の仮想スイッチの情報がまだ少なく、より多くの方にSONiC を体験してもらいたいですね。本記事が皆様の参考になれば幸いです。

次回は、どのようにVS 環境で ZTPによる自動デプロイ機能を紹介いたします。GNS3上で、DHCP/TFTP サーバの事前作業はやや面倒で、その情報も共有したいと思います。

# 参考
[Broadcom SONiC VS 仮想スイッチを使ってみよう](https://qiita.com/cyo-chang/items/f007fa93fcff0b2897aa)
[SONiC からみる MAC Table と Routing Table](https://qiita.com/cyo-chang/items/505685c96ab4ec520982)
[[Enterprise SONiC] FRRouting and config initialization](https://support.edge-core.com/hc/en-us/articles/900000514823--Enterprise-SONiC-FRRouting-and-config-initialization)
[SONiC Testbed Topology](https://github.com/sonic-net/sonic-mgmt/blob/master/docs/testbed/README.testbed.Overview.md#sonic-testbed-topology)
[Edgecore SONiC distributors](https://www.edge-core.com/where-to-buy/asia-distributors/)