OpenvSwitch関連コマンドのチートシート的な何か

f:id:komeiy:20150107164847j:plain

まずOpenvSwitchに関するコマンドは大きく4つです。観点としてはOpenStackで使ったときにトラブルシューティングで使いそうなものが多いかもしれません。

Neutronってよくわらかないって人は、以下も参照してみるとイメージが付きやすいと思います。

komeiy.hatenablog.com

  • ovs-vsctl
    • Used for configuring the ovs-vswitchd configuration database (known as ovs-db)
  • ovs-ofctl
    • A command line tool for monitoring and administering OpenFlow switches
  • ovs-dpctl
    • Used to administer Open vSwitch datapaths
  • ovs−appctl
    • Used for querying and controlling Open vSwitch daemons

1. ovs-vsctlコマンド

ovs-vsctlって何?

マニュアルにも「ovs-vsctl connects to an ovsdb-server process that maintains an Open vSwitch configuration database.」の記載がある通りovsdb-serverプロセスを操作するためのコマンドです。ovs-vsctlを叩いた時の内部的な動きはざっくり以下の通りです。

ovs-vsctl -> ovsdb-server <-> ovs-vswitchd <-> openvswitch_mod -> ovsdb

※ openvswitch_mod(datapath)はパケットの転送処理を行うカーネルモジュールです。

参考までにプロトコル番号です。

management(OVSDB) Channel TCP/6632
Openflow channel TCP/6633

せっかくなのでkiloのレポジトリから取ってきました。バージョンは以下の通りです。

[komei@localhost ~]# ovs-vsctl -V
ovs-vsctl (Open vSwitch) 2.3.1
Compiled Dec 26 2014 15:35:14
DB Schema 7.6.2

ovsdb-serverはデフォルトで/var/run/openvswitch/db.sockファイルを使用します。このファイルをコピーすれば設定情報は復元できます。

[komei@localhost ~]# ps aux | grep open
root     21413  0.0  0.5  46488  2528 ?        S<    6月17   0:12 ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir --log-file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach --monitor
root     21426  0.0  7.0 268568 35180 ?        S<Ll  6月17   4:23 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor

ovs-vsctlのオプション

databaseファイルを指定

[komei@localhost ~]# ovs-vsctl --db=unix:/var/run/openvswitch/db.sock show
ed7907f7-314f-465d-8971-e6a8792c9dfd
    Bridge br-int
        Port "qr-peer2"
            tag: 2
            Interface "qr-peer2"
        Port br-int
            Interface br-int
                type: internal
        Port "vm-peer1"
            Interface "vm-peer1"
        Port "vm-peer2"
            tag: 2
            Interface "vm-peer2"
        Port "ns-peer2"
            tag: 2
            Interface "ns-peer2"
        Port "qr-peer1"
            Interface "qr-peer1"
    Bridge br-ex
        Port "qg-peer1"
            Interface "qg-peer1"
        Port "qg-peer2"
            Interface "qg-peer2"
        Port "pub-peer1"
            Interface "pub-peer1"
        Port br-ex
            Interface br-ex
                type: internal
    ovs_version: "2.3.1"

外部のovsdbへ接続

  • tcp:ip:port
  • ssl:ip:port --private-key

ovsdbへの外部アクセスに備えてlistenする

  • ptcp:port[:ip]
  • pssl;port[:ip]

openvswitchのsyslog

--no-syslogでsyslogへの出力を制御できる

デフォルトでは以下の通りsyslog形式でログが出力されています。

[komei@localhost ~]# cat /var/log/messages | grep ovs-vsctl
Jun 23 00:01:26 localhost ovs-vsctl: ovs|00001|vsctl|ERR|'list' command requires at least 1 arguments 

他には以下のオプションもあります。

--log-file[=file]

デフォルトでは/var/log/openvswitch/ovs-vsctl.logです

その他の便利なオプション

--dry-run

--timeout=secs

--syslog-target=host:port

ovs-vsctlの確認コマンド

Bridgeのリスト

[komei@localhost ~]# ovs-vsctl list-br
br-ex
br-int

Bridgeの存在確認

[komei@localhost ~]# ovs-vsctl br-exists br-ex1
[komei@localhost ~]# echo $?
2
[komei@localhost ~]# ovs-vsctl br-exists br-ex
[komei@localhost ~]# echo $?
0

Bridgeのリスト確認

[komei@localhost ~]# ovs-vsctl list-ports br-ex
pub-peer1
qg-peer1
qg-peer2
[komei@localhost ~]# ovs-vsctl list-ports br-int
ns-peer2
qr-peer1
qr-peer2
vm-peer1
vm-peer2

ポートがどのBridgeに接続されているか

[komei@localhost ~]# ovs-vsctl port-to-br pub-peer1
br-ex

OpenFlowコントローラーの確認

[komei@localhost ~]# ovs-vsctl get-controller br-ex

set-controllerもあります。opendaylightのエントリで書いたような記憶もありますが。

蛇足ですがNetFlowやsFlowにも対応しています。あとMirroringやQoSGREトンネルにも対応しています。

[komei@localhost ~]# ovs-vsctl  add-port  br0  gre0  --set  Interface gre0 type=gre options:remote_ip=1.2.3.4

ovs-ofctl

ovs-ofctlって何?

openvswichのopen flow部分を見るコマンドです。

OpenflowスイッチとしてのBridge確認

[komei@localhost ~]# ovs-ofctl show br-ex
OFPT_FEATURES_REPLY (xid=0x2): dpid:00001237cc5df04d
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
 1(qg-peer1): addr:ea:9c:0d:31:eb:4b
     config:     0
     state:      0
     current:    10GB-FD COPPER
     speed: 10000 Mbps now, 0 Mbps max
 2(pub-peer1): addr:82:ca:37:c4:9c:1d
     config:     0
     state:      0
     current:    10GB-FD COPPER
     speed: 10000 Mbps now, 0 Mbps max
 3(qg-peer2): addr:1a:13:3c:79:30:12
     config:     0
     state:      0
     current:    10GB-FD COPPER
     speed: 10000 Mbps now, 0 Mbps max
 LOCAL(br-ex): addr:12:37:cc:5d:f0:4d
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

flowのstatisticsを確認

[komei@localhost ~]# ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=488096.484s, table=0, n_packets=48, n_bytes=3800, idle_age=65534, hard_age=65534, priority=0 actions=NORMAL

openvswitch Portのstatistics

[komei@localhost ~]# ovs-ofctl dump-ports br-int qr-peer2
OFPST_PORT reply (xid=0x4): 1 ports
  port  3: rx pkts=145, bytes=13290, drop=0, errs=0, frame=0, over=0, crc=0
           tx pkts=161, bytes=14586, drop=0, errs=0, coll=0

ovs-dpctl

ovs-dpctlって何?

ovs-dpctlはデータパス部分の設定や確認をするコマンドです。

openvswitchのdata path確認

[komei@localhost ~]# ovs-dpctl dump-dps
system@ovs-system

openvswitchを通過するflow一覧を表示

  • まだ何も表示されない
[komei@localhost ~]# ovs-dpctl dump-flows
  • Pingを打って通信を発生させる
[komei@localhost ~]# ip netns exec qpublic ping 192.168.101.12
PING 192.168.101.12 (192.168.101.12) 56(84) bytes of data.
64 bytes from 192.168.101.12: icmp_seq=1 ttl=63 time=0.322 ms
64 bytes from 192.168.101.12: icmp_seq=2 ttl=63 time=0.224 ms
  • 再度表示
[komei@localhost ~]# ovs-dpctl dump-flows
recirc_id(0),skb_priority(0),in_port(5),eth(src=e2:26:c6:c9:1b:72,dst=26:81:8d:99:47:80),eth_type(0x0800),ipv4(src=192.168.101.200/0.0.0.0,dst=192.168.101.12/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:1, bytes:98, used:0.140s, actions:10
recirc_id(0),skb_priority(0),in_port(7),eth(src=4a:f3:46:10:ec:34,dst=c6:79:ae:27:8e:db),eth_type(0x0800),ipv4(src=192.168.101.12/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=63/0,frag=no/0xff), packets:1, bytes:98, used:0.140s, actions:9
recirc_id(0),skb_priority(0),in_port(9),eth(src=c6:79:ae:27:8e:db,dst=4a:f3:46:10:ec:34),eth_type(0x0800),ipv4(src=10.0.0.3/0.0.0.0,dst=192.168.101.12/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:2, bytes:196, used:0.140s, actions:7
recirc_id(0),skb_priority(0),in_port(10),eth(src=26:81:8d:99:47:80,dst=e2:26:c6:c9:1b:72),eth_type(0x0800),ipv4(src=192.168.101.12/0.0.0.0,dst=192.168.101.200/0.0.0.0,proto=1/0,tos=0/0,ttl=63/0,frag=no/0xff), packets:2, bytes:196, used:0.140s, actions:5
  • statisticsを確認
[komei@localhost ~]# ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=488404.848s, table=0, n_packets=130, n_bytes=11388, idle_age=0, hard_age=65534, priority=0 actions=NORMAL
[komei@localhost ~]# ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=488405.936s, table=0, n_packets=132, n_bytes=11584, idle_age=0, hard_age=65534, priority=0 actions=NORMAL

その他

MACアドレステーブル確認

[komei@localhost ~]# ovs-appctl fdb/show br-ex
 port  VLAN  MAC                Age
    1     0  5e:6e:bb:98:eb:d5    5
    2     0  e2:26:c6:c9:1b:72    1
    3     0  26:81:8d:99:47:80    1
[komei@localhost ~]# ovs-appctl fdb/show br-int
 port  VLAN  MAC                Age
    2     0  42:8a:36:9d:7d:21    7
    1     0  06:b0:47:10:06:32    7
    3     2  4a:f3:46:10:ec:34    1

※ Ageはデフォルトで300秒

[komei@localhost ~]# ip netns exec qpublic ip a
15: pub-veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether e2:26:c6:c9:1b:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.101.200/24 scope global pub-veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::e026:c6ff:fec9:1b72/64 scope link
       valid_lft forever preferred_lft forever
23: qg-veth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 26:81:8d:99:47:80 brd ff:ff:ff:ff:ff:ff
    inet 192.168.101.9/24 scope global qg-veth2
       valid_lft forever preferred_lft forever
    inet 192.168.101.12/32 scope global qg-veth2
       valid_lft forever preferred_lft forever
    inet6 fe80::2481:8dff:fe99:4780/64 scope link
       valid_lft forever preferred_lft forever
17: qr-veth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 4a:f3:46:10:ec:34 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/8 scope global qr-veth2
       valid_lft forever preferred_lft forever
    inet6 fe80::48f3:46ff:fe10:ec34/64 scope link
       valid_lft forever preferred_lft forever
21: vm-veth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether c6:79:ae:27:8e:db brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.3/8 scope global vm-veth2
       valid_lft forever preferred_lft forever
    inet6 fe80::c479:aeff:fe27:8edb/64 scope link
       valid_lft forever preferred_lft forever

※ qvo, qvb, tapとかが入っているのを確認。

MACアドレスのテーブルサイズ変更

openvswitchで設定できるテーブルサイズ

other_config  : mac-table-size: optional string, containing an integer, at least 1
              The maximum number of MAC addresses to learn.  The default  is  currently
              2048.   The  value, if specified, is forced into a reasonable range, cur‐
              rently 10 to 1,000,000.

現在のテーブルサイズ確認

[komei@localhost ~]# ovs-vsctl list bridge br-int
_uuid               : 4fc8c288-5a54-41ed-85f4-854eaf1f31fd
controller          : []
datapath_id         : "00008ac2c84fed41"
datapath_type       : ""
external_ids        : {}
fail_mode           : []
flood_vlans         : []
flow_tables         : {}
ipfix               : []
mirrors             : []
name                : br-int
netflow             : []
other_config        : {mac-table-size="4096"}
ports               : [01e94661-0d5d-4154-b931-2f05068de40f, 25f9a4ed-7f73-4069-a9e2-fd67d4b870b4, 9c08bee6-0304-4cb5-82a4-676806f6e94e, d013c5a1-2e70-4e87-8d7a-5759b4e9cd22, e8245b4a-7be5-4cc8-a8f0-3f5f10b6f247, f09afbd4-7477-4de7-acf0-e42ee7edd9eb]
protocols           : []
sflow               : []
status              : {}
stp_enable          : false

テーブルサイズ変更

[komei@localhost ~]# ovs-vsctl set Bridge br-int other_config:mac-table-size=8192
[komei@localhost ~]# ovs-vsctl list bridge br-int
_uuid               : 4fc8c288-5a54-41ed-85f4-854eaf1f31fd
controller          : []
datapath_id         : "00008ac2c84fed41"
datapath_type       : ""
external_ids        : {}
fail_mode           : []
flood_vlans         : []
flow_tables         : {}
ipfix               : []
mirrors             : []
name                : br-int
netflow             : []
other_config        : {mac-table-size="8192"}
ports               : [01e94661-0d5d-4154-b931-2f05068de40f, 25f9a4ed-7f73-4069-a9e2-fd67d4b870b4, 9c08bee6-0304-4cb5-82a4-676806f6e94e, d013c5a1-2e70-4e87-8d7a-5759b4e9cd22, e8245b4a-7be5-4cc8-a8f0-3f5f10b6f247, f09afbd4-7477-4de7-acf0-e42ee7edd9eb]
protocols           : []
sflow               : []
status              : {}
stp_enable          : false

何故か設定範囲を超えた値が入る気が・・・

[komei@localhost ~]# ovs-vsctl set Bridge br-int other_config:mac-table-size=1000000000
[komei@localhost ~]# ovs-vsctl list bridge br-int
_uuid               : 4fc8c288-5a54-41ed-85f4-854eaf1f31fd
controller          : []
datapath_id         : "00008ac2c84fed41"
datapath_type       : ""
external_ids        : {}
fail_mode           : []
flood_vlans         : []
flow_tables         : {}
ipfix               : []
mirrors             : []
name                : br-int
netflow             : []
other_config        : {mac-table-size="1000000000"}
ports               : [01e94661-0d5d-4154-b931-2f05068de40f, 25f9a4ed-7f73-4069-a9e2-fd67d4b870b4, 9c08bee6-0304-4cb5-82a4-676806f6e94e, d013c5a1-2e70-4e87-8d7a-5759b4e9cd22, e8245b4a-7be5-4cc8-a8f0-3f5f10b6f247, f09afbd4-7477-4de7-acf0-e42ee7edd9eb]
protocols           : []
sflow               : []
status              : {}
stp_enable          : false

現在のテーブル数確認

お好みで。

sudo ovs-appctl fdb/show br-int | wc -l

シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加