SONiCのイメージをビルドしてGNS3で使ってみた

この記事は、[MicroAd Advent Calender 2023](https://qiita.com/advent-calendar/2023/microad)の22日目の記事です。

## はじめに
相変わらず年末の雰囲気にソワソワと落ち着かず、
今年も「もう年末かー」と、
毎年同じコメントしている自分の成長の無さに愕然としています。

さて、みなさんは良いクリスマス・年末年始を迎えられそうですか？

今回は、[SONiC](https://github.com/sonic-net/)のイメージをビルドして、触ってみたよ。という話です。

## 環境準備
SONiCの[公式wiki](https://github.com/sonic-net/sonic-buildimage/blob/master/README.md)に詳しくは書いてあるので省略します。
注意点は、公式Wikiにも書いてあるとおり

* CPUがマルチコアであること
* メモリが8GB以上あること。
* HDDは300GB以上の空きがあること
* KVM仮想化がサポートされていること

です。
推奨されるビルド環境のOSは、Ubuntu 20.04です。
特にハードウェアの要件さえクリアしていれば、手順的なハマりポイントはなかったと思います。

注意としては、ビルド時にインターネットにアクセスできる必要があることぐらいです。

## 早速ビルド
環境が準備できたところで、Githubからクローンしてビルドしていきたいと思います。

まずは、すべてのサブモジュールを含むかたちでクローンします。
```shell
$ git clone --recurse-submodules https://github.com/sonic-net/sonic-buildimage.git
```

クローンが完了したら、カーネルモジュールのロードを行います。
```shell
$ sudo modprobe overlay
```
次に、ディレクトリを移動して、ビルドするイメージのブランチをチェックアウトします。
今回は、202305のブランチのイメージを作ります。
```
$ cd sonic-buildimage
$ git checkout 202305
```

make initを実行します。
```
$ make init
```
ここまで完了したら、
ASICを選択してmake configureを実行します。
今回は、GNS3上で動くイメージを作りたいので、VSを選択します。
```
$ make configure PLATFORM=vs
```
私が使った環境では、初回のconfigureにかかった時間は、約35分でした。

configureがエラーなく完了したら、いよいよイメージをビルドします。
```
$ make SONIC_BUILD_JOBS=4 target/sonic-vc.img.gz
```

SONIC_BUILD_JOBSを４に設定しているのは、Wikiに記載してある通りに実行しているためです。
まずは、Wikiの通りに実行してみよう。という心がけです。

ドキドキしながら、イメージ作られるのを待ってましたが、時間がかかるのは目に見えていたので
しばらく放置しておくことに。

完了までに約5時間くらいかかりました。

## GNS3 Appliance Fileの作成

ビルドしたイメージをGNS3でインポートするために、GNS3 Appliance File (.gns3a)を作成します。
以下のパスにスクリプトが準備されているので、それを使って作成します。

```
platform/vs/sonic-gns3a.sh
```

以下のようにして使用します。
ビルドされたイメージは、gzipされているので解凍します。
```
$ gzip -d ./target/sonic-vs.img
$ ./platform/vs/sonic-gns3a.sh -r 1.2 -b ./target/sonic-vs.img
```

実行するとカレントディレクトリに、SONiC-1.2.gns3aというファイルができます。
これを使って、GNS3にビルドしたイメージをインポートします。

今回はGNS3の使い方は省略します:bow_tone1:

## GNS3で起動してみる

インポートが完了したら、早速起動してみます。
まずは、単体で起動です。

![sonic-vc-gns3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20794/f0991e4e-9c7a-861f-67a9-0787749a4602.png)


```shell
Debian GNU/Linux 11 sonic ttyS0

sonic login: admin
Password: 
Linux sonic 5.10.0-23-2-amd64 #1 SMP Debian 5.10.179-3 (2023-07-27) 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:    https://sonic-net.github.io/SONiC/

admin@sonic:~$ 
```

起動してログインプロンプトが表示されたら、
デフォルトユーザは、admin、パスワードはYourPaSsWoRdでログインしてみます。

ログインできました。
とりあえず、インタフェースが確認できるかコマンドを実行してみます。

```
admin@sonic:~$ show interfaces status                                                                                                                
/usr/local/lib/python3.9/dist-packages/sonic_platform_base/sonic_xcvr/fields/xcvr_field.py:118: SyntaxWarning: assertion is always true, perhaps remo
ve parentheses?                                                                                                                                      
  assert (bitpos >= 0 and (bitpos+self.size-1 < 8), "bitpos must be within one byte")                                                                
  Interface            Lanes    Speed    MTU    FEC           Alias    Vlan    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  -----  --------------  ------  ------  -------  ------  ----------
  Ethernet0      25,26,27,28      40G   9100    N/A    fortyGigE0/0  routed    down       up     N/A         N/A
  Ethernet4      29,30,31,32      40G   9100    N/A    fortyGigE0/4  routed    down       up     N/A         N/A
  Ethernet8      33,34,35,36      40G   9100    N/A    fortyGigE0/8  routed    down       up     N/A         N/A
 Ethernet12      37,38,39,40      40G   9100    N/A   fortyGigE0/12  routed    down       up     N/A         N/A
 Ethernet16      45,46,47,48      40G   9100    N/A   fortyGigE0/16  routed    down       up     N/A         N/A
〜〜以下省略
```
SyntaxWarningが出てますが、とりあえずインタフェースの状態は見えたっぽいです。

あとは、このイメージを使ってネットワークを作ってみるという感じになりますが、
おっと時間が来てしまったようです。

続きは、またの機会に。

Happy holidays!