NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix CE の Open vSwitch ブリッジ チェーンを整形出力してみる。

Nutanix AHV では、Open vSwitch で多段のブリッジ チェーンが構成されています。ぱっと見ると様子がわかりにくいので、bash スクリプトでチェーンの確認しやすいように、ブリッジとポートを並び替えてみます。

ちょっと古い投稿ですが、AHV のブリッジ チェーンの様子は下記のような感じです。

今回の内容です。

スクリプトの用意

今回は、下記のようなスクリプトを作成してみました。あまりちゃんとしたスクリプトではないので、自宅 Nutanix での様子見などでご利用いただければと思います。

gist.github.com

スクリプトの実行

CVM などから、AHV にログインします。

CVM$ ssh root@192.168.5.1

今回の AHV です。

AHV# cat /etc/nutanix-release
el7.nutanix.20191030.415

/tmp など、ファイルを作成できるディレクトリに移動しておきます。

# cd /tmp

スクリプトを、curl や scp などで AHV に配置しておきます。

# curl -O -L -s https://gist.githubusercontent.com/gowatana/d4ab2df0a4b41f45623d320c2c5c555b/raw/format_ahv_open-vswitch.sh

スクリプト ファイルが配置されました。

# ls -l format_ahv_open-vswitch.sh
-rw-------. 1 root root 6781 Jul 31 13:12 format_ahv_open-vswitch.sh

実行すると、下記のような感じで ovs-vsctl show を整形して表示できます。

  • 最初の「bond」行は、ovs-appctl bond/list を表示していますが、この環境では bond ポートを構成していないので空欄になっています。ちなみにこのマシンの物理 NIC ポートは br0 の eno1 で、普通はこの代わりにボンド ポートになります。
  • デフォルトで作成される br0 ブリッジからブリッジ順で表示します。
  • 各ブリッジでは、ポートを下記の順で表示しています。
    1. 前ブリッジからのダウンリンク(~.d)
    2. ブリッジと同名のローカル ポート
    3. それ以外のポート(.d、.u、LOCAL 以外のポート)
    4. 次ブリッジのアップリンク(~.u)
  • ついでに、ポート番号と MAC アドレスを表示してあります。(ovs-ofctl show から)
  • チェーンが分岐する追加仮想スイッチ(br1)に対応するブリッジは、br0 関連チェーンのあとで表示します。
  • 追加機能系のブリッジは、br1 のあとに表示します。とりあえず下記のみを識別しますが、この環境にはないので表示されていません。
    • brSpan: ポート ミラーリング(SPAN)のためのブリッジ
    • brAtlas: Flow Virtual Networking のオーバーレイ ネットワークなどで利用されるブリッジ
  • 出力結果は、カレント ディレクトリの ovs-vsctl_show_formatted.txt ファイルにも保存されます。
[root@NTNX-624676c4-A tmp]# bash ./format_ahv_open-vswitch.sh
AHV Host: NTNX-624676c4-A
DateTime: 2022 07/31 13:07:38
============================================================
bond    type    recircID        slaves
============================================================
    Bridge br0
        Port br0
            tag: 20
            Interface br0
                type: internal
        Port eno1
            Interface eno1
        Port vnet1
            tag: 20
            Interface vnet1
        Port vnet2
            Interface vnet2
        Port br0-dhcp
            Interface br0-dhcp
                type: vxlan
                options: {key=1, remote_ip=192.168.20.52}
        Port br0-arp
            Interface br0-arp
                type: vxlan
                options: {key=1, remote_ip=192.168.5.2}
        Port br0.u
            Interface br0.u
                type: patch
                options: {peer=br.dmx.d.br0}

 1(eno1): addr:1c:69:7a:63:0d:37
 2(vnet1): addr:fe:6b:8d:45:9a:90
 3(vnet2): addr:fe:6b:8d:fd:8f:16
 4(br0-arp): addr:96:61:fd:59:32:d5
 5(br0-dhcp): addr:2a:cf:83:d9:39:3c
 6(br0.u): addr:7a:74:6e:15:eb:48
 LOCAL(br0): addr:1c:69:7a:63:0d:37
============================================================
    Bridge br.dmx
        Port br.dmx.d.br0
            Interface br.dmx.d.br0
                type: patch
                options: {peer=br0.u}
        Port br.dmx
            Interface br.dmx
                type: internal
        Port br.dmx.u
            Interface br.dmx.u
                type: patch
                options: {peer=br.nf.d}

 1(br.dmx.u): addr:f2:4f:63:11:1d:64
 2(br.dmx.d.br0): addr:a6:ef:3d:6c:23:8f
 LOCAL(br.dmx): addr:e2:6b:2b:41:81:4e
============================================================
    Bridge br.nf
        Port br.nf.d
            Interface br.nf.d
                type: patch
                options: {peer=br.dmx.u}
        Port br.nf
            Interface br.nf
                type: internal
        Port br.nf.u
            Interface br.nf.u
                type: patch
                options: {peer=br.microseg.d}

 1(br.nf.u): addr:26:5c:25:70:55:af
 2(br.nf.d): addr:52:b1:8b:44:63:c8
 LOCAL(br.nf): addr:e2:01:5e:21:72:4a
============================================================
    Bridge br.microseg
        Port br.microseg.d
            Interface br.microseg.d
                type: patch
                options: {peer=br.nf.u}
        Port br.microseg
            Interface br.microseg
                type: internal
        Port br.microseg.u
            Interface br.microseg.u
                type: patch
                options: {peer=br.mx.d}

 1(br.microseg.u): addr:5e:59:8b:9f:8c:c2
 2(br.microseg.d): addr:1e:db:45:6b:ce:72
 LOCAL(br.microseg): addr:de:9f:b5:c4:5b:45
============================================================
    Bridge br.mx
        Port br.mx.d
            Interface br.mx.d
                type: patch
                options: {peer=br.microseg.u}
        Port br.mx
            Interface br.mx
                type: internal
        Port br.mx.u.br0
            Interface br.mx.u.br0
                type: patch
                options: {peer=br0.local.d}

 1(br.mx.d): addr:76:24:87:5c:51:d6
 2(br.mx.u.br0): addr:0a:e9:de:b1:d5:71
 LOCAL(br.mx): addr:d2:64:6f:99:86:42
============================================================
    Bridge br0.local
        Port br0.local.d
            Interface br0.local.d
                type: patch
                options: {peer=br.mx.u.br0}
        Port br0.local
            Interface br0.local
                type: internal
        Port tap0
            tag: 11
            Interface tap0
        Port tap1
            tag: 20
            Interface tap1

 1(br0.local.d): addr:fa:6a:b5:ff:6f:72
 2(tap0): addr:fe:6b:8d:e9:2b:09
 6(tap1): addr:fe:6b:8d:ed:4e:81
 LOCAL(br0.local): addr:8a:7e:b4:6a:03:4b
============================================================

通常の ovs-vsctl show の出力結果は、下記のようにブリッジやポートがチェーンの順序で並びません。

[root@NTNX-624676c4-A tmp]# ovs-vsctl show | grep -e Bridge -e Port | nl
     1      Bridge br.nf
     2          Port br.nf.u
     3          Port br.nf
     4          Port br.nf.d
     5      Bridge br.dmx
     6          Port "br.dmx.d.br0"
     7          Port br.dmx.u
     8          Port br.dmx
     9      Bridge "br0.local"
    10          Port "tap0"
    11          Port "br0.local.d"
    12          Port "tap1"
    13          Port "br0.local"
    14      Bridge br.mx
    15          Port br.mx.d
    16          Port br.mx
    17          Port "br.mx.u.br0"
    18      Bridge "br0"
    19          Port "eno1"
    20          Port "br0.u"
    21          Port "vnet1"
    22          Port "br0"
    23          Port "vnet2"
    24          Port "br0-dhcp"
    25          Port "br0-arp"
    26      Bridge br.microseg
    27          Port br.microseg.d
    28          Port br.microseg
    29          Port br.microseg.u

今回のスクリプトでは、物理 NIC / Bond が接続される br0 ブリッジから、そこそこチェーン順で表示されるはずです。

[root@NTNX-624676c4-A tmp]# bash format_ahv_open-vswitch.sh | grep -e Bridge -e Port | nl
     1      Bridge br0
     2          Port br0
     3          Port eno1
     4          Port vnet1
     5          Port vnet2
     6          Port br0-dhcp
     7          Port br0-arp
     8          Port br0.u
     9      Bridge br.dmx
    10          Port br.dmx.d.br0
    11          Port br.dmx
    12          Port br.dmx.u
    13      Bridge br.nf
    14          Port br.nf.d
    15          Port br.nf
    16          Port br.nf.u
    17      Bridge br.microseg
    18          Port br.microseg.d
    19          Port br.microseg
    20          Port br.microseg.u
    21      Bridge br.mx
    22          Port br.mx.d
    23          Port br.mx
    24          Port br.mx.u.br0
    25      Bridge br0.local
    26          Port br0.local.d
    27          Port br0.local
    28          Port tap0
    29          Port tap1

AHV 実機以外でのスクリプト実行

ovs-vsctl を実行できる AHV 実機以外でもスクリプトを実行したいことがあります。そこで、あらかじめ保存しておいた「ovs-vsctl show」の出力結果のファイルを指定できるようにしてみました。

たとえば、ovs-vsctl show の出力を output.txt ファイルにリダイレクトで保存しておきます。

AHV# ovs-vsctl show > output.txt

そして、スクリプトの1つめの引数として指定します。

AHV# bash ./format_ahv_open-vswitch.sh output.txt

この場合は、スクリプト実行環境では ovs-vsctl show と揃った ovs-ofctl コマンドが実行できないので、各ブリッジのポート番号と MAC アドレスの表示はしません。

以上。

 

©2022 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。