Open5

SONiCをいじる環境を自宅に構築したい

aip70paip70p

SONiCをおうちで触るときのメモ
体系だって記載するわけではなく、知った順に記載していく
どのように環境を用意すれば良いかもよくわからないので忘備録として

準備

SONiCを扱うためのディストリビューション(ubuntu 22.04 LTS)を用意する
https://cloud-images.ubuntu.com/releases/22.04/release/

wsl --import sonic-test C:\study\sonic\wsl C:\study\sonic\ubuntu-22.04-server-cloudimg-amd64-root.tar.xz

aip70paip70p

つまった所

事象

wsl --import sonic-test C:\study\sonic\wsl C:\study\sonic\ubuntu-20.04-server-cloudimg-amd64.img
でディストリビューションを追加しようとしていたが、「エラーを特定できません」とエラーになっていた。

解決策

使用するディストリビューションのファイルを変更した
wsl --import sonic-test C:\study\sonic\wsl C:\study\sonic\ubuntu-22.04-server-cloudimg-amd64-root.tar.xz

原因

原因は使用しているファイルが異なる

  • そもそも22.04をインストールしようとしていたのに20.04というバージョン
  • 拡張子がimgのものを使用していたこと

2つのファイルの違い

imgファイルはディスクイメージであり、パーティションやブートローダーを含む
tar.xzファイルはアーカイブであり、ルートのファイルシステムのみ

カーネルとファイルシステムの分離について

WSL2環境ではカーネルとルートファイルシステム(ディストリビューションの部分)が分離されている。WSL2用に提供されている規定のLinuxカーネルを使用しており、ユーザはルートファイルシステムを提供するのみで良い
したがって、WSL環境ではルートファイルシステムのみが含まれている.tar.xz等のアーカイブ形式のファイルをwsl --importコマンドでインポートする。

aip70paip70p

手軽にSONiCを触るための方法

SONiCのコンテナがあるらしいからとりあえずコンテナ立ち上げてみようくらいの気持ちでいたが、どうやら大きく2通りあるよう

  • コンテナでSONiC環境を用意
  • GNS3で仮想NWを構築し、その中でSONiCを触る
    GNS3(Graphical Network Simulator 3)はGUIでネットワークをシミュレートできるソフトウェア、Ciscoのパケトレの高度版みたいなもの?

なので、まずはコンテナでSONiCを2つ用意してコンテナ間で通信できる所まで確認し、スパインリーフの構成でEVPN/VXLANの動作確認についてはGNS3を使用してみようと思う

SONiCの物理環境と仮想環境の違い

SAI(Switch Abstration Interface)と呼ばれる、各メーカーのASICに対応するための抽象化レイヤーが存在する
このSAI配下にデバイスドライバが存在するが仮想SONiCでは存在しないため、デバイスに強く依存する機能の動作確認は不可能

aip70paip70p

WSL2使用時のお作法

PID1問題

Linuxではsystemd(/sbin/init)というプロセスがPID1として動作する事で、ゾンビプロセスの防止やプロセスのライフサイクル管理を行う仕組みとなっている

PID1は重要な事から特別な扱いがされているため、プロセス自身がシグナルに対してハンドリング(シグナルに対する行動で、無視・任意の処理・そのまま終了等がある)を行っていなければ、無視されてしまう

コンテナやWSLではsystemd以外のプロセスがPID1として動作する事があるため、SIGTERMコマンドが無視(ハンドリングがされていない)されてしまう

WSL2の動作

WSL2では初期だとsystemdが無効で、microsoftが設計したinitプロセスが動作する

解決策

systemdを有効にし、PID1でsystemdを動作させる

  1. /etc/wsl.confに以下を追加
[boot]
systemd=true
  1. WSLの再起動
wsl --shutdown
wsl
aip70paip70p

SONiCのコンテナを触ってみる

使用するイメージはこちら
公式ではイメージの提供はされていない?みたい
https://hub.docker.com/r/gosonic/sonic

上記は良くわからなかったのでやめ

公式からsonic-vs版をビルドする事にした

ハードウェア要件は以下
・ビルド速度を上げるための複数のコア
・十分な RAM (8 GiB 未満では問題が発生する可能性があります)
・300Gの空きディスク容量
・KVM 仮想化のサポート。

下2つが不安ではあるが、とりあえず試してみる

SONiC-VCのビルド

下記の説明の通りに進める
https://github.com/sonic-net/sonic-buildimage

準備

pipとj2cliの用意
sudo apt install -y python3-pip
pip3 install --user j2cli

dockerグループにユーザを追加
sudo gpasswd -a root docker

ブランチを切る
git checkout -b 20241122/sonic-vc/build

buildする

make init
Add your user account to docker group and use your user account to make. root or sudo are not supported

上記エラーとなったので、別のユーザを作成しdockerグループへ追加してみる
ユーザを作成しdockerグループへ追加

sudo useradd -m sonic-user
sudo gpasswd -a sonic-user docker

確認

groups sonic-user
sonic-user : sonic-user docker

ログイン
su - sonic-user

rootユーザでcloneしてしまって色々面倒なので新しいユーザで準備からやり直す