メモのページ - チラシの裏メモ 3枚目

気になった事を黙々とメモし続ける

2021年はLinux 30周年

1991年8月25日にLinus Torvalds氏がLinuxの開発を発表、10月5日に最初のバージョンが公開されたという事で、2021年はLinux 30周年にあたる。


初公開日の10月5日は半年以上も先だが30周年をお祝いし(?)、AndroidスマホにLimbo PC Emulatorをインストールし、自分が初めて触れたLinuxであるDebian GNU/Linux 3.0 (woody)をゲストOSとしてデプロイしてみた。
インストール時の言語環境を日本語に選択する事は可能だが何度やってもインストールに失敗したが、英語を選択すると成功した。
インストールに要した時間は思っていた以上に短く、再起動後のdselect周辺も含めて1時間は要しなかった。
初めてインストールした時は苦労したと思うが、何せ20年近く前の事でありどんな感じで苦労したのか忘れた。NIC周りかX周りか...



起動開始直後のLILO... の文字列、何年ぶりに見たのだろう。
起動時のログ出力やコマンド叩いた時の反応は、Alpine Linux(3.11.8)より軽快だ。
起動完了後にfree -mコマンドを叩いたら、usedがたった16MB!!
vsftpdはAlpine LinuxやCentOSで使用しているvsftpd.confを流用してもWLANの同じネットワークから出来なかった為、wu-ftpdを導入。家庭内環境用の簡易的なFTPサーバとして動かす事にした。



以下の画像は、Limbo PC Emulator内で動作するDebian GNU/Linuxに、SSHクライアントアプリTerminusからsshでlocalhost宛てにアクセスしたもの。
Limbo PC Emulatorに出力される文字のフォントサイズは変更出来ず読みづらい為に、起動完了後はフォントサイズの変更が可能なsshクライアントアプリからアクセスし、bashのコマンドをぽちぽち叩いて遊んでいる。
両脇にある本は、JUST FOR FUNの日本語版とviの参考書。





https://debslink.hatenadiary.jp/entry/20200509/1589032166 外出自粛で暇なのでUNIX系OS使用遍歴を振り返る
https://debslink.hatenadiary.jp/entry/20200418/1587204948 AndroidスマホでAlpine Linuxを動かす 


https://gihyo.jp/admin/clip/01/linux_dt/202103/25
https://www.zaikei.co.jp/article/20210322/613150.html
https://linuxfoundation.org/linux30th/
https://en.wikipedia.org/wiki/Linux_kernel
https://linux.srad.jp/story/21/03/21/058252/ Linux Foundation、Linux 30周年記念ロゴ画像を公開
https://cdimage.debian.org/mirror/cdimage/archive/3.0_r6/i386/iso-cd/

※Wikipediaに載っているLinuxカーネルの記事は、英語版の方が詳細に書かれている

Cumulus LinuxとSONiCの設定ファイル

Debian GNU/LinuxベースのNOSであるCumulus LinuxとSONiCの設定方法と設定ファイルについて簡単にまとめてみた。(というより晒しただけ)
製品版ではなくJenkinsから落としてくるSONiCのBGP設定について腑に落ちない所が有り、SONiCを再度デプロイから始め、Cumulus LinuxをBGPピアとしたeBGPの設定をもう一度試行。コマンド投入で設定可能な内容と設定ファイルの編集が必要な内容を整理してみた。
※今回の確認対象はBGPの設定に関わるファイルのみであり、VXLANやACLやQoSなど他の設定のファイルに関しては触れない事を予め断っておく。


当方の環境
SONiCはJenkinsからダウンロード可能なもの(開発版)、Cumulus Linuxは製品版の仮想アプライアンス版(Cumulus VX)を使用。VirtualBoxにデプロイした。
SONIC:

$ show version
SONiC Software Version: SONiC.202012.35-84a091d9
Distribution: Debian 10.8
Kernel: 4.19.0-12-2-amd64
Build commit: 84a091d9
Build date: Fri Mar  5 06:47:10 UTC 2021
Built by: johnar@jenkins-worker-8


Cumulus VX:

$ net show version
NCLU_VERSION=1.0-cl4.2.1u1
DISTRIB_ID="Cumulus Linux"
DISTRIB_RELEASE=4.2.1
DISTRIB_DESCRIPTION="Cumulus Linux 4.2.1"



構成
今回の構成は以下の図のとおり。
IP Clos(っぽい)構成は本来であればLeafとSpineとの間の物理リンクは1本づつである。

今回は1台のSONiCと1台のCumulus VXとの間でeBGPで接続させた。
尚、SONiCはデプロイ直後には既にBGPやIPアドレスの設定が投入済みにつき設定変更箇所は最低限に留め、対向先のCumulusはSONiCに合わせる形で設定投入した。



Cumulus Linux (Cumulus VX)の場合
インタフェースやシステム周りはNCLUコマンドで設定を投入し、net commitコマンドで設定内容を保存。
ルーティングはvtyshモードに入りCisco IOSライクなコマンドで設定を投入し、write memoryコマンドで設定内容を保存。
製品版の仮想アプライアンス版という事も有ってか、検証環境の範囲内ではあるものの設定後はヘンテコな動作は見せず動作が安定している。



SONiCの場合
Jenkinsから落としてきたイメージファイルは既にBGPやルートマップやIPアドレス等の設定が入っている状態である為、自宅環境にてBGPの動作検証をする程度であれば、最初から設定投入をする事は殆ど無いだろう。
インタフェースやスタティックルートやホスト名等の設定は、sudo configコマンドで投入する。設定内容はsudo config saveコマンドで保存可能。
BGPなどダイナミックルーティングの設定はvtyshモードでCisco IOSライクなコマンドで投入する。
write memoryコマンドで設定内容の保存が可能だが、当方の環境ではvtyshモードのBGP設定が/etc/sonic/config_db.jsonには反映されずbgpd.confには反映された。
/etc/sonic/config_db.jsonファイルとbgpd.confファイルの立ち位置はどう違うのか調べていくと、以下の資料にたどり着いた。

https://speakerdeck.com/imasaruoki/sonicdeshe-ding-surufrrouting SONiCで設定するFRRouting
上記資料の9シート目の記載内容によると、設定内容が/etc/sonic/config_db.jsonにマージされるのではなく、Config DBの内容とvtyshモードで設定した内容(bgpd.confなど)が実行中のコンフィグレーションになる事が分かった。

①/etc/sonic/config_db.jsonファイルの内容をConfig DBに書き込み。
②bgpcfgdがConfig DBの以下のデータを読み込む。
・bgp_asn
・neighbor asn
・name
・admin status
③vtyshモードで投入した設定内容をbgpdに読み込ませる。
④上記の②と③の内容が、実行中のコンフィグレーションとなる。
Ciscoのスイッチで言うと②+③の内容がrunning-configという事か。



ところで、BGPの設定投入後にwrite memoryコマンドを実行し設定内容をシステムに反映させようとすると...
"Note: this version of vtysh never writes vtysh.conf"と怒られた。

# write memory
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Configuration saved to /etc/frr/zebra.conf
Configuration saved to /etc/frr/bgpd.conf
Configuration saved to /etc/frr/staticd.conf
#

"Configuration saved to"で示されていたディレクトリは存在せずzebra.confとbgpd.confとstaticd.confファイルのパスは出力内容とは異なっており、/etc/frr/ディレクトリ内ではなく/etc/sonic/frr/ディレクトリ内に有った。

$ ls /etc/frr
ls: cannot access '/etc/frr': No such file or directory
$
$ sudo ls /etc/sonic/frr/
bgpd.conf  bgpd.conf.sav  staticd.conf  staticd.conf.sav  vtysh.conf  zebra.conf  zebra.conf.sav
$

Cumulus Linuxの設定内容
以下は/etc/network/interfacesファイルの内容。
NCLUコマンドで投入したインタフェース周りの設定が書かれている。
Cisco IOS XEもLinuxベースのNOSであるが、設定内部のFlashメモリに保存されているConfigファイル

$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*.intf

# The loopback network interface
auto lo
iface lo inet loopback
    # The primary network interface
    address 10.1.1.98/32

# The primary network interface
auto eth0
iface eth0
    address 192.168.3.250/24
    vrf mgmt

auto swp1
iface swp1
    address 10.0.0.1/31
    alias DEV=jpmtkvmsw99 IF=Eth0
    mtu 9100

auto swp2
iface swp2
    address 10.0.0.3/31
    alias DEV=jpmtkvmsw99 IF=Eth1
    mtu 9100

auto swp3
iface swp3
    address 10.0.0.5/31
    alias DEV=jpmtkvmsw99 IF=Eth2
    mtu 9100

auto swp4
iface swp4
    address 10.0.0.7/31
    alias DEV=jpmtkvmsw99 IF=Eth3
    mtu 9100

auto swp5
iface swp5
    address 10.0.0.9/31
    alias DEV=jpmtkvmsw99 IF=Eth4
    mtu 9100

auto mgmt
iface mgmt
    address 127.0.0.1/8
    address ::1/128
    vrf-table auto
$

以下は/etc/frr/frr.confファイルの内容。
vtyshモードで設定したルーティングの設定が書かれているが、NCLUとvtyshとの間で完全に棲み分けしているという訳ではないようで、NCLUで設定したhostnameは当ファイル内に書かれている。

$ sudo cat /etc/frr/frr.conf
[sudo] password for cumulus:
frr version 7.4+cl4.2.1u1
frr defaults datacenter
hostname jpmtkvmsw98
log syslog informational
service integrated-vtysh-config
router bgp 65200
 neighbor 10.0.0.0 remote-as 65100
 neighbor 10.0.0.2 remote-as 65100
 neighbor 10.0.0.4 remote-as 65100
 neighbor 10.0.0.6 remote-as 65100
 neighbor 10.0.0.8 remote-as 65100
 address-family ipv4 unicast
  network 10.1.1.98/32
 exit-address-family
line vty
$


SONiCの設定内容
以下は/etc/sonic/config_db.jsonファイルの内容。
"BGP_NEIGHBOR"の項目にてBGPネイバを修正すべく/etc/sonic/config_db.jsonファイルを直接編集した。
BGPネイバのCumulus Linuxに合わせてAS番号("asn"の項目)を修正、"name"の項目はCumulus Linuxのホスト名とインタフェース名に修正。
また、ずらーりずらりと並んでいたBGPネイバ設定の数はCumulus Linux側に合わせて5つまでとし、6つ目以降は削除した。
"BGP_NEIGHBOR"の項目以外の項目は編集しておらず、そのまま残している。

$ sudo cat /etc/sonic/config_db.json
{
    "BGP_NEIGHBOR": {
        "10.0.0.1": {
            "asn": "65200",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.0",
            "name": "jpmtkvmsw98_swp1",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.3": {
            "asn": "65200",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.2",
            "name": "jpmtkvmsw98_swp2",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.5": {
            "asn": "65200",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.4",
            "name": "jpmtkvmsw98_swp3",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.7": {
            "asn": "65200",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.6",
            "name": "jpmtkvmsw98_swp4",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.9": {
            "asn": "65200",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.8",
            "name": "jpmtkvmsw98_swp5",
            "nhopself": "0",
            "rrclient": "0"
        }
    },
    "CRM": {
        "Config": {
            "acl_counter_high_threshold": "85",
            "acl_counter_low_threshold": "70",
            "acl_counter_threshold_type": "percentage",
            "acl_entry_high_threshold": "85",
            "acl_entry_low_threshold": "70",
            "acl_entry_threshold_type": "percentage",
            "acl_group_high_threshold": "85",
            "acl_group_low_threshold": "70",
            "acl_group_threshold_type": "percentage",
            "acl_table_high_threshold": "85",
            "acl_table_low_threshold": "70",
            "acl_table_threshold_type": "percentage",
            "dnat_entry_high_threshold": "85",
            "dnat_entry_low_threshold": "70",
            "dnat_entry_threshold_type": "percentage",
            "fdb_entry_high_threshold": "85",
            "fdb_entry_low_threshold": "70",
            "fdb_entry_threshold_type": "percentage",
            "ipmc_entry_high_threshold": "85",
            "ipmc_entry_low_threshold": "70",
            "ipmc_entry_threshold_type": "percentage",
            "ipv4_neighbor_high_threshold": "85",
            "ipv4_neighbor_low_threshold": "70",
            "ipv4_neighbor_threshold_type": "percentage",
            "ipv4_nexthop_high_threshold": "85",
            "ipv4_nexthop_low_threshold": "70",
            "ipv4_nexthop_threshold_type": "percentage",
            "ipv4_route_high_threshold": "85",
            "ipv4_route_low_threshold": "70",
            "ipv4_route_threshold_type": "percentage",
            "ipv6_neighbor_high_threshold": "85",
            "ipv6_neighbor_low_threshold": "70",
            "ipv6_neighbor_threshold_type": "percentage",
            "ipv6_nexthop_high_threshold": "85",
            "ipv6_nexthop_low_threshold": "70",
            "ipv6_nexthop_threshold_type": "percentage",
            "ipv6_route_high_threshold": "85",
            "ipv6_route_low_threshold": "70",
            "ipv6_route_threshold_type": "percentage",
            "nexthop_group_high_threshold": "85",
            "nexthop_group_low_threshold": "70",
            "nexthop_group_member_high_threshold": "85",
            "nexthop_group_member_low_threshold": "70",
            "nexthop_group_member_threshold_type": "percentage",
            "nexthop_group_threshold_type": "percentage",
            "polling_interval": "300",
            "snat_entry_high_threshold": "85",
            "snat_entry_low_threshold": "70",
            "snat_entry_threshold_type": "percentage"
        }
    },
    "DEVICE_METADATA": {
        "localhost": {
            "bgp_asn": "65100",
            "buffer_model": "traditional",
            "default_bgp_status": "up",
            "default_pfcwd_status": "disable",
            "hostname": "jpmtkvmsw99",
            "hwsku": "Force10-S6000",
            "mac": "52:54:00:12:34:56",
            "platform": "x86_64-kvm_x86_64-r0",
            "type": "LeafRouter"
        }
    },
    "FEATURE": {
        "bgp": {
            "auto_restart": "enabled",
            "has_global_scope": "False",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "database": {
            "auto_restart": "always_enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "always_enabled"
        },
        "dhcp_relay": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "gbsyncd": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "lldp": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "mgmt-framework": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "True",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "nat": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "disabled"
        },
        "pmon": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "radv": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "sflow": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "disabled"
        },
        "snmp": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "True",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "swss": {
            "auto_restart": "enabled",
            "has_global_scope": "False",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "syncd": {
            "auto_restart": "enabled",
            "has_global_scope": "False",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "teamd": {
            "auto_restart": "enabled",
            "has_global_scope": "False",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
        "telemetry": {
            "auto_restart": "enabled",
            "has_global_scope": "True",
            "has_per_asic_scope": "False",
            "has_timer": "True",
            "high_mem_alert": "disabled",
            "state": "enabled"
        }
    },
    "FLEX_COUNTER_TABLE": {
        "BUFFER_POOL_WATERMARK": {
            "FLEX_COUNTER_STATUS": "enable"
        },
        "PFCWD": {
            "FLEX_COUNTER_STATUS": "enable"
        },
        "PG_DROP": {
            "FLEX_COUNTER_STATUS": "enable"
        },
        "PG_WATERMARK": {
            "FLEX_COUNTER_STATUS": "enable"
        },
        "PORT": {
            "FLEX_COUNTER_STATUS": "enable"
        },
        "PORT_BUFFER_DROP": {
            "FLEX_COUNTER_STATUS": "enable"
        },
        "QUEUE": {
            "FLEX_COUNTER_STATUS": "enable"
        },
        "QUEUE_WATERMARK": {
            "FLEX_COUNTER_STATUS": "enable"
        },
        "RIF": {
            "FLEX_COUNTER_STATUS": "enable"
        }
    },
    "INTERFACE": {
        "Ethernet0": {},
        "Ethernet100": {},
        "Ethernet104": {},
        "Ethernet108": {},
        "Ethernet112": {},
        "Ethernet116": {},
        "Ethernet12": {},
        "Ethernet120": {},
        "Ethernet124": {},
        "Ethernet16": {},
        "Ethernet20": {},
        "Ethernet24": {},
        "Ethernet28": {},
        "Ethernet32": {},
        "Ethernet36": {},
        "Ethernet4": {},
        "Ethernet40": {},
        "Ethernet44": {},
        "Ethernet48": {},
        "Ethernet52": {},
        "Ethernet56": {},
        "Ethernet60": {},
        "Ethernet64": {},
        "Ethernet68": {},
        "Ethernet72": {},
        "Ethernet76": {},
        "Ethernet8": {},
        "Ethernet80": {},
        "Ethernet84": {},
        "Ethernet88": {},
        "Ethernet92": {},
        "Ethernet96": {},
        "Ethernet0|10.0.0.0/31": {},
        "Ethernet100|10.0.0.50/31": {},
        "Ethernet104|10.0.0.52/31": {},
        "Ethernet108|10.0.0.54/31": {},
        "Ethernet112|10.0.0.56/31": {},
        "Ethernet116|10.0.0.58/31": {},
        "Ethernet120|10.0.0.60/31": {},
        "Ethernet124|10.0.0.62/31": {},
        "Ethernet12|10.0.0.6/31": {},
        "Ethernet16|10.0.0.8/31": {},
        "Ethernet20|10.0.0.10/31": {},
        "Ethernet24|10.0.0.12/31": {},
        "Ethernet28|10.0.0.14/31": {},
        "Ethernet32|10.0.0.16/31": {},
        "Ethernet36|10.0.0.18/31": {},
        "Ethernet40|10.0.0.20/31": {},
        "Ethernet44|10.0.0.22/31": {},
        "Ethernet48|10.0.0.24/31": {},
        "Ethernet4|10.0.0.2/31": {},
        "Ethernet52|10.0.0.26/31": {},
        "Ethernet56|10.0.0.28/31": {},
        "Ethernet60|10.0.0.30/31": {},
        "Ethernet64|10.0.0.32/31": {},
        "Ethernet68|10.0.0.34/31": {},
        "Ethernet72|10.0.0.36/31": {},
        "Ethernet76|10.0.0.38/31": {},
        "Ethernet80|10.0.0.40/31": {},
        "Ethernet84|10.0.0.42/31": {},
        "Ethernet88|10.0.0.44/31": {},
        "Ethernet8|10.0.0.4/31": {},
        "Ethernet92|10.0.0.46/31": {},
        "Ethernet96|10.0.0.48/31": {}
    },
    "KDUMP": {
        "config": {
            "enabled": "false",
            "memory": "0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M",
            "num_dumps": "3"
        }
    },
    "LOOPBACK_INTERFACE": {
        "Loopback0": {},
        "Loopback0|10.1.1.99/32": {}
    },
    "MGMT_INTERFACE": {
        "eth0|192.168.3.254/24": {
            "gwaddr": "192.168.3.1"
        }
    },
    "PORT": {
        "Ethernet0": {
            "admin_status": "up",
            "alias": "fortyGigE0/0",
            "index": "0",
            "lanes": "25,26,27,28",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet100": {
            "admin_status": "up",
            "alias": "fortyGigE0/100",
            "index": "25",
            "lanes": "121,122,123,124",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet104": {
            "admin_status": "up",
            "alias": "fortyGigE0/104",
            "index": "26",
            "lanes": "81,82,83,84",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet108": {
            "admin_status": "up",
            "alias": "fortyGigE0/108",
            "index": "27",
            "lanes": "85,86,87,88",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet112": {
            "admin_status": "up",
            "alias": "fortyGigE0/112",
            "index": "28",
            "lanes": "93,94,95,96",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet116": {
            "admin_status": "up",
            "alias": "fortyGigE0/116",
            "index": "29",
            "lanes": "89,90,91,92",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet12": {
            "admin_status": "up",
            "alias": "fortyGigE0/12",
            "index": "3",
            "lanes": "37,38,39,40",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet120": {
            "admin_status": "up",
            "alias": "fortyGigE0/120",
            "index": "30",
            "lanes": "101,102,103,104",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet124": {
            "admin_status": "up",
            "alias": "fortyGigE0/124",
            "index": "31",
            "lanes": "97,98,99,100",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet16": {
            "admin_status": "up",
            "alias": "fortyGigE0/16",
            "index": "4",
            "lanes": "45,46,47,48",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet20": {
            "admin_status": "up",
            "alias": "fortyGigE0/20",
            "index": "5",
            "lanes": "41,42,43,44",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet24": {
            "admin_status": "up",
            "alias": "fortyGigE0/24",
            "index": "6",
            "lanes": "1,2,3,4",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet28": {
            "admin_status": "up",
            "alias": "fortyGigE0/28",
            "index": "7",
            "lanes": "5,6,7,8",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet32": {
            "admin_status": "up",
            "alias": "fortyGigE0/32",
            "index": "8",
            "lanes": "13,14,15,16",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet36": {
            "admin_status": "up",
            "alias": "fortyGigE0/36",
            "index": "9",
            "lanes": "9,10,11,12",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet4": {
            "admin_status": "up",
            "alias": "fortyGigE0/4",
            "index": "1",
            "lanes": "29,30,31,32",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet40": {
            "admin_status": "up",
            "alias": "fortyGigE0/40",
            "index": "10",
            "lanes": "17,18,19,20",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet44": {
            "admin_status": "up",
            "alias": "fortyGigE0/44",
            "index": "11",
            "lanes": "21,22,23,24",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet48": {
            "admin_status": "up",
            "alias": "fortyGigE0/48",
            "index": "12",
            "lanes": "53,54,55,56",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet52": {
            "admin_status": "up",
            "alias": "fortyGigE0/52",
            "index": "13",
            "lanes": "49,50,51,52",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet56": {
            "admin_status": "up",
            "alias": "fortyGigE0/56",
            "index": "14",
            "lanes": "57,58,59,60",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet60": {
            "admin_status": "up",
            "alias": "fortyGigE0/60",
            "index": "15",
            "lanes": "61,62,63,64",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet64": {
            "admin_status": "up",
            "alias": "fortyGigE0/64",
            "index": "16",
            "lanes": "69,70,71,72",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet68": {
            "admin_status": "up",
            "alias": "fortyGigE0/68",
            "index": "17",
            "lanes": "65,66,67,68",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet72": {
            "admin_status": "up",
            "alias": "fortyGigE0/72",
            "index": "18",
            "lanes": "73,74,75,76",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet76": {
            "admin_status": "up",
            "alias": "fortyGigE0/76",
            "index": "19",
            "lanes": "77,78,79,80",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet8": {
            "admin_status": "up",
            "alias": "fortyGigE0/8",
            "index": "2",
            "lanes": "33,34,35,36",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet80": {
            "admin_status": "up",
            "alias": "fortyGigE0/80",
            "index": "20",
            "lanes": "109,110,111,112",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet84": {
            "admin_status": "up",
            "alias": "fortyGigE0/84",
            "index": "21",
            "lanes": "105,106,107,108",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet88": {
            "admin_status": "up",
            "alias": "fortyGigE0/88",
            "index": "22",
            "lanes": "113,114,115,116",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet92": {
            "admin_status": "up",
            "alias": "fortyGigE0/92",
            "index": "23",
            "lanes": "117,118,119,120",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet96": {
            "admin_status": "up",
            "alias": "fortyGigE0/96",
            "index": "24",
            "lanes": "125,126,127,128",
            "mtu": "9100",
            "speed": "40000"
        }
    },
    "SNMP": {
        "LOCATION": {
            "Location": "public"
        }
    },
    "SNMP_COMMUNITY": {
        "public": {
            "TYPE": "RO"
        }
    },
    "VERSIONS": {
        "DATABASE": {
            "VERSION": "version_2_0_0"
        }
    }
}
$

以下は/etc/network/interfacesファイルの内容。
"Managed by SONiC Config Engine DO NOT EDIT!"の記載が有るとおり、このファイルは直接編集していない。

$ sudo cat /etc/network/interfaces
#
# =============== Managed by SONiC Config Engine DO NOT EDIT! ===============
# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen
# file: /etc/network/interfaces
#
# The loopback network interface
auto lo
iface lo inet loopback
   address 127.0.0.1
   netmask 255.255.0.0
   post-up ip addr del 127.0.0.1/8 dev lo

# The management network interface
auto eth0
iface eth0 inet static
    address 192.168.3.254
    netmask 255.255.255.0
    network 192.168.3.0
    broadcast 192.168.3.255
    ########## management network policy routing rules
    # management port up rules
    up ip -4 route add default via 192.168.3.1 dev eth0 table default metric 201
    up ip -4 route add 192.168.3.0/24 dev eth0 table default
    up ip -4 rule add pref 32765 from 192.168.3.254/32 table default
    # management port down rules
    pre-down ip -4 route delete default via 192.168.3.1 dev eth0 table default
    pre-down ip -4 route delete 192.168.3.0/24 dev eth0 table default
    pre-down ip -4 rule delete pref 32765 from 192.168.3.254/32 table default
#
source /etc/network/interfaces.d/*
#

$

以下は/etc/sonic/frr/zebra.confファイルの内容。
frrバージョンやホスト名、パスワード、ログの設定等はzebra.confファイルおよびbgpd.conf、staticd.confの各ファイルにて同じである。
write memoryコマンドで設定内容が反映される為、当ファイルは直接編集していない。

$ sudo cat /etc/sonic/frr/zebra.conf
!
! Zebra configuration saved from vty
!   2021/03/20 02:00:24
!
frr version 7.5-sonic
frr defaults traditional
!
hostname jpmtkvmsw99
password zebra
enable password zebra
log syslog informational
log facility local4
!
!
!
ip nht resolve-via-default
ip protocol bgp route-map RM_SET_SRC
!
!
route-map ALLOW_LIST_DEPLOYMENT_ID_0_V4 permit 65535
!
route-map ALLOW_LIST_DEPLOYMENT_ID_0_V6 permit 65535
!
route-map FROM_BGP_PEER_V4 permit 10
 call ALLOW_LIST_DEPLOYMENT_ID_0_V4
 on-match next
!
route-map FROM_BGP_PEER_V4 permit 11
!
route-map FROM_BGP_PEER_V4 permit 100
!
route-map FROM_BGP_PEER_V6 permit 10
 call ALLOW_LIST_DEPLOYMENT_ID_0_V6
 on-match next
!
route-map FROM_BGP_PEER_V6 permit 11
!
route-map FROM_BGP_PEER_V6 permit 1
 on-match next
!
route-map FROM_BGP_PEER_V6 permit 100
!
route-map TO_BGP_PEER_V4 permit 100
!
route-map TO_BGP_PEER_V6 permit 100
!
route-map RM_SET_SRC permit 10
 set src 10.1.1.99
!
!
!
!
!
line vty
!
$

以下は/etc/sonic/frr/bgpd.confファイルの内容。
ファイル名のとおりBGPの設定が保存されているファイルのようで、BGPの設定以外は、zebra.confファイルおよびstaticd.confファイルと同じである。
write memoryコマンドで設定内容が反映される為、当ファイルは直接編集していない。
BGPネイバの設定内容をよく見ると、ネイバの数やremote-as、descriptionの設定は/etc/sonic/config_db.jsonの内容と同じである事が分かる。
...という事は、BGPネイバの設定は/etc/sonic/config_db.jsonファイルを直接編集、BGPの他の設定やルートマップの設定等はvtyshモードで設定...という事なのだろうか。

$ sudo cat /etc/sonic/frr/bgpd.conf
!
! Zebra configuration saved from vty
!   2021/03/20 02:00:24
!
frr version 7.5-sonic
frr defaults traditional
!
hostname jpmtkvmsw99
password zebra
enable password zebra
log syslog informational
log facility local4
!
!
!
router bgp 65100
 bgp router-id 10.1.1.99
 bgp log-neighbor-changes
 no bgp ebgp-requires-policy
 no bgp default ipv4-unicast
 bgp graceful-restart restart-time 240
 bgp graceful-restart
 bgp graceful-restart preserve-fw-state
 bgp bestpath as-path multipath-relax
 neighbor PEER_V4 peer-group
 neighbor PEER_V6 peer-group
 neighbor 10.0.0.1 remote-as 65200
 neighbor 10.0.0.1 peer-group PEER_V4
 neighbor 10.0.0.1 description jpmtkvmsw98_swp1
 neighbor 10.0.0.3 remote-as 65200
 neighbor 10.0.0.3 peer-group PEER_V4
 neighbor 10.0.0.3 description jpmtkvmsw98_swp2
 neighbor 10.0.0.5 remote-as 65200
 neighbor 10.0.0.5 peer-group PEER_V4
 neighbor 10.0.0.5 description jpmtkvmsw98_swp3
 neighbor 10.0.0.7 remote-as 65200
 neighbor 10.0.0.7 peer-group PEER_V4
 neighbor 10.0.0.7 description jpmtkvmsw98_swp4
 neighbor 10.0.0.9 remote-as 65200
 neighbor 10.0.0.9 peer-group PEER_V4
 neighbor 10.0.0.9 description jpmtkvmsw98_swp5
 !
 address-family ipv4 unicast
  network 10.1.1.99/32
  neighbor PEER_V4 soft-reconfiguration inbound
  neighbor PEER_V4 route-map FROM_BGP_PEER_V4 in
  neighbor PEER_V4 route-map TO_BGP_PEER_V4 out
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.3 activate
  neighbor 10.0.0.5 activate
  neighbor 10.0.0.7 activate
  neighbor 10.0.0.9 activate
  maximum-paths 64
 exit-address-family
 !
 address-family ipv6 unicast
  neighbor PEER_V6 soft-reconfiguration inbound
  neighbor PEER_V6 route-map FROM_BGP_PEER_V6 in
  neighbor PEER_V6 route-map TO_BGP_PEER_V6 out
  maximum-paths 64
 exit-address-family
!
!
ip prefix-list PL_LoopbackV4 seq 5 permit 10.1.1.99/32
!
bgp community-list standard allow_list_default_community seq 5 permit no-export
bgp community-list standard allow_list_default_community seq 10 permit 5060:12345
!
route-map ALLOW_LIST_DEPLOYMENT_ID_0_V4 permit 65535
 set community 5060:12345 additive
!
route-map ALLOW_LIST_DEPLOYMENT_ID_0_V6 permit 65535
 set community 5060:12345 additive
!
route-map FROM_BGP_PEER_V4 permit 10
 call ALLOW_LIST_DEPLOYMENT_ID_0_V4
 on-match next
!
route-map FROM_BGP_PEER_V4 permit 11
 match community allow_list_default_community
!
route-map FROM_BGP_PEER_V4 permit 100
!
route-map FROM_BGP_PEER_V6 permit 10
 call ALLOW_LIST_DEPLOYMENT_ID_0_V6
 on-match next
!
route-map FROM_BGP_PEER_V6 permit 11
 match community allow_list_default_community
!
route-map FROM_BGP_PEER_V6 permit 1
 set ipv6 next-hop prefer-global
 on-match next
!
route-map FROM_BGP_PEER_V6 permit 100
!
route-map TO_BGP_PEER_V4 permit 100
!
route-map TO_BGP_PEER_V6 permit 100
!
route-map RM_SET_SRC permit 10
!
!
agentx
!
line vty
!
$

以下は/etc/sonic/frr/staticd.confファイルの内容。
ファイル名のとおりスタティックルートの設定が保存されているファイルのようで、スタティックルートの設定以外は、zebra.confファイルおよびbgpd.confファイルと同じである。
write memoryコマンドで設定内容が反映される為、当ファイルは直接編集していない。
show runningconfig allコマンドの出力内容は、zebra.conf、bgpd.conf、staticd.confの各ファイルの内容をマージした内容と同じである事に気が付く。

$ sudo cat /etc/sonic/frr/staticd.conf
!
! Zebra configuration saved from vty
!   2021/03/20 02:00:24
!
frr version 7.5-sonic
frr defaults traditional
!
hostname jpmtkvmsw99
password zebra
enable password zebra
log syslog informational
log facility local4
!
!
!
ip route 0.0.0.0/0 192.168.3.1 200
line vty
!
$



BGPテーブルの内容の確認
ここに来てようやくBGPテーブルの内容を確認。

SONiC側のBGPテーブルの内容を確認。
設定内容のとおり、各物理リンクにてBGPピアを張っている事が分かる。

# show ip bgp summary

IPv4 Unicast Summary:
BGP router identifier 10.1.1.99, local AS number 65100 vrf-id 0
BGP table version 2
RIB entries 3, using 576 bytes of memory
Peers 5, using 107 KiB of memory
Peer groups 2, using 128 bytes of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
10.0.0.1        4      65200      1209      1208        0    0    0 01:00:07            1        2
10.0.0.3        4      65200      1209      1208        0    0    0 01:00:07            1        2
10.0.0.5        4      65200      1208      1207        0    0    0 01:00:05            1        2
10.0.0.7        4      65200      1209      1208        0    0    0 01:00:07            1        2
10.0.0.9        4      65200       956       955        0    0    0 00:47:33            1        2

Total number of neighbors 5
#


Cumulus Linux側のBGPテーブルの内容を確認。
こちらも設定内容のとおり、各物理リンクにてBGPピアを張っている事が分かる。

$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.98, local AS number 65200 vrf-id 0
BGP table version 2
RIB entries 3, using 576 bytes of memory
Peers 5, using 106 KiB of memory

Neighbor              V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
jpmtkvmsw99(10.0.0.0) 4      65100      1231      1231        0    0    0 01:01:16            1
jpmtkvmsw99(10.0.0.2) 4      65100      1231      1231        0    0    0 01:01:15            1
jpmtkvmsw99(10.0.0.4) 4      65100      1229      1230        0    0    0 01:01:14            1
jpmtkvmsw99(10.0.0.6) 4      65100      1231      1231        0    0    0 01:01:16            1
jpmtkvmsw99(10.0.0.8) 4      65100       978       979        0    0    0 00:48:42            1

Total number of neighbors 5


show bgp ipv6 unicast summary
=============================
% No BGP neighbors found


show bgp l2vpn evpn summary
===========================
% No BGP neighbors found
$



まとめ
Cumulus Linuxのでは、CiscoやJuniperのスイッチと同様にコマンドによる設定だけで目的を達成する事が出来た。
SONiCでは、開発版に関してはvtyshモードのコマンドによる設定と/etc/sonic/config_db.jsonファイルの編集で目的を達成する事が出来たが、製品版では/etc/sonic/config_db.jsonファイルを直接編集する必要は無いようだ。(下記リンク先を参照)



参照先など
開発者および先達の皆さまに感謝。
https://azure.github.io/SONiC/ SONiC
https://github.com/Azure/SONiC/wiki/Configuration SONiC Configuration
https://cumulusnetworks.com/ Cumulus Linux
https://docs.cumulusnetworks.com/knowledge-base/ Cumulus Networks Knowledge Base
https://debslink.hatenadiary.jp/entry/20210131/1612091391 SONiCを少しかじってみた
https://debslink.hatenadiary.jp/entry/20210214/1613279732 SONiCのWarm Bootの動作確認

https://support.edge-core.com/hc/en-us/articles/900000789566-BGP-Step-1-Establish-BGP-Session 製品版SONiCのBGP設定例(Edgecore Networks社)
https://support.edge-core.com/hc/en-us/articles/900003896906-Enterprise-SONiC-Distribution-by-Edgecore 製品版SONiCのダウンロードページ(Edgecore Networks社)

今更ながらHP2133にCentOS7をインストール

HP2133の延命措置の為の備忘録。

元々はFreeBSDが入っていたがCentOSに変えた経緯は以下のとおり。
・久々にHP2133の電源を入れたらFreeBSDが起動しなかった。
・修復を試みようとUSBメモリのブートを試みたものの、USBブート失敗。
・再インストールを試みようと前回インストール時に使用したFreeBSDのイメージを書き込んだUSBメモリを使用するも、USBブート失敗。
・他にUbuntuとDebianのUSBブートを試みたがどれも失敗、しかしCentOS7のUSBブートは何故か成功した為、CentOS7をインストールし家庭内FTPサーバとしてそのまま使い続ける事に。

2008年に販売されたネットブック(と当時は呼ばれていた)HP2133、何か使い道は無いかという事でCentOSを入れてみた。
FreeBSDはUSBブートがことごとく失敗、しかも前回インストール時に使用したUSBメモリ(中身は当時のまま)でさえブート出来なかった為、今回は選択肢から外した。

HP2133はHWの仕様上32bit版OSしかインストール出来ない。
公式には32bit版のCentOS7は公開されていないが、有志の方々によって作られた32bit版CentOS7が公開されている為、それを使用。
32bit版CentOSのEPELは2021年2月末の段階では既に削除されている。

タッチパッド横のクリックボタンは茶色に変色していた。
部品取りの為に中古機器を購入し交換しようと考えている。



当方の環境
HP2133 スタンダードモデル
・RAM:2GB (PC2-5300 DDR2-SDRAM)
・HDD:SATA 160GB
・CPU:VIA C7-M ULV 1.2GHz
・モニター:WXGA (1280×768)
・VRAM:128MB
・WLAN:IEEE802.11bとIEEE802.11g (USBのWLANアダプタが必要)
・LAN:10/100/1000Mbps RJ45ポート x1
※CPUは通常時は800MHzで動作するが、高負荷時は1.2GHzで動作する。
※HP2133のスタンダードモデルのRAM容量は1GBだが、自分で2GBに換装した。
※HP2133のスタンダードモデルのHDD容量は120GBだが、元の持ち主が160GBのHDDに換装した模様。



CentOSのインストール

以下よりCentOS-7-i386-Minimal-2009.isoファイルをダウンロード。
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7.9.2009/isos/i386/

ダウンロードした.isoファイルはRufusを使用しUSBメモリに書き込ませ、CentOS7のインストールUSBメモリを作成。
https://rufus.ie/

上記で作成したCentOS7のブートUSBメモリをHP2133に挿し、電源投入。
HPのロゴがモニタに表示されたらF10キーを叩きBIOSの設定画面を表示させ、USBメモリーから起動するよう設定。
設定完了後再起動し、CentOSのインストールが開始される。
インストールの手順はGoogleで検索すると幾つもヒットする為、ここでは割愛。



インストール後にやったこと

1.コンソール画面の解像度の変更
CentOSのboot時に出力される文字が大きすぎる為、grubの設定を修正。

$ sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX=の行にvga=773を追加。
boot時のログを画面に出力させるよう、rhgb quietを削除。
GRUB_CMDLINE_LINUX=の行は以下のようになった。

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap vga=773"

以下のコマンドを実行し、設定内容をgrub.cfgに反映させる。

$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg


2.wlanのドライバのインストール
以下のリンク先に先人の方々による手順がまとめられてある。ドライバを認識させるまでの手順が長く心が折れそうになったが、10年以上も昔にWindows版のドライバを流用して認識させた事があった事を思い出し、ndiswrapperコマンドでWindows版のドライバを認識させる方法でサクッと進めた。
https://wiki.centos.org/HowTos/Laptops/Wireless/Broadcom?action=show Broadcom Corporation BCM4311, BCM4312, BCM4313, BCM4321, BCM4322, BCM43224, BCM43225, BCM43227 and BCM43228 Based Wireless NICs
http://blog.livedoor.jp/oshibat/archives/1003276802.html Installing CentOS 6.5 on HP 2133 (Broadcom 43xx Wi-Fi)


WLANのアダプタは以下を使用。コネクタ部分を含め、指先より少し大きい程度。紛失注意。
https://www.amazon.co.jp/dp/B00JTSF7DY/


2-1.ndiswrapper-1.63.tar.gzとbcmwl5a.infファイルとbcmwl5.sysを入手。
NdisWrapperのダウンロードサイトからNdisWrapperのtar玉をダウンロード。
自分の場合、ndiswrapper-1.63.tar.gzをダウンロードしCentOSのホームディレクトリに保存。
ドライバのファイルはWindowsのものを流用。ダウンロードしたbcmwl5a.infファイルとbcmwl5.sysファイルはCentOSのホームディレクトリに保存。

https://sourceforge.net/projects/ndiswrapper/files/stable/
http://biginoz.free.fr/linux/bcmwl5a.inf
http://biginoz.free.fr/linux/bcmwl5.sys


2-2.NdisWrapperのtar玉を展開。

$ tar zxf ndiswrapper-1.63.tar.gz


2-3.展開時に生成されたndiswrapper-1.63ディレクトリに移動し、makeコマンドとmake installコマンドを実行。
CentOS7のminimalインストールの場合、開発用のライブラリファイル(libxxxx-dev)がインストールされていない為、別途インストール。
その後にNdisWrapperのインストールを開始する。

$ sudo yum groupinstall "Development Tools"

$ cd ndiswrapper-1.63
$ make
$ su
# make install

make実行時に出力されるエラーの対処について。
自分の環境では、以下のようなログを吐いてmakeが停止。

/home/hechtia/ndiswrapper-1.63/driver/ntoskernel.h:364:20: error: redefinition of 'reinit_completion'
 static inline void reinit_completion(struct completion *x)

上記の場合、ファイル/home/hechtia/ndiswrapper-1.63/driver/ntoskernel.hを開き、364行目あたりの「reinit_completion」のifからendifの間を削除しエラーを回避した。
コメントアウトだけでは同じ場所でエラーを吐き先に進まなかった。

#if LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0)
この間の内容を削除
#endif

2-4.infファイルとNdisWrapperのカーネルモジュールの読み込み。
ndiswrapper -lコマンドを叩き、driver installedと出力されたら成功。

# cd ..
# ndiswrapper -i bcmwl5a.inf
Installing bcmwl5a
# ndiswrapper -l
bcmwl5a : driver installed
# modprobe ndiswrapper

2-5.ここまで来れば、後はnmtuiで以下の設定を済ませるとWLANに接続が出来るようになる。
・wlanインタフェースを作成。
・SSIDとパスワードの設定。
・作成したwlanインタフェースのアクティベート。



3.GNOMEは重過ぎにつき、yum groupinstallでX Window Systemを入れてMWMを導入。
sudo yum groupinstall "GNOME Desktop"でGNOMEを導入したところ、startxを打ってGNOME上のツールが完全に使用可能になるまで3分程度要した。
その後も動作が重かった為にyum groupremove "GNOME Desktop"でGNOMEを削除。
軽量なWindow Managerの導入を試み、yum groupinstall "X Window System"を実行しX Window Systemのみインストール。
mwmのインストール手順は以下を参照。

https://www.riscascape.net/archives/22065 RHEL7/CentOS7に後からX Window Systemを追加するには


以下は/etc/X11/xorg.confの修正箇所。
Section "Device"内のDriverをvesaに修正。
Section "Screen"内のSubSection "Display"のModesを1280x768に修正。

Section "Device"
:
省略
:
	Identifier  "Card0"
	Driver      "vesa"
	BusID       "PCI:1:0:0"
EndSection

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	Monitor    "Monitor0"
:
省略
:
	SubSection "Display"
		Viewport   0 0
		Depth     24
		Modes     "1280x768"
	EndSubSection
EndSection


以下はインストールしたツール。
mwmとSeamonkyとconky以外はX環境でなくても使用可能。
・mwm:Motif Window Manager。Motifベースのウィンドウマネージャ。
・vsftpd:家庭用FTPサーバとして運用する為にインストール。
・tmux:ターミナルマルチプレクサ(Terminal Multiplexer)。 1枚のxterm内でを複数のセッション、ウィンドウ、ペインに分割し利用。
・Seamonky:Mozilla系の軽量Webブラウザ。
・Clam AntiVirus:オープンソースのアンチウイルスツール。
・tripwire:改ざん検知ツール。
・conky:X11用のリソースモニタ。


上記のツールの内、yum installでインストール出来た物はvsftpdとtmuxのみ。
conky:RHEL6の.rpmファイルを使用。
Clam AntiVirusとtripwire:公式サイトからtar玉ダウンロードしコンパイルとインストール。
Seamonky:公式サイトからtar玉をダウンロードし、展開後に生成されたseamonkyコマンドを実行しSeamonkyを起動。


4.上記3.の各ツールをインストールし終えたところで準備完了。
この後実施した内容。
・firewalldの設定。vfpの穴開け。
・Clam AntiVirusとtripwireの設定。
・mwmのカスタマイズ。
・CentOSのパーネルパラメータのチューニング。



以下の画像は、HP2133で動作するCentOS 7のスクリーンショット。
Window Managerはmwm。立ち上がっているツールはxeyesとxtermとconky。


インストールした各ツールのリンク先
https://security.appspot.com/vsftpd.html vsftpd
https://github.com/tmux/tmux tmux
https://www.seamonkey-project.org/ Seamonky
https://www.clamav.net/ Clam AntiVirus
https://www.tripwire.com/ tripwire
https://github.com/brndnmtthws/conky Conky
http://ftp.riken.jp/Linux/dag/redhat/el6/en/i386/rpmforge/RPMS/conky-1.6.1-1.el6.rf.i686.rpm



HP2133について
https://jp.ext.hp.com/lib/doc/catalog/notebook/jpt08347_04.pdf HI2133のスペック
https://ascii.jp/elem/000/000/138/138438/ 挑戦的モバイル、HP 2133の実力はいかに?(ASCII.jpの記事)
https://debslink.hatenadiary.jp/entry/20160501/1462113024 十数年ぶりにFreeBSD



viエディタに関する衝撃的な出来事
20年近くもの間、viエディタの設定ファイルは~/.exrcだと認識していたが、CentOS7では~/.vimrcであった。
まだvimはインストールしていないが、/etcディレクトリ内にvimrcは存在していた。
CentOSのインストール直後から.exrcに書いた設定内容が反映されていない事に何となく気付いており、Googleで「CentOS vi 設定」で検索したら以下に記事がヒット。記事の内容によると.vimrcだという。ホームディレクトリに有る設定ファイルのファイル名.exrcを.vimrcに変更したら、設定内容が反映された形でviで編集出来るようになった。

https://www.atmarkit.co.jp/ait/articles/1712/13/news009_2.html Linuxの定番テキストエディタ「vi」をマスターしよう(2)検索/オプション活用編

SONiCのWarm Bootの動作確認

前回の「SONiCを少しかじってみた」ではSONiCをVirtualBoxにデプロイし、Cumulus VXとの間でBGPを張らせた。
そして今回はSONiCに実装されているWarm Boot機能の動作確認をし、SONiCの再起動(Cold Boot)と通信断の時間を比較してみた。


SONiCではWarm Bootはバージョン201811にて実装された。
Warm Boot機能により、SONiC内部のデータプレーンに影響を与えることなく、SONiCソフトウェアを再起動させる事になっている。
Warm BootはJuniperやCiscoのデバイスでも実行可能である。
Warm Bootの利点。電源投入後のOS起動のように機器内部のフラッシュメモリからイメージをコピーして解凍する必要がない為、通常運用の状態になるまでの時間が短縮される。
SONiCにおけるWarm Bootの目的は、データプレーンに影響を与える事無く、SONiCソフトウェアや個々のプロセスやSONiC内部のDockerコンテナを再起動およびアップグレードが出来るようにする事である。


SONiCにおけるWarm Bootの挙動は、大まかに以下のような流れである。
1.Warm BootスクリプトはApp DBとASIC DBをディスクに保存。
2.Redisは再起動後にApp DBと ASIC DBを復元。
3.OA(Orchestration Agent)はApp DBを読み取り、新しいASIC DBをコンパイルする。
4.Sync DBは新旧のASIC DBを比較し、ASICに比較内容を適用する。
5.アプリケーションが並行してウェイクアップする。
 ・App DBに段階的な変更を加える可能性有り。
 ・OAは通常どおりに着信し、ASIC DBを更新する。
 ・Sync DBはASIC DBをハードウェアに同期し続ける。


SONiCの内部で動作するDockerコンテナやデータベース等に関しては、下記のリンク先(SONiC System Architecture)を参照。
SONiCのWarm Boot時の挙動に関しては、下記のリンク先(SONiC – Reliability,Manageability and Extensibility)を参照。
SONiCで言うコンテナ/Dockerコンテナとは、「SONiCのDockerコンテナ」ではなく「SONiCの内部で動作する各機能のDockerコンテナ」を指す。



今回はSONiCのWarm Bootの検証として、SONiCの内部で動作しているBGPのDockerコンテナをコマンドで再起動させ、Cold Boot時より通信断の時間が短い事を確認。
BGPコンテナの再起動中は数秒程度の通信断という想定だが、果たして結果は?
尚、ここで言うBGPコンテナとはSONiCにQuaggaまたはFRRを提供するコンテナを指す。 コンテナの名称は使用されているルーティングプロトコル(BGP)にちなんで付けられているが、実際はBGPだけでなくOSPFやIS-ISも実行可能である。



当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
Oracle Virtualbox:6.1.18
ゲストOS 1:Cumulus VX 4.2.1 (Leaf)
ゲストOS 2:Cumulus VX 4.2.1 (Leaf)
ゲストOS 3:SONiC.202012.18-0c178399 (Spine)



構成図
IP Clos(っぽい)構成は本来であればLeafとSpineとの間の物理リンクは1本づつである。



各機器の設定内容
Spineスイッチ(jpmtkvmsw98)のConfigは以下のとおり。
BGPの設定のみ抜粋。

admin@jpmtkvmsw98:~$ show runningconfig all
{
    "BGP_NEIGHBOR": {
        "10.0.0.1": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.0",
            "name": "CUMULUS-VX-99-PATH1",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.11": {
            "admin_status": "up",
            "asn": "65097",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.10",
            "name": "CUMULUS-VX-97-PATH3",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.3": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.2",
            "name": "CUMULUS-VX-99-PATH2",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.5": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.4",
            "name": "CUMULUS-VX-99-PATH3",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.7": {
            "admin_status": "up",
            "asn": "65097",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.6",
            "name": "CUMULUS-VX-97-PATH1",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.9": {
            "admin_status": "up",
            "asn": "65097",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.8",
            "name": "CUMULUS-VX-97-PATH2",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.1.1.97": {
            "admin_status": "up",
            "asn": "65097",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.1.1.97",
            "name": "CUMULUS-VX-97-LO",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.1.1.99": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.1.1.98",
            "name": "CUMULUS-VX-99-LO",
            "nhopself": "0",
            "rrclient": "0"
        }
    },
:
省略
:
    },
    "DEVICE_METADATA": {
        "localhost": {
            "bgp_asn": "65098",
            "buffer_model": "traditional",
            "default_bgp_status": "up",
            "default_pfcwd_status": "disable",
            "hostname": "jpmtkvmsw98",
            "hwsku": "Force10-S6000",
            "mac": "52:54:00:12:34:56",
            "platform": "x86_64-kvm_x86_64-r0",
            "type": "LeafRouter"
        }
    },
    "FEATURE": {
        "bgp": {
            "auto_restart": "enabled",
            "has_global_scope": "False",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
:
    "PORT": {
        "Ethernet0": {
            "admin_status": "up",
            "alias": "fortyGigE0/0",
            "index": "0",
            "lanes": "25,26,27,28",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet4": {
            "admin_status": "up",
            "alias": "fortyGigE0/4",
            "index": "1",
            "lanes": "29,30,31,32",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet8": {
            "admin_status": "up",
            "alias": "fortyGigE0/8",
            "index": "2",
            "lanes": "33,34,35,36",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet12": {
            "admin_status": "up",
            "alias": "fortyGigE0/12",
            "index": "3",
            "lanes": "37,38,39,40",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet16": {
            "admin_status": "up",
            "alias": "fortyGigE0/16",
            "index": "4",
            "lanes": "45,46,47,48",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet20": {
            "admin_status": "up",
            "alias": "fortyGigE0/20",
            "index": "5",
            "lanes": "41,42,43,44",
            "mtu": "9100",
            "speed": "40000"
        },
:

Leafスイッチ(jpmtkvmsw99)のConfigは以下のとおり。
BGPおよびインタフェースの設定を抜粋。

cumulus@jpmtkvmsw99:mgmt:~$ net show configuration
:
省略
:
router bgp 65099
  bgp router-id 10.1.1.99
  bgp bestpath as-path multipath-relax
  timers bgp 60 180
  neighbor 10.0.0.0 remote-as 65098
  neighbor 10.0.0.2 remote-as 65098
  neighbor 10.0.0.4 remote-as 65098
  neighbor 10.1.1.98 remote-as 65098

  address-family ipv4 unicast
    network 10.1.1.99/32
    network 192.168.99.0/24

line vty

interface lo
  # The primary network interface
  address 10.1.1.99/32

interface eth0
  address 192.168.3.250/24
  vrf mgmt

interface swp1
  address 10.0.0.1/31
  alias DEV=jpmtkvmsw98 IF=Eth0
  mtu 9100

interface swp2
  address 10.0.0.3/31
  alias DEV=jpmtkvmsw98 IF=Eth4
  mtu 9100

interface swp3
  address 10.0.0.5/31
  alias DEV=jpmtkvmsw98 IF=Eth8
  mtu 9100

interface swp4
  address 192.168.99.1/24
  alias LAN_Segment

interface mgmt
  address 127.0.0.1/8
  address ::1/128
  vrf-table auto
:

Leafスイッチ(jpmtkvmsw97)のConfigは以下のとおり。
BGPおよびインタフェースの設定を抜粋。

cumulus@jpmtkvmsw97:mgmt:~$ net show config
:
省略
:
router bgp 65097
  bgp router-id 10.1.1.97
  bgp bestpath as-path multipath-relax
  timers bgp 60 180
  neighbor 10.0.0.6 remote-as 65098
  neighbor 10.0.0.8 remote-as 65098
  neighbor 10.0.0.10 remote-as 65098
  neighbor 10.1.1.98 remote-as 65098

  address-family ipv4 unicast
    network 10.1.1.97/32
    network 192.168.97.0/24

line vty

interface lo
  address 10.1.1.97/32
  # The primary network interface

interface eth0
  address 192.168.3.249/24
  vrf mgmt

interface swp1
  address 10.0.0.7/31
  alias DEV=jpmtkvmsw98 IF=eth12
  mtu 9100

interface swp2
  address 10.0.0.9/31
  alias DEV=jpmtkvmsw98 IF=eth16
  mtu 9100

interface swp3
  address 10.0.0.11/31
  alias DEV=jpmtkvmsw98 IF=eth20
  mtu 9100

interface swp4
  address 192.168.97.1/24
  alias LAN_Segment

interface mgmt
  address 127.0.0.1/8
  address ::1/128
  alias UNUSED
  vrf-table auto
:

確認方法
上記の構成図中で言うと、jpmtkvmsw99からjpmtkvmsw98経由でjpmtkvmsw97にPingを実行。
その間にBGPコンテナを再起動させ、Pingの断時間を計測。


1.SONiCのBGPテーブルの確認
jpmtkvmsw99からjpmtkvmsw97に対し1秒間隔でPing連射。その間にBGPコンテナ再起動前のBGPテーブルを確認。

cumulus@jpmtkvmsw99:mgmt:~$ ping 10.1.1.97
vrf-wrapper.sh: switching to vrf "default"; use '--no-vrf-switch' to disable
PING 10.1.1.97 (10.1.1.97) 56(84) bytes of data.
64 bytes from 10.1.1.99: icmp_seq=1 ttl=63 time=1.43 ms
64 bytes from 10.1.1.99: icmp_seq=2 ttl=63 time=1.50 ms
64 bytes from 10.1.1.99: icmp_seq=3 ttl=63 time=1.46 ms
64 bytes from 10.1.1.99: icmp_seq=4 ttl=63 time=1.43 ms
64 bytes from 10.1.1.99: icmp_seq=5 ttl=63 time=1.39 ms
:
:

以下はSONiC側のBGPテーブルの内容。
2台のLeafスイッチ(jpmtkvmsw99とjpmtkvmsw97)との間でBGPピアの関係が確立出来ている。

admin@jpmtkvmsw98:~$ show ip bgp summary

IPv4 Unicast Summary:
BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0
BGP table version 7
RIB entries 9, using 1728 bytes of memory
Peers 7, using 152712 KiB of memory
Peer groups 2, using 128 bytes of memory


Neighbhor      V     AS    MsgRcvd    MsgSent    TblVer    InQ    OutQ  Up/Down    State/PfxRcd    NeighborName
-----------  ---  -----  ---------  ---------  --------  -----  ------  ---------  --------------  -------------------
10.0.0.1       4  65099          8          6         0      0       0  00:00:50   2               CUMULUS-VX-99-PATH1
10.0.0.3       4  65099         10          9         0      0       0  00:01:05   2               CUMULUS-VX-99-PATH2
10.0.0.5       4  65099         10          8         0      0       0  00:01:03   2               CUMULUS-VX-99-PATH3
10.0.0.7       4  65097          6          7         0      0       0  00:00:56   2               CUMULUS-VX-97-PATH1
10.0.0.9       4  65097          6          7         0      0       0  00:00:56   2               CUMULUS-VX-97-PATH2
10.0.0.11      4  65097          6          7         0      0       0  00:00:56   2               CUMULUS-VX-97-PATH3
10.1.1.99      4  65099          0          0         0      0       0  never      Active          CUMULUS-VX-99-LO

Total number of neighbors 7
admin@jpmtkvmsw98:~$

以下はCumulus VX側(jpmtkvmsw99)のBGPテーブルの内容。
Spineスイッチ(jpmtkvmsw98)との間でBGPピアの関係が確立出来ている。

cumulus@jpmtkvmsw99:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0
BGP table version 6
RIB entries 9, using 1728 bytes of memory
Peers 4, using 85 KiB of memory

Neighbor              V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
jpmtkvmsw98(10.0.0.0) 4      65098         7         9        0    0    0 00:01:36            3
jpmtkvmsw98(10.0.0.2) 4      65098         9        10        0    0    0 00:01:51            3
jpmtkvmsw98(10.0.0.4) 4      65098         8        10        0    0    0 00:01:49            3
10.1.1.98             4      65098         0         0        0    0    0    never       Active

Total number of neighbors 4

以下はCumulus VX側(jpmtkvmsw97)のBGPテーブルの内容。
Spineスイッチ(jpmtkvmsw98)との間でBGPピアの関係が確立出来ている。

cumulus@jpmtkvmsw97:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.97, local AS number 65097 vrf-id 0
BGP table version 5
RIB entries 9, using 1728 bytes of memory
Peers 4, using 85 KiB of memory

Neighbor               V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
jpmtkvmsw98(10.0.0.6)  4      65098         9         8        0    0    0 00:02:05            3
jpmtkvmsw98(10.0.0.8)  4      65098         9         8        0    0    0 00:02:05            3
jpmtkvmsw98(10.0.0.10) 4      65098         9         8        0    0    0 00:02:04            3
10.1.1.98              4      65098         0         0        0    0    0    never       Active

Total number of neighbors 4

2.SONiC側でsystemctl status bgp.serviceコマンドを打ち、BGPコンテナの状態を確認。
BGPサービスのステータスはactive (running)でBGPコンテナは正常に動作している事が分かる。

admin@jpmtkvmsw98:~$ systemctl status bgp.service
● bgp.service - BGP container
   Loaded: loaded (/lib/systemd/system/bgp.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2021-02-14 13:06:55 JST; 3min 50s ago
 Main PID: 1178 (bgp.sh)
    Tasks: 3 (limit: 2357)
   Memory: 17.6M
   CGroup: /system.slice/bgp.service
           tq1178 /bin/bash /usr/local/bin/bgp.sh wait
           tq1179 /bin/bash /usr/bin/bgp.sh wait
           mq1180 python3 /usr/local/bin/container wait bgp
admin@jpmtkvmsw98:~$

3.そして、systemctl restart bgp.serviceコマンドを打ち、BGPコンテナを再起動させた。
コマンドの実行後20秒前後でプロンプトが返ってくる。
その間もCumulus VXはPingを打ち続けている。

admin@jpmtkvmsw98:~$ sudo systemctl restart bgp.service
admin@jpmtkvmsw98:~$ 


4.通信断発生中の、BGPテーブルの内容
Tera Termをもう1枚立ち上げてSONiCにSSHログイン。そしてBGPテーブルの内容を確認。
BGPコンテナが立ち上がっていない状態では、BGPテーブル等BGPの状態確認のコマンドが叩けないようだ。
systemctl start bgp.serviceコマンドを打ち、手動でBGPを立ち上げる必要が有る。

admin@jpmtkvmsw98:~$ show ip bgp summary
Error response from daemon: Container cda6e6daf09cb1092040979cfc8a0660d1145c5b65229f0dac641132de42ee3b is not running
Usage: show ip bgp summary [OPTIONS]
Try "show ip bgp summary -h" for help.

Error: bgp summary from bgp container not in json format
admin@jpmtkvmsw98:~$

以下はCumulus VX側(jpmtkvmsw99)のBGPテーブルの内容。
ステータスがActiveで止まっている。

cumulus@jpmtkvmsw99:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0
BGP table version 6
RIB entries 9, using 1728 bytes of memory
Peers 4, using 85 KiB of memory

Neighbor              V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
jpmtkvmsw98(10.0.0.0) 4      65098        21        20        0    0    0 00:00:10       Active
jpmtkvmsw98(10.0.0.2) 4      65098        24        22        0    0    0 00:00:10       Active
jpmtkvmsw98(10.0.0.4) 4      65098        23        22        0    0    0 00:00:10       Active
10.1.1.98             4      65098         0         0        0    0    0    never       Active

Total number of neighbors 4

以下はCumulus VX側(jpmtkvmsw97)のBGPテーブルの内容。
こちらも、上のjpmtkvmsw99と同じく、ステータスがActiveで止まっている。

cumulus@jpmtkvmsw97:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.97, local AS number 65097 vrf-id 0
BGP table version 5
RIB entries 9, using 1728 bytes of memory
Peers 4, using 85 KiB of memory

Neighbor               V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
jpmtkvmsw98(10.0.0.6)  4      65098        22        18        0    0    0 00:00:14       Active
jpmtkvmsw98(10.0.0.8)  4      65098        22        18        0    0    0 00:00:14       Active
jpmtkvmsw98(10.0.0.10) 4      65098        22        18        0    0    0 00:00:14       Active
10.1.1.98              4      65098         0         0        0    0    0    never       Active

Total number of neighbors 4

5.Pingが再び通り始めた後、SONiCにてBGPテーブルを確認。
BGPコンテナの再起動前と同じく、2台のLeafスイッチ(jpmtkvmsw99とjpmtkvmsw97)との間でBGPピアの関係が確立出来ている。

admin@jpmtkvmsw98:~$ show ip bgp summary

IPv4 Unicast Summary:
BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0
BGP table version 5
RIB entries 9, using 1728 bytes of memory
Peers 7, using 152712 KiB of memory
Peer groups 2, using 128 bytes of memory


Neighbhor      V     AS    MsgRcvd    MsgSent    TblVer    InQ    OutQ  Up/Down    State/PfxRcd    NeighborName
-----------  ---  -----  ---------  ---------  --------  -----  ------  ---------  --------------  -------------------
10.0.0.1       4  65099          6          9         0      0       0  00:00:18   2               CUMULUS-VX-99-PATH1
10.0.0.3       4  65099          6          9         0      0       0  00:00:18   2               CUMULUS-VX-99-PATH2
10.0.0.5       4  65099          6          9         0      0       0  00:00:18   2               CUMULUS-VX-99-PATH3
10.0.0.7       4  65097          6          9         0      0       0  00:00:18   2               CUMULUS-VX-97-PATH1
10.0.0.9       4  65097          6          9         0      0       0  00:00:18   2               CUMULUS-VX-97-PATH2
10.0.0.11      4  65097          6          9         0      0       0  00:00:18   2               CUMULUS-VX-97-PATH3
10.1.1.99      4  65099          0          0         0      0       0  never      Active          CUMULUS-VX-99-LO

Total number of neighbors 7
admin@jpmtkvmsw98:~$

以下はCumulus VX側(jpmtkvmsw99)のBGPテーブルの内容。
Spineスイッチ(jpmtkvmsw98)との間でBGPピアの関係が確立出来た。

cumulus@jpmtkvmsw99:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0
BGP table version 6
RIB entries 9, using 1728 bytes of memory
Peers 4, using 85 KiB of memory

Neighbor              V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
jpmtkvmsw98(10.0.0.0) 4      65098        30        26        0    0    0 00:00:19            3
jpmtkvmsw98(10.0.0.2) 4      65098        33        28        0    0    0 00:00:19            3
jpmtkvmsw98(10.0.0.4) 4      65098        32        28        0    0    0 00:00:19            3
10.1.1.98             4      65098         0         0        0    0    0    never       Active

Total number of neighbors 4

以下はCumulus VX側(jpmtkvmsw97)のBGPテーブルの内容。
こちらもSpineスイッチ(jpmtkvmsw98)との間でBGPピアの関係が確立出来た。

cumulus@jpmtkvmsw97:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.97, local AS number 65097 vrf-id 0
BGP table version 5
RIB entries 9, using 1728 bytes of memory
Peers 4, using 85 KiB of memory

Neighbor               V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
jpmtkvmsw98(10.0.0.6)  4      65098        31        24        0    0    0 00:00:21            3
jpmtkvmsw98(10.0.0.8)  4      65098        31        24        0    0    0 00:00:21            3
jpmtkvmsw98(10.0.0.10) 4      65098        31        24        0    0    0 00:00:21            3
10.1.1.98              4      65098         0         0        0    0    0    never       Active

Total number of neighbors 4


SONiC側でsystemctl status bgp.serviceコマンドを打ち、BGPコンテナの状態を確認。
BGPコンテナの再起動前と同じく、BGPサービスのステータスはactive (running)でBGPコンテナは正常に動作している事が分かる。

admin@jpmtkvmsw98:~$ systemctl status bgp.service
● bgp.service - BGP container
   Loaded: loaded (/lib/systemd/system/bgp.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2021-02-14 13:15:50 JST; 27s ago
  Process: 4991 ExecStartPre=/usr/local/bin/bgp.sh start (code=exited, status=0/SUCCESS)
 Main PID: 5069 (bgp.sh)
    Tasks: 3 (limit: 2357)
   Memory: 17.6M
   CGroup: /system.slice/bgp.service
           tq5069 /bin/bash /usr/local/bin/bgp.sh wait
           tq5070 /bin/bash /usr/bin/bgp.sh wait
           mq5071 python3 /usr/local/bin/container wait bgp
admin@jpmtkvmsw98:~$

...ちなみに上記の実験を何度も何度も試行すると、以下のログを吐きBGPコンテナが正常に起動しなくなる。
systemctl restart bgp.serviceコマンド確認すると、failのステータス。
自分の環境では5回以降で多発した。

admin@jpmtkvmsw98:~$ sudo systemctl restart bgp.service
Job for bgp.service failed.
See "systemctl status bgp.service" and "journalctl -xe" for details.
admin@jpmtkvmsw98:~$

admin@jpmtkvmsw98:~$ systemctl status bgp.service
● bgp.service - BGP container
   Loaded: loaded (/lib/systemd/system/bgp.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since Sun 2021-02-14 11:26:58 JST; 2min 53s ago
  Process: 4762 ExecStartPre=/usr/local/bin/bgp.sh start (code=exited, status=0/SUCCESS)
  Process: 4832 ExecStart=/usr/local/bin/bgp.sh wait (code=exited, status=0/SUCCESS)
  Process: 5875 ExecStop=/usr/local/bin/bgp.sh stop (code=exited, status=0/SUCCESS)
 Main PID: 4832 (code=exited, status=0/SUCCESS)
admin@jpmtkvmsw98:~$

この段階でBGPピアにてnet show bgp summaryコマンドを叩くと、Activeで止まりBGPピアを張れていない事が分かる。

cumulus@jpmtkvmsw99:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0
BGP table version 8
RIB entries 3, using 576 bytes of memory
Peers 4, using 85 KiB of memory

Neighbor              V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
jpmtkvmsw98(10.0.0.0) 4      65098        41        33        0    0    0 00:06:57       Active
jpmtkvmsw98(10.0.0.2) 4      65098        42        33        0    0    0 00:06:57       Active
jpmtkvmsw98(10.0.0.4) 4      65098        42        33        0    0    0 00:06:57       Active
10.1.1.98             4      65098         0         0        0    0    0    never       Active

Total number of neighbors 4

確認結果
上記の手順を3回試行した結果、3回全てで通信断が発生した。
通信断時間はそれぞれ 22秒、15秒、19秒だった。
あれれ? 思っていたより長い印象だが、NSF(Non Stop Forwarding)ではないからこんなものなのかな。



Cold Boot実行時
最後に、jpmtkvmsw99からjpmtkvmsw97に対し1秒間隔でPing連射しながら、SONiCにてsudo rebootコマンドを打ち、SONiCを再起動させてみた。
こちらも3回実行した。通信断の発生時間は147秒、156秒、142秒といった感じで2分30秒前後も発生した。
確かに、SONiCの再起動時と比較するとBGPコンテナの再起動時の方が断時間は圧倒的に短い。




参照先など
開発者および先達の皆さまに感謝。
https://azure.github.io/SONiC/ SONiC
https://github.com/Azure/SONiC/wiki/Configuration SONiC Configuration
https://cumulusnetworks.com/ Cumulus Linux
https://github.com/Azure/SONiC/blob/master/doc/warm-reboot/swss_warm_restart.md
https://github.com/Azure/SONiC/blob/master/doc/warm-reboot/SONiC_Warmboot.md
https://github.com/Azure/SONiC/wiki/Architecture SONiC System Architecture
https://www.youtube.com/watch?v=TjD7PEB3jvg SONiC – Reliability,Manageability and Extensibility

https://debslink.hatenadiary.jp/entry/20210131/1612091391 SONiCを少しかじってみた
https://debslink.hatenadiary.jp/entry/20201206/1607231451 Virtualbox + Cumulus VXでIP Clos構成を組んでみた

SONiCを少しかじってみた

昨年6月以来の「かじってみた」シリーズ、今回はホワイトボックススイッチのNOSであるSONiCをVirtualBoxにデプロイしてみた。
そして、同じくホワイトボックススイッチのNOSとして導入が進んでいるCumulus Linuxの仮想アプライアンス版、Cumulus VXとの間でBGPピアを張らせてみた。

SONiC(Software for Open Networking in the Cloud)とは、マイクロソフト社がオープンソースで公開しているホワイトボックススイッチ用のNOS(Network OS)。
他のホワイトボックススイッチ用NOSと同様に、Linuxをベースとしている。
SONiCの中で動作している主要なサービスは、SONiC内のdockerコンテナの中で動作しているという特徴が有る。
Googleで検索する際、SONiCだけで検索すると結果はセガの某キャラクターで埋められるが、SONiC NOSやSONiC Microsoft等で検索すると当記事で扱うSONiCが沢山出てくるようになる。
マイクロソフトだけでなく、アリスタやブロードコム等のネットワーク機器ベンダも開発に協力し、OSSのホワイトボックススイッチ用NOSの中で最も開発が活発である。今回はCumulus Linuxの他にOSSのホワイトボックススイッチ用のNOSにも触れてみようという事で、QiitaのAdvent Calendarの記事やSpeaker Deakに掲載されている資料をチラチラ見ながらSONiCをがじってみた。



当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
Oracle Virtualbox:6.1.18
ゲストOS 1:Cumulus VX 4.2.1
ゲストOS 2:SONiC.master.629-10436783



構成
SONiCはデプロイ完了の時点で、IPアドレスやBGP等の設定が既に入っていた状態だった。
既存の設定内容を大幅に修正したら外部だけでなく他のゲストOSとの通信も出来なくなった為、SONiC側は変更箇所は最低限に済ませた。
Cumulus VX側はSONiCの設定に合わせるような内容でIPアドレスをアサイン。


SONiCの導入および設定
1.SONiCのデプロイ
まずはSONiCの仮想アプライアンス版をダウンロード。
https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-image-202012/lastSuccessfulBuild/artifact/target/sonic-vs.img.gz
本来であればsonic-vs.imgを使用するのだが、自分の環境ではsonic.xmlの内容の読み込みが出来なく正常にデプロイが完了しなかった為、以下のイメージファイルを使用した。ただし、VirtualBoxでは.vhdxファイルのデプロイは出来ない為、NHCというツールでvhdx形式からvdi(VirtualBox dynamically expanding)形式に変換。
https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-image-pr/lastSuccessfulBuild/artifact/target/sonic-vs.vhdx
https://euee.web.fc2.com/tool/nhc.html#nhc

※2021/2/2追記
.imgファイルもNHCで.vdiファイルに変換出来た。よって.vhdxファイルをわざわざ探す必要は無い。


その後、VirtualBoxからUUIDが無いよと怒られてデプロイ出来なかった為、DOS窓にて以下のコマンドを打ち、生成した.vdiファイルにUUIDを付与。

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands sethduuid "C:\Users\User\VirtualBox VMs\sonic-vm\sonic-vs.vdi"

.vdiファイルの準備が出来、これでようやくVirtualBoxにデプロイが可能となった。


2.VirtualBoxの設定
Hard Diskの設定にて、Use an existing virtual hard disk fileを選択し上記にて生成した.vdiファイルを選択。

[General]
Operating System:Other Linux (64-bit)

[System]
Base Memory:2048MB
Processors:1
Boot Order:Hard Disk
Acceleration:VT-x/AMD-V, Nested Paging, PAE/NX, KVM Paravirtualization

[Display]
Video Memory:16MB
Graphics Controller:VMSVGA
Remote Desktop Server:Disabled
Recording:Disabled

[Storage]
Controller:IDE
IDE Primary Master:sonic-vm.vdi

[Audio]
Disabled

[Network]
Adapter 1:Paravirtualized Network (Bridged Adapter, Broadcom 4313 802.1b/g/n)
Adapter 2:Paravirtualized Network (Internal Network, 'intnet')
Adapter 3:Paravirtualized Network (Internal Network, 'intnet')
Adapter 4:Paravirtualized Network (Internal Network, 'intnet')


3.デプロイ開始
起動中、以下のようなログが1出力されるが今回は無視してそのまま進める。

systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:18: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:19: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:20: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:21: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:22: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:23: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:24: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:25: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:27: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:29: Invalid GROUP operation


起動が完了したら、ログインIDとパスワードを入力しSONiCにログイン。出力内容から解るように、SONiCはDebian GNU/Linuxがベースとなっている。
ログインIDはadmin、パスワードはYourPaSsWoRd
パスワードの変更やユーザの追加は、DebianやUbuntuと同じくbashのコマンドで実行可能。

Debian GNU/Linux 10 sonic tty1

sonic login:

sshログインが出来るよう、以下のコマンドを投入し設定内容を保存。

sudo config interface ip add eth0 192.168.3.254/24 192.168.3.1
sudo config save


4.BGPの設定
Cumulus VXに倣いBGP unnumberedでBGPのピアを張りたかったのだが、下記リンク先のロードマップによると、BGP unnumberedは今年の6月末にリリースされるバージョン(SONiC.202106)にて実装されるようだ。
よって、今回はeBGPの基本的な設定を投入した。
https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning
https://debslink.hatenadiary.jp/entry/20201206/1607231451


インタフェースのIPアドレスは、SONiCにて既存の設定に合わせる形で/31のサブネットで設定。

SONiC側の設定は以下のとおり。/etc/sonic/config_db.jsonファイルを直接編集する方法と、vtyshモードでCisco IOSのコマンドとほぼ同じコマンドを打つ方法の2つが有る。
BGPのネイバのアドレス、AS番号、自側のアドレス、name欄(Ciscoで言うdescription)を修正。
設定内容の保存後、show runningconfig allコマンドを叩くと以下のように出力される。
/etc/sonic/config_db.jsonファイルから拾っているようだ。

{
    "BGP_NEIGHBOR": {
        "10.0.0.1": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.0",
            "name": "CUMULUS-VX-PATH1",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.3": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.2",
            "name": "CUMULUS-VX-PATH2",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.5": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.4",
            "name": "CUMULUS-VX-PATH3",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.7": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.6",
            "name": "CUMULUS-VX-PATH4",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.1.1.99": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.1.1.98",
            "name": "CUMULUS-VX-LO",
            "nhopself": "0",
            "rrclient": "0"
        }
    },
:
:
    },
    "DEVICE_METADATA": {
        "localhost": {
            "bgp_asn": "65098",
            "buffer_model": "traditional",
            "default_bgp_status": "up",
            "default_pfcwd_status": "disable",
            "hostname": "jpmtkvmsw98",
            "hwsku": "Force10-S6000",
            "mac": "52:54:00:12:34:56",
            "platform": "x86_64-kvm_x86_64-r0",
            "type": "LeafRouter"
        }
    "FEATURE": {
        "bgp": {
            "auto_restart": "enabled",
            "has_global_scope": "False",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
:

vtyshモードにてshow running-configコマンドを叩くと以下のように出力される。
ルータIDとネイバのIPアドレスとdescriptionを変更し、ネイバの数を減らしている。ルートマップの設定は残してある。

router bgp 65098
 bgp router-id 10.1.1.98
 bgp log-neighbor-changes
 no bgp ebgp-requires-policy
 no bgp default ipv4-unicast
 bgp graceful-restart restart-time 240
 bgp graceful-restart
 bgp graceful-restart preserve-fw-state
 bgp bestpath as-path multipath-relax
 neighbor PEER_V4 peer-group
 neighbor PEER_V6 peer-group
 neighbor 10.0.0.1 remote-as 65099
 neighbor 10.0.0.1 peer-group PEER_V4
 neighbor 10.0.0.1 description CUMULUS-VX-PATH1
 neighbor 10.0.0.3 remote-as 65099
 neighbor 10.0.0.3 peer-group PEER_V4
 neighbor 10.0.0.3 description CUMULUS-VX-PATH2
 neighbor 10.0.0.5 remote-as 65099
 neighbor 10.0.0.5 peer-group PEER_V4
 neighbor 10.0.0.5 description CUMULUS-VX-PATH3
 neighbor 10.0.0.7 remote-as 65099
 neighbor 10.0.0.7 peer-group PEER_V4
 neighbor 10.0.0.7 description CUMULUS-VX-PATH4
 neighbor 10.1.1.99 remote-as 65099
 neighbor 10.1.1.99 peer-group PEER_V4
 neighbor 10.1.1.99 description CUMULUS-VX-LO
 !
 address-family ipv4 unicast
  network 10.1.1.98/32
  neighbor PEER_V4 soft-reconfiguration inbound
  neighbor PEER_V4 route-map FROM_BGP_PEER_V4 in
  neighbor PEER_V4 route-map TO_BGP_PEER_V4 out
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.3 activate
  neighbor 10.0.0.5 activate
  neighbor 10.0.0.7 activate
  neighbor 10.1.1.99 activate
  maximum-paths 64
 exit-address-family
 !


Cumulus VX側の設定は以下のとおり。
Cumulus VX側もSONiCに倣い、インタフェースのIPアドレスは/31のサブネットマスクで設定。

router bgp 65099
  bgp router-id 10.1.1.99
  bgp bestpath as-path multipath-relax
  timers bgp 60 180
  neighbor 10.0.0.0 remote-as 65098
  neighbor 10.0.0.2 remote-as 65098
  neighbor 10.0.0.4 remote-as 65098
  neighbor 10.0.0.6 remote-as 65098
  neighbor 10.1.1.98 remote-as 65098

  address-family ipv4 unicast
    network 10.1.1.99/32
    network 192.168.99.0/24

BGPの確認
設定を終えたところで、BGPのステータスの確認。
SONiC側は以下のとおり。
show ip bgp summaryコマンドを叩いてBGPテーブルの確認だが、通常のモードでもvtyshモードでもどちらでも実行可能。
設定直後はBGPピアを張れなかったが、VirtualBoxのNetwork設定欄内の 'intnet'の文字列を適当な文字列に変更した後、'intnet'に戻したらBGPピアを張る事が出来た。
BGPピアは張ったもののネットワークアドレスがアドバタイズされていない。SONiC同士やCumulus VX同士だとアドバタイズされるのだが、どうした事か。

jpmtkvmsw98# show ip bgp summary 

IPv4 Unicast Summary:
BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0
BGP table version 1
RIB entries 3, using 576 bytes of memory
Peers 5, using 128 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
10.0.0.1        4      65099         0         3        0    0    0    never       Active        0
10.0.0.3        4      65099         0         7        0    0    0    never       Active        0
10.0.0.5        4      65099        53        52        0    0    0 00:19:38     (Policy) (Policy)
10.0.0.7        4      65099        33        35        0    0    0 00:19:43     (Policy) (Policy)
10.1.1.99       4      65099         0         0        0    0    0    never       Active        0

Total number of neighbors 5
jpmtkvmsw98# 


show bgp summaryコマンド上ではBGPピアは張れているが、念の為プロセスレベルで確認してみる。
vtyshモードから抜けて、show serviceコマンドを叩いてBGPサービスが動作している事を確認。
BGPコンテナとその中のプロセスが出力され、BGPは動作している事が分かる。

jpmtkvmsw98# exit
admin@jpmtkvmsw98:~$
admin@jpmtkvmsw98:~$ show services
:
:
bgp     docker
---------------------------
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.9  32268 20308 pts/0    Ss+  11:42   0:01 /usr/bin/python3 /usr/local/bin/supervisord
root        19  0.0  0.7  27632 15608 pts/0    S    11:42   0:00 python3 /usr/bin/supervisor-proc-exit-listener --container-name bgp
root        22  0.0  0.0 225856  2016 pts/0    Sl   11:42   0:00 /usr/sbin/rsyslogd -n -iNONE
frr         26  0.0  0.5 677812 11476 pts/0    Sl   11:42   0:00 /usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M fpm -M snmp
frr         27  0.0  0.2  43884  4468 pts/0    S    11:42   0:00 /usr/lib/frr/staticd -A 127.0.0.1
frr         28  0.0  0.6 297708 14004 pts/0    Sl   11:42   0:01 /usr/lib/frr/bgpd 127.0.0.1 -M snmp
root        37  0.0  0.9  39876 18772 pts/0    S    11:42   0:00 /usr/bin/python3 /usr/local/bin/bgpcfgd
root        38  0.0  0.6  21912 12576 pts/0    S    11:42   0:00 /usr/bin/python3 /usr/local/bin/bgpmon
root        39  0.0  0.1  82128  2916 pts/0    Sl   11:42   0:00 fpmsyncd
:
admin@jpmtkvmsw98:~$


また、systemctl status bgp.serviceコマンドを叩いたところ、bgp.serviceはLoadedでactive(running)である事から、正常に動作しているっぽい。

admin@jpmtkvmsw98:~$ systemctl status bgp.service
● bgp.service - BGP container
   Loaded: loaded (/lib/systemd/system/bgp.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-01-31 2:42:39 UTC; 27min ago
  Process: 1144 ExecStartPre=/usr/local/bin/bgp.sh start (code=exited, status=0/SUCCESS)
 Main PID: 1591 (bgp.sh)
    Tasks: 3 (limit: 2357)
   Memory: 17.9M
   CGroup: /system.slice/bgp.service
           tq1591 /bin/bash /usr/local/bin/bgp.sh wait
           tq1592 /bin/bash /usr/bin/bgp.sh wait
           mq1593 python3 /usr/local/bin/container wait bgp
admin@jpmtkvmsw98:~$


BGP のプロセス自体は正常に動作している事は分かったが、ネイバからネットワークアドレスがアドバタイズされない点は気になる。以下のコマンドを打ちBGPのプロセスを再起動させてみた。

admin@jpmtkvmsw98:~$ sudo config bgp shutdown all
Shutting down BGP session with neighbor 10.0.0.1...
Shutting down BGP session with neighbor 10.0.0.3....
Shutting down BGP session with neighbor 10.0.0.5...
Shutting down BGP session with neighbor 10.0.0.7...
admin@jpmtkvmsw98:~$
admin@jpmtkvmsw98:~$
admin@jpmtkvmsw98:~$
admin@jpmtkvmsw98:~$ sudo config bgp startup all
Starting up BGP session with neighbor 10.0.0.1...
Starting up BGP session with neighbor 10.0.0.3....
Starting up BGP session with neighbor 10.0.0.5...
Starting up BGP session with neighbor 10.0.0.7...
admin@jpmtkvmsw98:~$


show ip bgp summaryのステータスに変化が無かった為、SONiCを再起動。
再起動後のBGPのステータスは状態は以下のとおり。
今度はBGPピアよりネットワークアドレスを受信出来た。

jpmtkvmsw98# show ip bgp summary

IPv4 Unicast Summary:
BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0
BGP table version 3
RIB entries 5, using 960 bytes of memory
Peers 5, using 107 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
10.0.0.1        4      65099         0         2        0    0    0    never       Active        0
10.0.0.3        4      65099         0         0        0    0    0    never       Active        0
10.0.0.5        4      65099         8         8        0    0    0 00:03:01            2        2
10.0.0.7        4      65099         8         8        0    0    0 00:03:01            2        2
10.1.1.99       4      65099         0         0        0    0    0    never       Active        0

Total number of neighbors 5
jpmtkvmsw98#


Cumulus VX側は以下のとおり。
こちらもBGPピアは張れているものの、ネイバからネットワークアドレスがアドバタイズされていなかった。
しかし、SONiCの再起動後はBGPネイバよりネットワークアドレスがアドバタイズされた。

cumulus@jpmtkvmsw99:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0
BGP table version 5
RIB entries 5, using 960 bytes of memory
Peers 5, using 128 KiB of memory

Neighbor              V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
10.0.0.0              4      65098         0         0        0    0    0    never       Active
jpmtkvmsw98(10.0.0.2) 4      65098        41        39        0    0    0 00:03:08            1
jpmtkvmsw98(10.0.0.4) 4      65098        41        39        0    0    0 00:03:08            1
10.0.0.6              4      65098         0         0        0    0    0    never       Active
10.1.1.98             4      65098         0         0        0    0    0    never      Connect

Total number of neighbors 5


show bgp ipv6 unicast summary
=============================
% No BGP neighbors found


show bgp l2vpn evpn summary
===========================
% No BGP neighbors found
cumulus@jpmtkvmsw99:mgmt:~$

今回はここまで。
vtyshモードではCisco IOS のコマンドとほぼ同じなので大きな間違いは無いと思うのだが、github内のドキュメントや海外の導入事例等をもう少し深く読んで、今回投入した設定が本当に正しいか再度確認したい。



問題点など
自分の環境下だけだろうか...
・毎回ではないが、再起動後、sshログインの設定が入っているにも関わらずsshログインが出来ない事が有る。その場合は再度sshログインの設定を投入するとsshログインが可能になる。
・今回は載せていないが、前日に同じ構成にてテストした結果、SONiC側から見たネイバ10.0.0.9およびCumulus VX側から見たネイバ10.0.0.10のステータスはActiveになっているにも関わらず、Up時間がカウントし続ける事が有った。
・PingのReplyが返ってこない、BGPのピアが張れない...等の現象は、大抵はSONiCの再起動で改善された。
・上記の構成にて、SONiCとCumulus VXの起動完了後BGPのピアを張るまでに要する時間がまちまち。起動完了後30秒以内だったり5分前後だったり...



Rocket Turtle(Cumulus Linuxのマスコットキャラクター)「SONiCをのぞく時、SONiCもまたこちらをのぞいているのだ」



参照先など
開発者および先達の皆さまに感謝。
https://azure.github.io/SONiC/ SONiC
https://github.com/Azure/SONiC/wiki/Configuration SONiC Configuration
https://cumulusnetworks.com/ Cumulus Linux
https://qiita.com/advent-calendar/2019/sonic SONiC Advent Calendar 2019
https://qiita.com/advent-calendar/2020/sonic SONiC Advent Calendar 2020
https://speakerdeck.com/imasaruoki Speaker Deckに掲載れているSONiCの資料

https://debslink.hatenadiary.jp/entry/20210214/1613279732 SONiCのWarm Bootの動作確認 (2020/2/14追記)

Catalyst 8000V Edge Software

VirtualBoxのゲストOS、Cisco CSR1000Vの新しいバージョンを導入しようとCisco Systemsのダウンロードサイト内を彷徨っていたら、Catalyst 8000V Edge Softwareに出くわした。昨年12月に発表され今月半ばに提供が開始された、新しい仮想アプライアンスだ。
Catalystスイッチの仮想アプライアンスも製品として出回るようになったのか...くらいにしか思ってなかった為、さっさとCSR1000Vのページに移動しようしたその時、或る異変に気が付いた。
ダウンロードサイトの階層をよくよく見ると「Routers」の中にある。(URLではなく、サイト内上の方に表示されている Downloads Home / Routers / Cloud Edge / Catalyst 8000V Edge Software / IOS XE Software - Bengaluru-17.4.1a(ED)の事)
しかも製品の名称はCatalyst 8000V Switchではなく、Catalyst 8000V Edge Softwareである。
これは一体どういう事なのか、データシートを読んでもしっくりと来なかったが、GoogleでCatalyst 8000Vで検索し、ヒットしたニュースサイトのインタビュー記事を読んだら納得。


https://www.sdxcentral.com/articles/news/cisco-unifies-services-routers-under-catalyst-umbrella/2020/10/ Cisco Unifies Services Routers Under Catalyst Umbrella
https://www.fiercetelecom.com/telecom/cisco-debuts-new-edge-service-routers-under-catalyst-8000-brand Cisco debuts new edge service routers under Catalyst 8000 brand


Catalyst 8000VはCatalyst 8000シリーズスイッチの仮想アプライアンスではなく、CSR1000Vに代わる仮想ルータと捉えて良いようだ。
インタビュー記事やCatalyst 8000Vのデータシートを読むと、CSR1000V+SD-WANアプライアンス、しかもIOS XRvにもかじりついているという印象で、Catalyst 8000Vはスイッチの枠を超えた物であった。
勿論、20年程前に有ったCatalyst 8500シリーズスイッチとは別物だ。


早速、試用してみる。
Catalyst 8000VのisoファイルとInstallation and Configuration GuideのPDFファイルを入手し、Virtualboxにデプロイしてみた。
Virtualboxの設定は、以下のとおり。



当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
ゲストOS:Cisco Catalyst 8000V (c8000v-universalk9.17.04.01a.iso)
Virtualbox 6.1.16 (英語版)



Virtualboxの設定
[General]
Operating System:Other Linux (64-bit)

[System]
Base Memory:4560MB
Processors:1
Boot Order:Hard Disk
Acceleration:VT-x/AMD-V, Nested Paging, PAE/NX, KVM Paravirtualization

[Display]
Video Memory:16MB
Graphics Controller:VMSVGA
Remote Desktop Server:Disabled
Recording:Disabled

[Storage]
Controller:IDE
IDE Primary Master:c8000v-universalk9.17.04.01a.vdi
※デプロイ時はCDROMにc8000v-universalk9.17.04.01a.isoをアサイン

[Audio]
Disabled

[Network]
Adapter 1:Paravirtualized Network (Bridged Adapter, Broadcom 4313 802.1b/g/n)
Adapter 2:Paravirtualized Network (Internal Network, 'intnet01')
Adapter 3:Paravirtualized Network (Internal Network, 'intnet02')
Adapter 4:Paravirtualized Network (Internal Network, 'intnet03')


上記の設定を終えたら、デプロイ開始。
ホスト機のHWスペックが厳しい為か、デプロイ中はFANが回りっぱなしで側面から熱風が吹き出される。
Cisco CSR1000Vとほぼ同じ流れで、デプロイが実行される。

そして対話式のConfigを抜けて、いよいよCatalyst 8000V Edge Softwareのプロンプトとご対面。
出力されたプロンプトは、Switch> ではなく Router> だった。



ぱっと見、CSR1000Vである。
show versionコマンドを全て出し切ると、スループットレベルが10000kbps(10Mbps)である事が分かる。
コマンドをポチポチ打つだけの試用につき、10Mbpsで問題無い。
出力内容の下部に「Router operating mode: Autonomous」の表示が有る。デフォルトではAutonomousモード(IOS-XEモード)で起動する。
SD-WANのvEdgeとして使用するのであれば、AutonomousモードからController-Managedモードに設定変更する必要が有る。

Router#show ver
Cisco IOS XE Software, Version 17.04.01a
Cisco IOS Software [Bengaluru], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 17.4.1a, RELEASE SOFTWARE (fc4)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2020 by Cisco Systems, Inc.
Compiled Fri 18-Dec-20 05:01 by mcpre


Cisco IOS-XE software, Copyright (c) 2005-2020 by cisco Systems, Inc.
All rights reserved.  Certain components of Cisco IOS-XE software are
licensed under the GNU General Public License ("GPL") Version 2.0.  The
software code licensed under GPL Version 2.0 is free software that comes
with ABSOLUTELY NO WARRANTY.  You can redistribute and/or modify such
GPL code under the terms of GPL Version 2.0.  For more details, see the
documentation or "License Notice" file accompanying the IOS-XE software,
or the applicable URL provided on the flyer accompanying the IOS-XE
software.


ROM: IOS-XE ROMMON

Router uptime is 53 minutes
Uptime for this control processor is 55 minutes
System returned to ROM by reload
System image file is "bootflash:packages.conf"
Last reload reason: reload



This product contains cryptographic features and is subject to United
States and local country laws governing import, export, transfer and
use. Delivery of Cisco cryptographic products does not imply
third-party authority to import, export, distribute or use encryption.
Importers, exporters, distributors and users are responsible for
compliance with U.S. and local country laws. By using this product you
agree to comply with applicable laws and regulations. If you are unable
to comply with U.S. and local laws, return this product immediately.

A summary of U.S. laws governing Cisco cryptographic products may be found at:
http://www.cisco.com/wwl/export/crypto/tool/stqrg.html

If you require further assistance please contact us by sending email to
export@cisco.com.

License Level:
License Type: Perpetual
Next reload license Level:

Addon License Level:
Addon License Type: Subscription
Next reload addon license Level:

The current throughput level is 10000 kbps


Smart Licensing Status: Registration Not Applicable/Not Applicable

cisco C8000V (VXE) processor (revision VXE) with 2264734K/3075K bytes of memory.
Processor board ID 9VS31SJU9I0
Router operating mode: Autonomous
4 Gigabit Ethernet interfaces
32768K bytes of non-volatile configuration memory.
4426612K bytes of physical memory.
5234688K bytes of virtual hard disk at bootflash:.

Configuration register is 0x2102

Router#

show inventoryを叩いてようやく、Catalyst 8000Vである事が実感出来た。

Router#show inventory
NAME: "Chassis", DESCR: "Cisco Catalyst 8000V Edge Chassis"
PID: C8000V            , VID: V00  , SN: 9VS31SJU9I0

NAME: "module R0", DESCR: "Cisco Catalyst 8000V Edge Route Processor"
PID: C8000V            , VID: V00  , SN: JAB1303001C

NAME: "module F0", DESCR: "Cisco Catalyst 8000V Edge Embedded Services Processor"
PID: C8000V            , VID:      , SN:

Router#


IOS XEのバージョン17.4のコードネームBengaluruをGoogleで検索してみた。バンガロール(ベンガルールの旧称)の事だったのか。
今日はここまで。
明日明後日は悪天候のようなので、家に籠ってCatalyst 8000V Edge Softwareで遊んでみようと思う。



その他
自分の環境だけかも知れないが...
・下記リンク先のInstallation And Configuration Guideによると最低スペックはRAM 4GBとの記載が有る。
4GBに設定するとインタフェースがLink Upせず、4.5GBに設定しなおしたらLink Upした。
CPUのコア数は1、2共に変化が無いように感じられた。
・ネットワーク設定のアダプタタイプは、Paravirtualized Network (virtio-net)と他のタイプのどちらを設定しても、ゲスト機側のインタフェースのup/down、外部ネットワークへの疎通共に変化無しだった。



リンク集
Cisco Systemsの広報記事とブログ記事
https://newsroom.cisco.com/press-release-content?type=webcontent&articleId=2102863 Cisco Accelerates Secure Cloud Adoption with Launch of New WAN Edge Platform
https://blogs.cisco.com/networking/powering-the-next-generation-of-wan-with-the-catalyst-8000-edge-platforms-family Powering the Next Generation of WAN with the Catalyst 8000 Edge Platforms Family
https://cscoblogs-prod-17bj.appspot.com/networking/catalyst-8000-edge-platforms Introducing the Catalyst 8000 Edge Family, Cisco’s New SD-WAN Platform


Catalyst 8000 Edge Platforms Family
https://www.cisco.com/c/en/us/products/routers/cloud-edge/index.html?dtid=osscdc000283
※過去の機種の型番をしれっと再利用している...

Catalyst 8000V Edge Software
https://www.cisco.com/c/en/us/products/routers/catalyst-8000v-edge-software/index.html

インストールと設定の手順
https://www.cisco.com/c/en/us/td/docs/routers/C8000V/Configuration/c8000v-installation-configuration-guide.html

VirtualboxのゲストOS間を仮想ケーブルで接続する

Virtualboxでは、複数のゲストOSを立ち上げてゲストOS間で通信をする事が出来る。
Virtualboxのネットワーク設定にて「内部ネットワーク」(英語版の場合はInternal Network)にする事で、ゲストOS間で通信する事が出来るが、そのままの状態では全てのゲストOSの全てのインタフェースが接続されたような状態となり、ゲストOS間のL3ルーティングの検証にて正しい結果を得る事が出来ない。


実環境と同様にゲストOSのインタフェース間を接続し、こちらの想定どおりにL3ルーティングでネイバ関係を確立させる為には、1対1でケーブルで接続させるような設定が必要となる。
それはVirtualboxのネットワーク設定のName欄にて自側と至側を同じ名称に設定にする事で、実現する事が可能である。



当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
Oracle Virtualbox:6.1.16
ゲストOS:Cumulus VX 4.2.1 x5台


5台のCumulus VXをLeaf-Spineな2層のIP Clos構成を組み、BGP unnumberedな設定でBGPピア関係を確立させた。
BGPの設定に関しては前回の記事を参照。
https://debslink.hatenadiary.jp/entry/20201206/1607231451 (Virtualbox + Cumulus VXでIP Clos構成を組んでみた)



設定前の構成
起動している全てのゲストOSの全てのインタフェースが繋がっている状態である為、構成図で表すと以下のような感じになる。
これを、インタフェース1つに対し対向先のゲストOSのインタフェース1つを接続したような状態、つまりゲストOSのインタフェース間を1本1本仮想的にケーブルで接続したような状態にしたい。


設定前の構成でLLDPの状態を確認すると、以下が出力される。
※LLDP(Link Layer Discovery Protocol)とは、自機の情報をTLV(Type, Length, Value)形式で隣接する機器との間で情報を送受信する為のL2なプロトコル。
隣接する機器のホスト名や接続しているインタフェース名も確認出来る為、ベンダを問わず機器の接続確認が可能である。
Ciscoオンリーな環境ならCDPの方が一般的なのかな?

以下はSpine01のLLDPの確認結果。
対向先含め自機のインタフェース全ても見えている状態になっている。

cumulus@jpmtkvmsw99:mgmt:~$ net show lldp

LocalPort  Speed  Mode     RemoteHost   RemotePort
---------  -----  -------  -----------  ----------
eth0       100M   Mgmt     jpmtkvmsw01  eth0
eth0       100M   Mgmt     jpmtkvmsw02  eth0
eth0       100M   Mgmt     jpmtkvmsw03  eth0
eth0       100M   Mgmt     jpmtkvmsw98  eth0
swp1       10G    Default  jpmtkvmsw01  swp1
swp1       10G    Default  jpmtkvmsw01  swp2
swp1       10G    Default  jpmtkvmsw01  swp3
swp1       10G    Default  jpmtkvmsw01  swp4
swp1       10G    Default  jpmtkvmsw02  swp1
swp1       10G    Default  jpmtkvmsw02  swp2
swp1       10G    Default  jpmtkvmsw02  swp3
swp1       10G    Default  jpmtkvmsw02  swp4
swp1       10G    Default  jpmtkvmsw03  swp1
swp1       10G    Default  jpmtkvmsw03  swp2
swp1       10G    Default  jpmtkvmsw03  swp3
swp1       10G    Default  jpmtkvmsw03  swp4
swp1       10G    Default  jpmtkvmsw98  swp1
swp1       10G    Default  jpmtkvmsw98  swp2
swp1       10G    Default  jpmtkvmsw98  swp3
swp1       10G    Default  jpmtkvmsw98  swp4
swp1       10G    Default  jpmtkvmsw98  swp5
swp1       10G    Default  jpmtkvmsw98  swp6
swp1       10G    Default  jpmtkvmsw98  swp7
swp1       10G    Default  jpmtkvmsw99  swp2
swp1       10G    Default  jpmtkvmsw99  swp3
swp1       10G    Default  jpmtkvmsw99  swp4
swp1       10G    Default  jpmtkvmsw99  swp5
swp1       10G    Default  jpmtkvmsw99  swp6
swp1       10G    Default  jpmtkvmsw99  swp7
swp2       10G    Default  jpmtkvmsw01  swp1
swp2       10G    Default  jpmtkvmsw01  swp2
swp2       10G    Default  jpmtkvmsw01  swp3
swp2       10G    Default  jpmtkvmsw01  swp4
swp2       10G    Default  jpmtkvmsw02  swp1
swp2       10G    Default  jpmtkvmsw02  swp2
swp2       10G    Default  jpmtkvmsw02  swp3
swp2       10G    Default  jpmtkvmsw02  swp4
swp2       10G    Default  jpmtkvmsw03  swp1
swp2       10G    Default  jpmtkvmsw03  swp2
swp2       10G    Default  jpmtkvmsw03  swp3
swp2       10G    Default  jpmtkvmsw03  swp4
swp2       10G    Default  jpmtkvmsw98  swp1
swp2       10G    Default  jpmtkvmsw98  swp2
swp2       10G    Default  jpmtkvmsw98  swp3
swp2       10G    Default  jpmtkvmsw98  swp4
swp2       10G    Default  jpmtkvmsw98  swp5
swp2       10G    Default  jpmtkvmsw98  swp6
swp2       10G    Default  jpmtkvmsw98  swp7
swp2       10G    Default  jpmtkvmsw99  swp1
swp2       10G    Default  jpmtkvmsw99  swp3
swp2       10G    Default  jpmtkvmsw99  swp4
swp2       10G    Default  jpmtkvmsw99  swp5
swp2       10G    Default  jpmtkvmsw99  swp6
swp2       10G    Default  jpmtkvmsw99  swp7
swp3       10G    Default  jpmtkvmsw01  swp1
swp3       10G    Default  jpmtkvmsw01  swp2
swp3       10G    Default  jpmtkvmsw01  swp3
swp3       10G    Default  jpmtkvmsw01  swp4
swp3       10G    Default  jpmtkvmsw02  swp1
swp3       10G    Default  jpmtkvmsw02  swp2
swp3       10G    Default  jpmtkvmsw02  swp3
swp3       10G    Default  jpmtkvmsw02  swp4
swp3       10G    Default  jpmtkvmsw03  swp1
swp3       10G    Default  jpmtkvmsw03  swp2
swp3       10G    Default  jpmtkvmsw03  swp3
swp3       10G    Default  jpmtkvmsw03  swp4
swp3       10G    Default  jpmtkvmsw98  swp1
swp3       10G    Default  jpmtkvmsw98  swp2
swp3       10G    Default  jpmtkvmsw98  swp3
swp3       10G    Default  jpmtkvmsw98  swp4
swp3       10G    Default  jpmtkvmsw98  swp5
swp3       10G    Default  jpmtkvmsw98  swp6
swp3       10G    Default  jpmtkvmsw98  swp7
swp3       10G    Default  jpmtkvmsw99  swp1
swp3       10G    Default  jpmtkvmsw99  swp2
swp3       10G    Default  jpmtkvmsw99  swp4
swp3       10G    Default  jpmtkvmsw99  swp5
swp3       10G    Default  jpmtkvmsw99  swp6
swp3       10G    Default  jpmtkvmsw99  swp7
:
長過ぎるので省略
:
cumulus@jpmtkvmsw99:mgmt:~$

以下はLeaf01のLLDPの確認結果。
こちらも、対向先含め自機のインタフェース全ても見えている状態になっている。

cumulus@jpmtkvmsw01:mgmt:~$ net show lldp

LocalPort  Speed  Mode      RemoteHost   RemotePort
---------  -----  --------  -----------  ----------
eth0       100M   Mgmt      jpmtkvmsw02  eth0
eth0       100M   Mgmt      jpmtkvmsw03  eth0
eth0       100M   Mgmt      jpmtkvmsw98  eth0
eth0       100M   Mgmt      jpmtkvmsw99  eth0
swp1       10G    Default   jpmtkvmsw01  swp2
swp1       10G    Default   jpmtkvmsw01  swp3
swp1       10G    Default   jpmtkvmsw01  swp4
swp1       10G    Default   jpmtkvmsw02  swp2
swp1       10G    Default   jpmtkvmsw02  swp1
swp1       10G    Default   jpmtkvmsw02  swp3
swp1       10G    Default   jpmtkvmsw02  swp4
swp1       10G    Default   jpmtkvmsw03  swp1
swp1       10G    Default   jpmtkvmsw03  swp2
swp1       10G    Default   jpmtkvmsw03  swp3
swp1       10G    Default   jpmtkvmsw03  swp4
swp1       10G    Default   jpmtkvmsw98  swp7
swp1       10G    Default   jpmtkvmsw98  swp2
swp1       10G    Default   jpmtkvmsw98  swp1
swp1       10G    Default   jpmtkvmsw98  swp4
swp1       10G    Default   jpmtkvmsw98  swp5
swp1       10G    Default   jpmtkvmsw98  swp3
swp1       10G    Default   jpmtkvmsw98  swp6
swp1       10G    Default   jpmtkvmsw99  swp3
swp1       10G    Default   jpmtkvmsw99  swp5
swp1       10G    Default   jpmtkvmsw99  swp4
swp1       10G    Default   jpmtkvmsw99  swp7
swp1       10G    Default   jpmtkvmsw99  swp1
swp1       10G    Default   jpmtkvmsw99  swp6
swp1       10G    Default   jpmtkvmsw99  swp2
swp2       10G    Default   jpmtkvmsw01  swp1
swp2       10G    Default   jpmtkvmsw01  swp3
swp2       10G    Default   jpmtkvmsw01  swp4
swp2       10G    Default   jpmtkvmsw02  swp1
swp2       10G    Default   jpmtkvmsw02  swp2
swp2       10G    Default   jpmtkvmsw02  swp3
swp2       10G    Default   jpmtkvmsw02  swp4
swp2       10G    Default   jpmtkvmsw03  swp1
swp2       10G    Default   jpmtkvmsw03  swp2
swp2       10G    Default   jpmtkvmsw03  swp3
swp2       10G    Default   jpmtkvmsw03  swp4
swp2       10G    Default   jpmtkvmsw98  swp7
swp2       10G    Default   jpmtkvmsw98  swp2
swp2       10G    Default   jpmtkvmsw98  swp1
swp2       10G    Default   jpmtkvmsw98  swp4
swp2       10G    Default   jpmtkvmsw98  swp5
swp2       10G    Default   jpmtkvmsw98  swp3
swp2       10G    Default   jpmtkvmsw98  swp6
swp2       10G    Default   jpmtkvmsw99  swp3
swp2       10G    Default   jpmtkvmsw99  swp5
swp2       10G    Default   jpmtkvmsw99  swp4
swp2       10G    Default   jpmtkvmsw99  swp7
swp2       10G    Default   jpmtkvmsw99  swp1
swp2       10G    Default   jpmtkvmsw99  swp6
swp2       10G    Default   jpmtkvmsw99  swp2
swp3       1G     Trunk/L2  jpmtkvmsw01  swp1
swp3       1G     Trunk/L2  jpmtkvmsw01  swp2
swp3       1G     Trunk/L2  jpmtkvmsw01  swp4
swp3       1G     Trunk/L2  jpmtkvmsw02  swp2
swp3       1G     Trunk/L2  jpmtkvmsw02  swp1
swp3       1G     Trunk/L2  jpmtkvmsw02  swp3
swp3       1G     Trunk/L2  jpmtkvmsw02  swp4
swp3       1G     Trunk/L2  jpmtkvmsw03  swp1
swp3       1G     Trunk/L2  jpmtkvmsw03  swp2
swp3       1G     Trunk/L2  jpmtkvmsw03  swp3
swp3       1G     Trunk/L2  jpmtkvmsw03  swp4
swp3       1G     Trunk/L2  jpmtkvmsw98  swp7
swp3       1G     Trunk/L2  jpmtkvmsw98  swp2
swp3       1G     Trunk/L2  jpmtkvmsw98  swp1
swp3       1G     Trunk/L2  jpmtkvmsw98  swp4
swp3       1G     Trunk/L2  jpmtkvmsw98  swp5
swp3       1G     Trunk/L2  jpmtkvmsw98  swp3
swp3       1G     Trunk/L2  jpmtkvmsw98  swp6
swp3       1G     Trunk/L2  jpmtkvmsw99  swp3
swp3       1G     Trunk/L2  jpmtkvmsw99  swp5
swp3       1G     Trunk/L2  jpmtkvmsw99  swp4
swp3       1G     Trunk/L2  jpmtkvmsw99  swp7
swp3       1G     Trunk/L2  jpmtkvmsw99  swp1
swp3       1G     Trunk/L2  jpmtkvmsw99  swp6
swp3       1G     Trunk/L2  jpmtkvmsw99  swp2
:
長過ぎるので省略
:
cumulus@jpmtkvmsw01:mgmt:~$

設定方法
ゲストOS間を仮想的に1本づつケーブル接続する際は、Virtualboxのネットワーク設定にて編集が必要。
例えば、Spine01のインタフェースswp1とLeaf01のインタフェースswp1を接続したい場合は、Spine01のswp1に関連付けさせるアダプタ設定(自分の環境ではAdapter 2)とLeaf01のswp1に関連付けさせるアダプタ設定(自分の環境ではAdapter2)のName欄を同一に設定する。
自分の場合、自側と至側が1対になるようName欄に2桁の数字をアサインした。この2桁の数字は他と重複しない値とした。


設定箇所は以下の画像を参照。
Virtualboxの以下の画面にて、Network設定欄内の 'intnet'の文字列を直接クリックしName欄のintnetに数字を追記した。
例えば、Spine01(jpmtkvmsw99)のインタフェースswp1とLeaf01(jpmtkvmsw01)のインタフェースswp1を接続する場合、Spine01のAdapter02のintnetをintnet01に、Leaf01のAdapter02のintnetをintnet01に編集。
(画像をクリックすると拡大表示します)


設定後の構成
Nameに追記した2桁の数字はペアで同じ値を使用。同じネットワークアダプタ同士が、仮想的なケーブルで1本づつ繋がっている状態となる。



以下は、5台のゲストOSのVirtualboxのNetwork設定画面から抜粋。
(画像をクリックすると拡大表示します)



設定後の確認
ゲストOSにログインし、LLDPで確認。

以下はSpine01のLLDPの確認結果。
ケーブルで接続しているが如く、自側のインタフェース1つに対し対向先のインタフェース1つだけが見えている状態となっている。

cumulus@jpmtkvmsw99:mgmt:~$ net show lldp

LocalPort  Speed  Mode     RemoteHost   RemotePort
---------  -----  -------  -----------  ----------
eth0       100M   Mgmt     jpmtkvmsw01  eth0
eth0       100M   Mgmt     jpmtkvmsw02  eth0
eth0       100M   Mgmt     jpmtkvmsw03  eth0
eth0       100M   Mgmt     jpmtkvmsw98  eth0
swp1       10G    Default  jpmtkvmsw01  swp1
swp2       10G    Default  jpmtkvmsw02  swp1
swp3       10G    Default  jpmtkvmsw03  swp1
cumulus@jpmtkvmsw99:mgmt:~$

以下はLeaf01のLLDPの確認結果。
こちらもケーブルで接続しているが如く、自側のインタフェース1つに対し対向先(Spine01,Spine02)のインタフェース1つづつが見えている状態となっている。
設定前と比較すると、非常にスッキリとした内容になっている。

cumulus@jpmtkvmsw01:mgmt:~$ net show lldp

LocalPort  Speed  Mode     RemoteHost   RemotePort
---------  -----  -------  -----------  ----------
eth0       100M   Mgmt     jpmtkvmsw02  eth0
eth0       100M   Mgmt     jpmtkvmsw03  eth0
eth0       100M   Mgmt     jpmtkvmsw98  eth0
eth0       100M   Mgmt     jpmtkvmsw99  eth0
swp1       10G    Default  jpmtkvmsw99  swp1
swp2       10G    Default  jpmtkvmsw98  swp1
cumulus@jpmtkvmsw01:mgmt:~$


リンク先・参照したサイト
https://www.virtualbox.org/ Oracle VirtualBox
https://cumulusnetworks.com/products/cumulus-vx/ Cumulus VX
https://debslink.hatenadiary.jp/entry/20201206/1607231451 Virtualbox + Cumulus VXでIP Clos構成を組んでみた
https://www.ieee802.org/1/pages/802.1AB-rev.html 802.1AB-REV - Station and Media Access Control Connectivity Discovery
https://sig9.hatenablog.com/entry/2019/10/04/000000 はじめての LLDP