SONiCの動いてるスイッチを単なるL2スイッチとして使う方法

# はじめに

一日目の記事がやたら重くて申し訳なかったので、軽めの記事を書いてみます。よろしくお願いします。

なお、本記事での実行例はSONiC-VS (仮想スイッチ) masterイメージで実行したものになります。

# SONiCは通常L3スイッチ(ルータ)として動作します

起動して、`show interface status` を表示させると下記のようになっていると思います。

```shell-session
admin@sonic:~$ show int st
  Interface            Lanes    Speed    MTU    FEC           Alias    Vlan    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  -----  --------------  ------  ------  -------  ------  ----------
  Ethernet0      25,26,27,28      40G   9100     rs    fortyGigE0/0  routed    down       up     N/A         N/A
  Ethernet4      29,30,31,32      40G   9100     rs    fortyGigE0/4  routed    down       up     N/A         N/A
  Ethernet8      33,34,35,36      40G   9100     rs    fortyGigE0/8  routed    down       up     N/A         N/A
 Ethernet12      37,38,39,40      40G   9100     rs   fortyGigE0/12  routed    down       up     N/A         N/A
 Ethernet16      45,46,47,48      40G   9100     rs   fortyGigE0/16  routed    down       up     N/A         N/A
```

`Vlan`のカラムが`routed`になっていますが、これはポートがL3ルーティングインタフェースだということを意味しています。

# L2スイッチとして動かす方法

## 方法1 ひとつひとつ丹念に処理する

インタフェースにIPアドレスを振っていなければ、下記のような方法でVLANに所属させることでL2ポートとして振る舞うよう挙動を変更できます。

1. VLANを作成する
1. L2ポートにしたいインタフェース名を作成したVLANのメンバーにする
   このとき`untagged`を指定しておく
1. インタフェースの数だけ繰り返し

シェルで書くとこんなふうです。

```shell-session
sudo config vlan add 1000
for e in $(show int st|awk "/Ethernet/{print $1}"); do sudo config vlan member add 1000 $e --untagged; done
```

実行後の`show interface status`の結果はこうなります。

```shell-session
admin@sonic:~$ show int st
  Interface            Lanes    Speed    MTU    FEC           Alias    Vlan    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  -----  --------------  ------  ------  -------  ------  ----------
  Ethernet0      25,26,27,28      40G   9100     rs    fortyGigE0/0   trunk    down       up     N/A         N/A
  Ethernet4      29,30,31,32      40G   9100     rs    fortyGigE0/4   trunk    down       up     N/A         N/A
  Ethernet8      33,34,35,36      40G   9100     rs    fortyGigE0/8   trunk    down       up     N/A         N/A
 Ethernet12      37,38,39,40      40G   9100     rs   fortyGigE0/12   trunk    down       up     N/A         N/A
 Ethernet16      45,46,47,48      40G   9100     rs   fortyGigE0/16   trunk    down       up     N/A         N/A
```

`Vlan`のカラムが`trunk`になっているのがわかると思います。

また、`shwo vlan brief`を実行するとVLANタグが付与されない設定になっていることも確認できます。

```shell-session
admin@sonic:~$ show vlan brief
+-----------+--------------+-------------+----------------+-------------+
|   VLAN ID | IP Address   | Ports       | Port Tagging   | Proxy ARP   |
+===========+==============+=============+================+=============+
|      1000 |              | Ethernet0   | untagged       | disabled    |
|           |              | Ethernet4   | untagged       |             |
|           |              | Ethernet8   | untagged       |             |
|           |              | Ethernet12  | untagged       |             |
|           |              | Ethernet16  | untagged       |             |
```

うまく動作していることが確認できたら、設定を保存しておきましょう。

```
sudo config save -y
```

## 方法2 L2 Switch mode

実は公式wikiに、設定手順がステップバイステップで解説されています。

https://github.com/sonic-net/SONiC/wiki/L2-Switch-mode

先ほど紹介した手順で考慮の足りなかったと思われる部分についても書かれています。
読めばいいと言えばいいのですが、(マルチASICのスイッチだったりdual ToRの場合を省いて)紹介します。

:::note info
本記事執筆時点の内容を紹介しますが、今後のアップデートで内容が変わることがありますので、正確な手順は公式wikiをご参照いただければと思います。
:::

### 1.マネジメントポートとホスト名を設定する

スイッチ実機でマネジメントポートに固定IPアドレスを用いる場合の例は下記。

```shell-session
cat <<EOF | sudo config reload /dev/stdin -y
{
    "MGMT_INTERFACE": {
        "eth0|10.3.147.46/23": {
            "gwaddr": "10.3.146.1"
        }
    },
    "DEVICE_METADATA": {
        "localhost": {
            "hostname": "sonic"
        }
    }
}
EOF
```

SONiC-VSの場合、マネジメントポートのIPアドレスをDHCPで取得するケースがあります。
その場合は下記。

```shell-session
cat <<EOF | sudo config reload /dev/stdin -y
{
    "DEVICE_METADATA": {
        "localhost": {
            "hostname": "sonic"
        }
    }
}
EOF
```

実際に打ち込んでみるとこうなります。

```shell-session
admin@sonic:~$ cat <<EOF|sudo config reload /dev/stdin -y
> {
>   "DEVICE_METADATA": {
>     "localhost": {
>       "hostname": "sonic"
>     }
>   }
> }
> EOF
Disabling container monitoring ...
Stopping SONiC target ...
Running command: /usr/local/bin/sonic-cfggen  -j /etc/sonic/init_cfg.json  -j /dev/stdin  --write-to-db
Running command: /usr/local/bin/db_migrator.py -o migrate
Running command: /usr/local/bin/sonic-cfggen -d -y /etc/sonic/sonic_version.yml -t /usr/share/sonic/templates/sonic-environment.j2,/etc/sonic/sonic-environment
Restarting SONiC target ...
Enabling container monitoring ...
Reloading Monit configuration ...
Reinitializing monit daemon
admin@sonic:~$ 
```

### 2.MACアドレスを設定に書き込む

```shell-session
sudo sonic-cfggen -H --write-to-db
```

### 3. L2 Switch modeの設定を見てみる(やらなくてもOK)

`-k`の後ろに書くのはSKUです。SONiC-VSであれば`Force10-S6000`がdefault skuになります。

```shell-session
sudo sonic-cfggen --preset l2 -p -H -k Force10-S6000
```
実行するとめっちゃたくさん表示されます。長いので頭の方だけ見せるとこんなふうです。

```shell-session
admin@sonic:~$ sudo sonic-cfggen --preset l2 -p -H -k Force10-S6000
{
    "DEVICE_METADATA": {
        "localhost": {
            "hwsku": "Force10-S6000",
            "platform": "x86_64-kvm_x86_64-r0",
            "mac": "52:54:00:12:01:00"
        }
    },
    "PORT": {
        "Ethernet0": {
```

### 4. 設定をCONFIG_DBに読み込ませる

`-k`の後ろに書くのはSKUです。SONiC-VSであれば`Force10-S6000`がdefault skuになります。

```shell-session
sudo sonic-cfggen --preset l2 -p -H -k Force10-S6000 | sudo config reload /dev/stdin -y
```

`SwSS container is not ready.`と言われることがあったら、指示通り`config`コマンドに`-f`を加えて実行しましょう。

```shell-session
sudo sonic-cfggen --preset l2 -p -H -k Force10-S6000 | sudo config reload /dev/stdin -f -y
```

### 5. QoS設定を読み込ませる

```shell-session
sudo config qos reload --no-dynamic-buffer
```

### 6. 設定を保存する

```shell-session
sudo config save -y
```

### 7. 新しい設定を読み込ませる

```shell-session
sudo config reload -y
```

### ポートスピードの設定 (必要に応じてやってください)

SONiC-VSではやらなくていいと思います。実機の場合は接続先に合わせて変更します。
`Ethernet0`のポート速度を10Gbpsに設定する例が下記です。

```
sudo config interface speed Ethernet0 10000
```

`show interface status`で設定変更内容を確認できます。

# おわりに

公式wikiの手順が丁寧なので長くなってしまいました。

せっかくSONiCを使ってるのに単なるL2スイッチとして使うことはないんじゃ? と思われるかわかりませんが、そうせざるを得ない場合がありましたらご活用ください。