1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SONiCを VirtualBox + Vagrant で動かす

Last updated at Posted at 2022-05-31

SONiCを試してみようとすると,KVM用のファイルしか無いようです.個人的にVirtualBox + Vagrantのほうが使いやすいので,VirtualBox + Vagrantで動かす方法をまとめてみたという話です.ただし,ネットワーク実験ができれば良いということを目的にしているので,それ以外の部分は,雑に設定していますがご了承下さい.

実行環境

OS: Windows 10
Virtualbox: 6.1.34
Vagrant: 2.2.19
SONiC: SONiC.master.102109-392899682

SONiCをVirtualBox + Vagrantで動くようにする

まず,SONiCをダウンロードして,VirtualBoxで動かせるようにします.そしてVirtualboxのVMからVagrant Boxを作成します.

SONiCのダウンロード

https://sonic.software/からsonic-vs.img.gzをダウンロードしてください.注意事項として,一番上のリンクが一番古いやつです.一番下が最新のものなので,注意してください.
(Branch 202012のファイルだと,bgpのサービスが起動後に落ちてしまいました;;)

imgファイルをdviファイルに変換

sonic-vs.img.gzファイルの解凍して,vdiファイルに変換します.変換にはqemu-img.exeを使用します.これは,QEMUをダウンロードする必要があります.

 "C:\Program Files\qemu\qemu-img.exe" convert -O vdi sonic-vs.img sonic-vs.vdi

imgファイルをdviファイルに変換する方法として,VBoxManageもありますが,私の環境だとうまくいきませんでした.

変換後VirtualBoxで新規のVMを立てて,仮想ハードディスクとして作成したdviファイルを指定します.

私の環境の設定例を以下に示します.
screenshot000194.JPG

VMを起動して,動くかを確かめます.ユーザ名はadminでパスワードはYourPaSsWoRdです.

起動後show versionでバージョン確認.

$ show version
SONiC Software Version: SONiC.master.102109-392899682
Distribution: Debian 11.3
Kernel: 5.10.0-12-2-amd64
Build commit: 392899682
Build date: Mon May 23 19:34:41 UTC 2022
Built by: AzDevOps@sonic-build-workers-001J3P

Platform: x86_64-kvm_x86_64-r0
HwSKU: Force10-S6000
ASIC: vs
ASIC Count: 1
Serial Number: N/A
Model Number: N/A
Hardware Revision: N/A
Uptime: 03:30:40 up 3 min,  1 user,  load average: 0.49, 0.75, 0.36
Date: Sun 29 May 2022 03:30:40

VirtualBox上のVMをVagrant Boxに変換

Vagrant Boxを作成する前にVirtaulBoxのGuestAdditionsをインストール.インストールするバージョンは,自分の環境にあったものに変えてください.

sudo apt update -y
sudo apt install -y build-essential dkms wget
wget http://download.virtualbox.org/virtualbox/6.1.34/VBoxGuestAdditions_6.1.34.iso
sudo mkdir /media/VBoxGuestAdditions
sudo mount -o loop,ro VBoxGuestAdditions_6.1.34.iso /media/VBoxGuestAdditions
sudo sh /media/VBoxGuestAdditions/VBoxLinuxAdditions.run
rm VBoxGuestAdditions_6.1.34.iso

GuestAddtionsをインストール後,VMを終了します.その後,Vagrant Boxを作成します.
作成するコマンド以下です.<VirtaulBoxName>は作ったVirtaulBoxのVMの名前です.

vagrant package --base "<VirtualBoxName>" --output sonic-vs.box
vagrant box add sonic-vs.box --name sonic-vs

Vagrant Boxが追加されたのかを確認します.

$ vagrant box list
CumulusCommunity/cumulus-vx (virtualbox, 5.1.0)
bento/ubuntu-18.04          (virtualbox, 202112.19.0)
bento/ubuntu-20.04          (virtualbox, 202112.19.0)
bento/ubuntu-20.10          (virtualbox, 202107.28.0)
bento/ubuntu-21.10          (virtualbox, 202112.19.0)
jpiel/ubuntu16.04-desktop   (virtualbox, 2019.05.01.0)
sonic-vs                    (virtualbox, 0)
ubuntu/jammy64              (virtualbox, 20220513.0.0)

ここでは,vagrantのユーザやSSHの設定は行いません.理由としては,しなくてもネットワークの実験はできるからです.vagrantのユーザなどの設定をするなら,古いですがVIRTUALBOX から VAGARNT の BOX 作成が参考になると思います.

動作確認

動作確認として,下のようなネットワークを構築します.
それぞれ図のようにAS番号を割り当て,eBGPでルートの交換を行います.BGPの設定はUnnumberedで行います.

test_topo.drawio.png

/etc/sonic/config_db.jsonの設定

SONiCのconfig_db.jsonの内容を書き換えていきます.具体的には,初期設定でBGPの設定などが書かれていますが,今回はvtyshで設定するので,BGPの設定などを削除します.

/etc/sonic/config_db.json
{
  "DEVICE_METADATA": {
      "localhost": {
          "hwsku": "Force10-S6000",
          "platform": "x86_64-kvm_x86_64-r0",
          "mac": "08:00:27:f6:18:74",
          "hostname": "sonic",
          "type": "LeafRouter"
      }
  },
  "PORT": {
      "Ethernet0": {
          "lanes": "25,26,27,28",
          "alias": "fortyGigE0/0",
          "index": "0",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet4": {
          "lanes": "29,30,31,32",
          "alias": "fortyGigE0/4",
          "index": "1",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet8": {
          "lanes": "33,34,35,36",
          "alias": "fortyGigE0/8",
          "index": "2",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet12": {
          "lanes": "37,38,39,40",
          "alias": "fortyGigE0/12",
          "index": "3",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet16": {
          "lanes": "45,46,47,48",
          "alias": "fortyGigE0/16",
          "index": "4",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet20": {
          "lanes": "41,42,43,44",
          "alias": "fortyGigE0/20",
          "index": "5",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet24": {
          "lanes": "1,2,3,4",
          "alias": "fortyGigE0/24",
          "index": "6",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet28": {
          "lanes": "5,6,7,8",
          "alias": "fortyGigE0/28",
          "index": "7",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet32": {
          "lanes": "13,14,15,16",
          "alias": "fortyGigE0/32",
          "index": "8",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet36": {
          "lanes": "9,10,11,12",
          "alias": "fortyGigE0/36",
          "index": "9",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet40": {
          "lanes": "17,18,19,20",
          "alias": "fortyGigE0/40",
          "index": "10",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet44": {
          "lanes": "21,22,23,24",
          "alias": "fortyGigE0/44",
          "index": "11",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet48": {
          "lanes": "53,54,55,56",
          "alias": "fortyGigE0/48",
          "index": "12",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet52": {
          "lanes": "49,50,51,52",
          "alias": "fortyGigE0/52",
          "index": "13",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet56": {
          "lanes": "57,58,59,60",
          "alias": "fortyGigE0/56",
          "index": "14",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet60": {
          "lanes": "61,62,63,64",
          "alias": "fortyGigE0/60",
          "index": "15",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet64": {
          "lanes": "69,70,71,72",
          "alias": "fortyGigE0/64",
          "index": "16",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet68": {
          "lanes": "65,66,67,68",
          "alias": "fortyGigE0/68",
          "index": "17",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet72": {
          "lanes": "73,74,75,76",
          "alias": "fortyGigE0/72",
          "index": "18",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet76": {
          "lanes": "77,78,79,80",
          "alias": "fortyGigE0/76",
          "index": "19",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet80": {
          "lanes": "109,110,111,112",
          "alias": "fortyGigE0/80",
          "index": "20",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet84": {
          "lanes": "105,106,107,108",
          "alias": "fortyGigE0/84",
          "index": "21",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet88": {
          "lanes": "113,114,115,116",
          "alias": "fortyGigE0/88",
          "index": "22",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet92": {
          "lanes": "117,118,119,120",
          "alias": "fortyGigE0/92",
          "index": "23",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet96": {
          "lanes": "125,126,127,128",
          "alias": "fortyGigE0/96",
          "index": "24",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet100": {
          "lanes": "121,122,123,124",
          "alias": "fortyGigE0/100",
          "index": "25",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet104": {
          "lanes": "81,82,83,84",
          "alias": "fortyGigE0/104",
          "index": "26",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet108": {
          "lanes": "85,86,87,88",
          "alias": "fortyGigE0/108",
          "index": "27",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet112": {
          "lanes": "93,94,95,96",
          "alias": "fortyGigE0/112",
          "index": "28",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet116": {
          "lanes": "89,90,91,92",
          "alias": "fortyGigE0/116",
          "index": "29",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet120": {
          "lanes": "101,102,103,104",
          "alias": "fortyGigE0/120",
          "index": "30",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet124": {
          "lanes": "97,98,99,100",
          "alias": "fortyGigE0/124",
          "index": "31",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      }
  },
  "FLEX_COUNTER_TABLE": {
      "ACL": {
          "FLEX_COUNTER_STATUS": "disable",
          "FLEX_COUNTER_DELAY_STATUS": "true",
          "POLL_INTERVAL": "10000"
      }
  },
  "LOOPBACK_INTERFACE": {
      "Loopback0|10.1.0.1/32": {}
  },
  "INTERFACE": {
    "Ethernet0": {},
    "Ethernet4": {},
    "Ethernet8": {},
    "Ethernet12": {},
    "Ethernet16": {},
    "Ethernet20": {},
    "Ethernet24": {},
    "Ethernet28": {},
    "Ethernet32": {},
    "Ethernet36": {},
    "Ethernet40": {},
    "Ethernet44": {},
    "Ethernet48": {},
    "Ethernet52": {},
    "Ethernet56": {},
    "Ethernet60": {},
    "Ethernet64": {},
    "Ethernet68": {},
    "Ethernet72": {},
    "Ethernet76": {},
    "Ethernet80": {},
    "Ethernet84": {},
    "Ethernet88": {},
    "Ethernet92": {},
    "Ethernet96": {},
    "Ethernet100": {},
    "Ethernet104": {},
    "Ethernet108": {},
    "Ethernet112": {},
    "Ethernet116": {},
    "Ethernet120": {},
    "Ethernet124": {}
  }
}

ファイルを書き換えた後は,リロードします.

sudo config reload -y

vtyshの設定

Spine1の設定を以下に示します.基本的には,BGP Unnumberedの設定を行います.

enable
configure terminal
interface lo
  ip address 10.0.0.1/32
interface Ethernet0
  ip address 10.1.0.1/24
  ipv6 nd ra-interval 10
  no ipv6 nd suppress-ra
  no shut
interface Ethernet4
  ip address 10.2.0.1/24
  ipv6 nd ra-interval 10
  no ipv6 nd suppress-ra
  no shut
router bgp 65200
  bgp router-id 10.0.0.1
  no bgp ebgp-requires-policy
  bgp bestpath as-path multipath-relax
  neighbor FABRIC peer-group
  neighbor FABRIC remote-as external
  neighbor FABRIC capability extended-nexthop
  neighbor Ethernet0 interface peer-group FABRIC
  neighbor Ethernet4 interface peer-group FABRIC
  address-family ipv4 unicast
    network 10.0.0.1/32
  exit-address-family

Vagrantfile

VagrantBoxの設定では,sshの設定に注意してください.
sshは,ユーザとパスワードで行うようにします.また,共有フォルダはエラーをはくので,disabledにします.

switch.ssh.username = 'admin'
switch.ssh.password = 'YourPaSsWoRd'
switch.ssh.insert_key = false
switch.vm.synced_folder '.', '/vagrant', disabled: true

VagrantBoxの設定全文を以下に示します.長いです.
configのリロードの前後にサービスの起動待ちの待機時間を設定してます.長めに設定しているので,環境によっては短めに設定できると思います.

# enable gui
$gui = true

# ------------------------------------------------------------
# Description
# ------------------------------------------------------------
$description = <<"EOS"
# Cumulus and SONiC
## Cumulus
user: vagrant
password: vagrant
## SONiC
user: admin
password: YourPaSsWoRd
EOS

# ------------------------------------------------------------
# FRRouting Config
# ------------------------------------------------------------
$reset_sonic = <<-'SCRIPT'
sudo cat <<'EOF' | sudo tee /etc/sonic/config_db.json
{
  "DEVICE_METADATA": {
      "localhost": {
          "hwsku": "Force10-S6000",
          "platform": "x86_64-kvm_x86_64-r0",
          "mac": "08:00:27:f6:18:74",
          "hostname": "%{hostname}",
          "type": "LeafRouter"
      }
  },
  "PORT": {
      "Ethernet0": {
          "lanes": "25,26,27,28",
          "alias": "fortyGigE0/0",
          "index": "0",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet4": {
          "lanes": "29,30,31,32",
          "alias": "fortyGigE0/4",
          "index": "1",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet8": {
          "lanes": "33,34,35,36",
          "alias": "fortyGigE0/8",
          "index": "2",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet12": {
          "lanes": "37,38,39,40",
          "alias": "fortyGigE0/12",
          "index": "3",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet16": {
          "lanes": "45,46,47,48",
          "alias": "fortyGigE0/16",
          "index": "4",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet20": {
          "lanes": "41,42,43,44",
          "alias": "fortyGigE0/20",
          "index": "5",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet24": {
          "lanes": "1,2,3,4",
          "alias": "fortyGigE0/24",
          "index": "6",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet28": {
          "lanes": "5,6,7,8",
          "alias": "fortyGigE0/28",
          "index": "7",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet32": {
          "lanes": "13,14,15,16",
          "alias": "fortyGigE0/32",
          "index": "8",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet36": {
          "lanes": "9,10,11,12",
          "alias": "fortyGigE0/36",
          "index": "9",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet40": {
          "lanes": "17,18,19,20",
          "alias": "fortyGigE0/40",
          "index": "10",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet44": {
          "lanes": "21,22,23,24",
          "alias": "fortyGigE0/44",
          "index": "11",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet48": {
          "lanes": "53,54,55,56",
          "alias": "fortyGigE0/48",
          "index": "12",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet52": {
          "lanes": "49,50,51,52",
          "alias": "fortyGigE0/52",
          "index": "13",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet56": {
          "lanes": "57,58,59,60",
          "alias": "fortyGigE0/56",
          "index": "14",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet60": {
          "lanes": "61,62,63,64",
          "alias": "fortyGigE0/60",
          "index": "15",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet64": {
          "lanes": "69,70,71,72",
          "alias": "fortyGigE0/64",
          "index": "16",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet68": {
          "lanes": "65,66,67,68",
          "alias": "fortyGigE0/68",
          "index": "17",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet72": {
          "lanes": "73,74,75,76",
          "alias": "fortyGigE0/72",
          "index": "18",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet76": {
          "lanes": "77,78,79,80",
          "alias": "fortyGigE0/76",
          "index": "19",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet80": {
          "lanes": "109,110,111,112",
          "alias": "fortyGigE0/80",
          "index": "20",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet84": {
          "lanes": "105,106,107,108",
          "alias": "fortyGigE0/84",
          "index": "21",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet88": {
          "lanes": "113,114,115,116",
          "alias": "fortyGigE0/88",
          "index": "22",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet92": {
          "lanes": "117,118,119,120",
          "alias": "fortyGigE0/92",
          "index": "23",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet96": {
          "lanes": "125,126,127,128",
          "alias": "fortyGigE0/96",
          "index": "24",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet100": {
          "lanes": "121,122,123,124",
          "alias": "fortyGigE0/100",
          "index": "25",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet104": {
          "lanes": "81,82,83,84",
          "alias": "fortyGigE0/104",
          "index": "26",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet108": {
          "lanes": "85,86,87,88",
          "alias": "fortyGigE0/108",
          "index": "27",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet112": {
          "lanes": "93,94,95,96",
          "alias": "fortyGigE0/112",
          "index": "28",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet116": {
          "lanes": "89,90,91,92",
          "alias": "fortyGigE0/116",
          "index": "29",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet120": {
          "lanes": "101,102,103,104",
          "alias": "fortyGigE0/120",
          "index": "30",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      },
      "Ethernet124": {
          "lanes": "97,98,99,100",
          "alias": "fortyGigE0/124",
          "index": "31",
          "speed": "40000",
          "admin_status": "up",
          "mtu": "9100"
      }
  },
  "FLEX_COUNTER_TABLE": {
      "ACL": {
          "FLEX_COUNTER_STATUS": "disable",
          "FLEX_COUNTER_DELAY_STATUS": "true",
          "POLL_INTERVAL": "10000"
      }
  },
  "LOOPBACK_INTERFACE": {
      "Loopback0|10.1.0.1/32": {}
  },
  "INTERFACE": {
    "Ethernet0": {},
    "Ethernet4": {},
    "Ethernet8": {},
    "Ethernet12": {},
    "Ethernet16": {},
    "Ethernet20": {},
    "Ethernet24": {},
    "Ethernet28": {},
    "Ethernet32": {},
    "Ethernet36": {},
    "Ethernet40": {},
    "Ethernet44": {},
    "Ethernet48": {},
    "Ethernet52": {},
    "Ethernet56": {},
    "Ethernet60": {},
    "Ethernet64": {},
    "Ethernet68": {},
    "Ethernet72": {},
    "Ethernet76": {},
    "Ethernet80": {},
    "Ethernet84": {},
    "Ethernet88": {},
    "Ethernet92": {},
    "Ethernet96": {},
    "Ethernet100": {},
    "Ethernet104": {},
    "Ethernet108": {},
    "Ethernet112": {},
    "Ethernet116": {},
    "Ethernet120": {},
    "Ethernet124": {}
  }
}
EOF
# 起動待ち
sleep 4m
sudo config reload -y
# 起動待ち
sleep 2m
SCRIPT

$daemons = <<-'SCRIPT'
cat << 'EOF' | tee /etc/frr/daemons
zebra=yes
bgpd=yes
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no
fabricd=no
pimd=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
pbrd=no
fabricd=no
vrrpd=no
vtysh_enable=yes
zebra_options="  -M cumulus_mlag -M snmp -A 127.0.0.1 -s 90000000"
bgpd_options="   -M snmp -A 127.0.0.1"
ospfd_options="  -M snmp -A 127.0.0.1"
ospf6d_options=" -M snmp -A ::1"
ripd_options="   -A 127.0.0.1"
ripngd_options=" -A ::1"
isisd_options="  -A 127.0.0.1"
pimd_options="   -A 127.0.0.1"
ldpd_options="   -A 127.0.0.1"
nhrpd_options="  -A 127.0.0.1"
eigrpd_options=" -A 127.0.0.1"
babeld_options=" -A 127.0.0.1"
sharpd_options=" -A 127.0.0.1"
pbrd_options="   -A 127.0.0.1"
staticd_options="-A 127.0.0.1"
fabricd_options="-A 127.0.0.1"
vrrpd_options="  -A 127.0.0.1"
EOF
systemctl restart frr
SCRIPT

$spine1_conf = <<-'CONFIG'
enable
configure terminal
interface lo
  ip address 10.0.0.1/32
interface Ethernet0
  ip address 10.1.0.1/24
  ipv6 nd ra-interval 10
  no ipv6 nd suppress-ra
  no shut
interface Ethernet4
  ip address 10.2.0.1/24
  ipv6 nd ra-interval 10
  no ipv6 nd suppress-ra
  no shut
router bgp 65200
  bgp router-id 10.0.0.1
  no bgp ebgp-requires-policy
  bgp bestpath as-path multipath-relax
  neighbor FABRIC peer-group
  neighbor FABRIC remote-as external
  neighbor FABRIC capability extended-nexthop
  neighbor Ethernet0 interface peer-group FABRIC
  neighbor Ethernet4 interface peer-group FABRIC
  address-family ipv4 unicast
    network 10.0.0.1/32
  exit-address-family
end
write mem
CONFIG

$leaf1_conf = <<-'CONFIG'
enable
configure terminal
interface lo
  ip address 10.0.1.1/32
interface swp1
  ip address 10.1.0.2/24
  ipv6 nd ra-interval 10
  no ipv6 nd suppress-ra
  no shut
interface swp2
  ip address 192.168.1.1/24
  no shut
router bgp 65100
  bgp router-id 10.0.1.1
  no bgp ebgp-requires-policy
  bgp bestpath as-path multipath-relax
  neighbor FABRIC peer-group
  neighbor FABRIC remote-as external
  neighbor FABRIC capability extended-nexthop
  neighbor swp1 interface peer-group FABRIC
  neighbor swp2 interface peer-group FABRIC
  address-family ipv4 unicast
    network 10.0.1.1/32
    network 192.168.1.1/24
  exit-address-family
end
write mem
CONFIG

$leaf2_conf = <<-'CONFIG'
enable
configure terminal
interface lo
  ip address 10.0.1.2/32
interface swp1
  ip address 10.2.0.2/24
  ipv6 nd ra-interval 10
  no ipv6 nd suppress-ra
  no shut
interface swp2
  ip address 192.168.2.1/24
  no shut
router bgp 65101
  bgp router-id 10.0.1.2
  no bgp ebgp-requires-policy
  bgp bestpath as-path multipath-relax
  neighbor FABRIC peer-group
  neighbor FABRIC remote-as external
  neighbor FABRIC capability extended-nexthop
  neighbor swp1 interface peer-group FABRIC
  neighbor swp2 interface peer-group FABRIC
  address-family ipv4 unicast
    network 10.0.1.2/32
    network 192.168.2.1/24
  exit-address-family
end
write mem
CONFIG


def to_vtysh_cmd(s)
    "vtysh" + s.split("\n").map{|s| " -c \"" + s + "\""}.join()
end

# ------------------------------------------------------------
# Host Config
# ------------------------------------------------------------
$host1_conf = <<-'SCRIPT'
ip link set eth1 up
ip address add 192.168.1.2/24 dev eth1
ip route add 192.168.2.0/24 via 192.168.1.1 dev eth1
SCRIPT

$host2_conf = <<-'SCRIPT'
ip link set eth1 up
ip address add 192.168.2.2/24 dev eth1
ip route add 192.168.1.0/24 via 192.168.2.1 dev eth1
SCRIPT


# ------------------------------------------------------------
# vagrant configure version 2
# ------------------------------------------------------------
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

    config.vbguest.auto_update = false

    # 
    # SONiC
    # ------------------------------------------------------------
    spine1 = "clos-spine1"
    config.vm.define spine1 do |switch|
        switch.vm.box = "sonic-vs"

        switch.ssh.username = 'admin'
        switch.ssh.password = 'YourPaSsWoRd'
        switch.ssh.insert_key = false

        switch.vm.boot_timeout = 18000
        switch.vm.synced_folder '.', '/vagrant', disabled: true

        # private network config
        switch.vm.network "private_network", virtualbox__intnet: "net1", auto_config: false
        switch.vm.network "private_network", virtualbox__intnet: "net2", auto_config: false

        # # set network config
        switch.vm.provision "shell", inline: $reset_sonic % {hostname: spine1}
        switch.vm.provision "shell", inline: to_vtysh_cmd($spine1_conf)

        # virtual box config
        switch.vm.provider "virtualbox" do |vb|
            vb.name = spine1
            vb.gui = $gui
            vb.cpus = 1
            vb.memory = 2048
            vb.customize [
                "modifyvm", :id,
                "--vram", "16", 
                "--clipboard", "bidirectional",
                "--draganddrop", "bidirectional",
                "--ioapic", "off",
                "--graphicscontroller", "vmsvga",
                "--accelerate3d", "off",
                "--hwvirtex", "on",
                "--nestedpaging", "on",
                "--largepages", "on",
                "--pae", "on",
                "--audio", "none",
                "--chipset", "piix3",
                "--uartmode1", "disconnected",
                "--description", $description
            ]

            (1..switch.vm.networks.count {|nw| !nw.include? :forwarded_port}).each do |i|
                vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-all"]
            end
        end
      end

    # 
    # Cumulus Linux
    # ------------------------------------------------------------
    leaf1 = "clos-leaf1"
    config.vm.define leaf1 do |switch|
        switch.vm.hostname = leaf1
        switch.vm.box = "CumulusCommunity/cumulus-vx"

        # private network config
        switch.vm.network "private_network", virtualbox__intnet: "net1", auto_config: false
        switch.vm.network "private_network", virtualbox__intnet: "net3", auto_config: false

        # set network config
        switch.vm.provision "shell", inline: $daemons
        switch.vm.provision "shell", inline: to_vtysh_cmd($leaf1_conf)

        # virtual box config
        switch.vm.provider "virtualbox" do |vb|
            vb.name = leaf1
            vb.gui = $gui
            vb.cpus = 1
            vb.memory = 1024
            vb.customize [
                "modifyvm", :id,
                "--vram", "16", 
                "--clipboard", "bidirectional",
                "--draganddrop", "bidirectional",
                "--ioapic", "on",
                "--graphicscontroller", "vmsvga",
                "--accelerate3d", "off",
                "--hwvirtex", "on",
                "--nestedpaging", "on",
                "--largepages", "on",
                "--pae", "on",
                "--audio", "none",
                "--chipset", "ich9",
                "--description", $description
            ]

            (1..switch.vm.networks.count {|nw| !nw.include? :forwarded_port}).each do |i|
                vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-all"]
            end
        end
    end

    leaf2 = "clos-leaf2"
    config.vm.define leaf2 do |switch|
        switch.vm.hostname = leaf2
        switch.vm.box = "CumulusCommunity/cumulus-vx"

        # private network config
        switch.vm.network "private_network", virtualbox__intnet: "net2", auto_config: false
        switch.vm.network "private_network", virtualbox__intnet: "net4", auto_config: false

        # set network config
        switch.vm.provision "shell", inline: $daemons
        switch.vm.provision "shell", inline: to_vtysh_cmd($leaf2_conf)

        # virtual box config
        switch.vm.provider "virtualbox" do |vb|
            vb.name = leaf2
            vb.gui = $gui
            vb.cpus = 1
            vb.memory = 1024
            vb.customize [
                "modifyvm", :id,
                "--vram", "16", 
                "--clipboard", "bidirectional",
                "--draganddrop", "bidirectional",
                "--ioapic", "on",
                "--graphicscontroller", "vmsvga",
                "--accelerate3d", "off",
                "--hwvirtex", "on",
                "--nestedpaging", "on",
                "--largepages", "on",
                "--pae", "on",
                "--audio", "none",
                "--chipset", "ich9",
                "--description", $description
            ]

            (1..switch.vm.networks.count {|nw| !nw.include? :forwarded_port}).each do |i|
                vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-all"]
            end
        end
    end

    # 
    # Ubntu
    # ------------------------------------------------------------
    host1 = "clos-host1"
    config.vm.define host1 do |host|
        host.vm.hostname = host1
        host.vm.box = 'bento/ubuntu-20.04'

        # private network config
        host.vm.network "private_network", virtualbox__intnet: "net3", auto_config: false

        host.vm.provision "shell", inline: $host1_conf

        # virtual box config
        host.vm.provider "virtualbox" do |vb|
            vb.name = host1
            vb.gui = $gui
            vb.cpus = 1
            vb.memory = 1024
            vb.customize [
                "modifyvm", :id,
                "--vram", "16", 
                "--clipboard", "bidirectional",
                "--draganddrop", "bidirectional",
                "--ioapic", "on",
                "--graphicscontroller", "vmsvga",
                "--accelerate3d", "off",
                "--hwvirtex", "on",
                "--nestedpaging", "on",
                "--largepages", "on",
                "--pae", "on",
                "--audio", "none",
                "--chipset", "ich9",
                "--description", $description
            ]

            (1..host.vm.networks.count {|nw| !nw.include? :forwarded_port}).each do |i|
                vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-all"]
            end
        end
    end

    host2 = "clos-host2"
    config.vm.define host2 do |host|
        host.vm.hostname = host2
        host.vm.box = 'bento/ubuntu-20.04'

        # private network config
        host.vm.network "private_network", virtualbox__intnet: "net4", auto_config: false

        host.vm.provision "shell", inline: $host2_conf

        # virtual box config
        host.vm.provider "virtualbox" do |vb|
            vb.name = host2
            vb.gui = $gui
            vb.cpus = 1
            vb.memory = 1024
            vb.customize [
                "modifyvm", :id,
                "--vram", "16", 
                "--clipboard", "bidirectional",
                "--draganddrop", "bidirectional",
                "--ioapic", "on",
                "--graphicscontroller", "vmsvga",
                "--accelerate3d", "off",
                "--hwvirtex", "on",
                "--nestedpaging", "on",
                "--largepages", "on",
                "--pae", "on",
                "--audio", "none",
                "--chipset", "ich9",
                "--description", $description
            ]

            (1..host.vm.networks.count {|nw| !nw.include? :forwarded_port}).each do |i|
                vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-all"]
            end
        end
    end
end

実行

では,vagrant upで実行します.

spine1 (SONiC)

起動後,vagrant ssh clos-spine1でSONiCにログインします.繰り返しですが,パスワードはYourPaSsWoRdです.

$ vagrant ssh clos-spine1
==> clos-spine1: The machine you're attempting to SSH into is configured to use
==> clos-spine1: password-based authentication. Vagrant can't script entering the
==> clos-spine1: password for you. If you're prompted for a password, please enter
==> clos-spine1: the same password you have configured in the Vagrantfile.
admin@127.0.0.1's password: 
Linux clos-spine1 5.10.0-12-2-amd64 #1 SMP Debian 5.10.103-1 (2022-03-07) 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/

Last login: Tue May 31 08:19:37 2022 from 10.0.2.2
admin@clos-spine1:~$ 

vtyshでBGPの確認とルーティングテーブルの確認をします.

clos-spine1# show bgp summary 

IPv4 Unicast Summary:
BGP router identifier 10.0.0.1, local AS number 65200 vrf-id 0
BGP table version 13
RIB entries 9, using 1728 bytes of memory
Peers 2, using 43 KiB of memory
Peer groups 1, using 64 bytes of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
Ethernet0       4      65100       152       151        0    0    0 00:06:45            2        5
Ethernet4       4      65101       126       126        0    0    0 00:05:24            2        5

Total number of neighbors 2
clos-spine1# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

K>* 0.0.0.0/0 [0/0] via 10.0.2.2, eth0, 00:09:31
C>* 10.0.0.1/32 is directly connected, lo, 00:07:56
B>* 10.0.1.1/32 [20/0] via fe80::a00:27ff:fe8f:18b1, Ethernet0, weight 1, 00:06:50
B>* 10.0.1.2/32 [20/0] via fe80::a00:27ff:fecc:5d9, Ethernet4, weight 1, 00:05:28
C>* 10.0.2.0/24 is directly connected, eth0, 00:09:31
C>* 10.1.0.0/24 is directly connected, Ethernet0, 00:07:56
C>* 10.1.0.1/32 is directly connected, Loopback0, 00:09:01
C>* 10.2.0.0/24 is directly connected, Ethernet4, 00:07:56
B>* 192.168.1.0/24 [20/0] via fe80::a00:27ff:fe8f:18b1, Ethernet0, weight 1, 00:06:50
B>* 192.168.2.0/24 [20/0] via fe80::a00:27ff:fecc:5d9, Ethernet4, weight 1, 00:05:28
clos-spine1# 

leaf1 (Cumulus Linux)

leaf1も同様に,ログインして,BGPとルーティングを確認します.Cumulusは,ちゃんとした(?)Vagrant Boxなので,パスワードなどはvagrantです.

clos-leaf1# show bgp su

IPv4 Unicast Summary:
BGP router identifier 10.0.1.1, local AS number 65100 vrf-id 0
BGP table version 9
RIB entries 9, using 1800 bytes of memory
Peers 2, using 46 KiB of memory
Peer groups 1, using 64 bytes of memory

Neighbor          V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
clos-spine1(swp1) 4      65200       201       201        0    0    0 00:09:41            3        5
swp2              4          0         0         0        0    0    0    never         Idle        0

Total number of neighbors 2
clos-leaf1# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric, Z - FRR,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure
B>* 10.0.0.1/32 [20/0] via fe80::a00:27ff:fef6:1874, swp1, weight 1, 00:09:53
C>* 10.0.1.1/32 is directly connected, lo, 00:09:57
B>* 10.0.1.2/32 [20/0] via fe80::a00:27ff:fef6:1874, swp1, weight 1, 00:08:31
C>* 10.1.0.0/24 is directly connected, swp1, 00:09:57
C>* 192.168.1.0/24 is directly connected, swp2, 00:09:57
B>* 192.168.2.0/24 [20/0] via fe80::a00:27ff:fef6:1874, swp1, weight 1, 00:08:31
clos-leaf1# 

疎通確認

最後に,host1からhost2へPingが通るかを確かめます.

vagrant@clos-host1:~$ ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=61 time=63.8 ms
64 bytes from 192.168.2.2: icmp_seq=2 ttl=61 time=44.8 ms
64 bytes from 192.168.2.2: icmp_seq=3 ttl=61 time=49.8 ms
64 bytes from 192.168.2.2: icmp_seq=4 ttl=61 time=13.5 ms
64 bytes from 192.168.2.2: icmp_seq=5 ttl=61 time=26.7 ms
^C
--- 192.168.2.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4014ms
rtt min/avg/max/mdev = 13.539/39.726/63.798/17.684 ms

通りました.

おわりに

今回は,SONiCをVirtaulBox + Vagrant で動かしてみました.参考になれば幸いです.

参考文献

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?