OVS重装

2016.6.11更新:
重装ovs时在启动ovsdb-server配置数据库报错一般会有两种,最常见的一种是:
错误提示1:

ovsdb-server: /usr/local/var/run/openvswitch/ovsdb-server.pid: already running as pid 20610, aborting

这个是因为已经有一个ovsdb-server进程启动了,如果需要重启则把这个pid号kill掉即可。kill -9 20610
最近又发现一种新的报错:
错误提示2:

2016-06-11T09:22:03Z|00003|hmap|DBG|lib/shash.c:112: 6 nodes in bucket (16 nodes, 8 buckets)
2016-06-11T09:22:03Z|00004|hmap|DBG|lib/shash.c:112: 6 nodes in bucket (64 nodes, 32 buckets)
2016-06-11T09:22:03Z|00005|hmap|DBG|lib/shash.c:112: 6 nodes in bucket (128 nodes, 64 buckets)
2016-06-11T09:22:03Z|00006|hmap|DBG|lib/shash.c:112: 6 nodes in bucket (256 nodes, 128 buckets)
2016-06-11T09:22:03Z|00007|hmap|DBG|lib/shash.c:112: 6 nodes in bucket (256 nodes, 128 buckets)
2016-06-11T09:22:03Z|00008|hmap|DBG|lib/shash.c:112: 6 nodes in bucket (256 nodes, 128 buckets)
2016-06-11T09:22:03Z|00009|hmap|DBG|lib/shash.c:112: 6 nodes in bucket (256 nodes, 128 buckets)
2016-06-11T09:22:03Z|00010|hmap|DBG|lib/shash.c:112: 7 nodes in bucket (256 nodes, 128 buckets)
2016-06-11T09:22:03Z|00011|hmap|DBG|lib/shash.c:112: 6 nodes in bucket (64 nodes, 32 buckets)

报错原因是在上次ovs崩掉之前还有之前生成的ovs没有删除掉导致的,而linux系统下软件安装之后想要彻底删除之前的安装生成的文件一直是一件很难的事情。。。这个问题的解决办法是,进入到/usr/local/var/run/openvswitch/文件夹中,这个文件是保存运行着的ovs以及一些控制文件,把这个文件夹下的所有东西都删除掉,再重新启动ovsdb-server就可以啦。

还有一种情况是add-br的时候卡掉,但是查看logovs-vswitchd 会发现br其实已经被建立。 至于卡掉的原因也并不清楚,解决方法也还没有找到,如果有知道的同学请留言,谢谢~但是建议根据log的提示来对症下药,因为我在添加br卡顿后打开log再次添加br竟然又不卡顿了。


开源软件的安装总是一件无比蛋疼的事情,因为总是会遇到一些莫名其妙的问题。
之前安装ovs一直用的是SDNLAB上的一个教程,附上链接http://www.sdnlab.com/3166.html
但是最近我发现之前安装好的ovs莫名其妙不能用了,症状是在配置好controller ip之后发现它和控制器并不能互相找到(两个地址可以平通)。
于是不得已我又按照教程重装了ovs,但是依然没有解决问题,后来参考了这个链接中的OVS安装手册
http://www.360doc.com/content/13/1126/09/5711743_332223314.shtml
意识到这个问题应该是第二次安装可能是database并没有得到更新造成的,所以根据安装手册,我将database删除掉又重新用ovs-tool生成,最后ovs又可以正常工作。这个安装手册中同时提供了升级database的办法,我把两种方法的代码贴出来。

删除后重新生成
rm -rf /usr/local/etc/openvswitch
mkdir -p /usr/local/etc/openvswitch
ovsdb-tool create /usr/local/etc/openvswitch/conf.db 
升级
ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema  2>/dev/null

2016.6.11
今天又遇到看似相同的情况,mininet上生成网络后无法和本地controller建立连接,根据观察log,发现log报错:

2016-06-11T09:25:50Z|00006|dpif|WARN|failed to enumerate system datapaths: No such file or directory
2016-06-11T09:25:50Z|00007|dpif|WARN|failed to create datapath ovs-system: No such file or directory
2016-06-11T09:25:50Z|00008|ofproto_dpif|ERR|failed to open datapath of type system: No such file or directory
2016-06-11T09:25:50Z|00009|ofproto|ERR|failed to open datapath s1: No such file or directory
2016-06-11T09:25:50Z|00010|bridge|ERR|failed to create bridge s1: No such file or directory

在ovs mail-list中找到一个相同的问题http://www.ismailbaydan.com/open-virtual-switch-tutorial/
但是邮件里面没有提解决办法。
后来仔细阅读报错原因,发现里面有一行是:

Generic Netlink family 'ovs_datapath' does not exist. The Open vSwitch kernel module is probably not loaded.

所以我想和controller无法连接的原因应该是内核模块没有被加载,按照教程重新加载内核模块,问题解决!

OVS常用操作
二、配置OVS虚拟OpenFlow交换机
1.新建一个桥(交换机),命名为s1:
sudo ovs-vsctl add-br s1
注意:进行OVS设置时很容易造成虚拟交换机与物理交换机构成二层环路(比如虚拟交换机包含两块网卡,而这两块网卡都连接到物理交换机上,就是一个环路),一旦有广播报文,比如ARP请求,就会引发广播风暴,使网络瘫痪。因此,应该把虚拟交换机开启STP支持,避免广播风暴:
ovs−vsctl set bridge 交换机名 stp_enable=true
2.启动要添加到虚拟交换机s1上的物理端口(物理网卡,这里是eth0和eth3)。如果ifconfig里已经有了,那就不用重新启动了。
sudo ifconfig eth3 up
sudo ifconfig eth0 up
3.添加物理端口到虚拟交换机s1:
sudo ovs-vsctl add-port s1 eth3
sudo ovs-vsctl add-port s1 eth0
4.设置IP:
OpenFlow交换机与控制器连接需要用到TCP连接,因此交换机需要设置IP。但当把物理端口添加到虚拟交换机上之后,这些物理端口上原先的IP设置将失效(IP属于三层,而交换机工作在二层),无法与外界进行三层的互联。解决方法是添加一个类型为internal的端口,然后设置IP和路由(本例是添加一个名为veth3的虚拟端口):
首先,如果原先端口有设置IP,应将其重置:
sudo ifconfig eth3 0
然后添加虚拟端口:
sudo ovs-vsctl add-port s1 veth3
sudo ovs-vsctl set interface veth3 type=internal
这时如果执行ifconfig就会发现多了一个名为veth3的端口。然后设置该端口并添加路由:
sudo ifconfig veth3 192.168.1.3 netmask 255.255.255.0
sudo route add default gw 192.168.1.1 veth3
P.S. 后来看到网上说其实不需要额外添加veth3,因为创建s1后会自动生成一个名为s1的internal端口,直接设置它就可以。
5.连接远程控制器(本例中控制器为POX,IP是192.168.1.100):
连接控制器之前控制器要先启动。然后连接:
sudo ovs-vsctl set-controller s1 tcp:192.168.1.100:6633
这时远程控制器就能看到连接信息,比如:INFO:openflow.of_01:[00-d0-f8-0f-d6-e9 2] connected
三、常用OVS操作
1.添加网桥:ovs-vsctl add-br 交换机名
2.删除网桥:ovs-vsctl del-br 交换机名
3.添加端口:ovs-vsctl add-port 交换机名 端口名(网卡名)
4.删除端口:ovs-vsctl del-port 交换机名 端口名(网卡名)
5.连接控制器:ovs-vsctl set-controller 交换机名 tcp:IP地址:端口号
6.断开控制器:ovs-vsctl del-controller 交换机名
7.列出所有网桥:ovs-vsctl list-br
8.列出网桥中的所有端口:ovs-vsctl list-ports 交换机名
9.列出所有挂接到网卡的网桥:ovs-vsctl port-to-br 端口名(网卡名)
10.查看open vswitch的网络状态:ovs-vsctl show
11.查看 Open vSwitch 中的端口信息(交换机对应的 dpid,以及每个端口的 OpenFlow 端口编号,端口名称,当前状态等等):ovs-ofctl show 交换机名
12.修改dpid:ovs-vsctl set bridge 交换机名 other_config:datapath-id=新DPID
13.修改端口号:ovs-vsctl set Interface 端口名 ofport_request=新端口号
14.查看交换机中的所有 Table:ovs-ofctl dump-tables ovs-switch
15.查看交换机中的所有流表项:ovs−ofctl dump−flows ovs-switch
16.删除编号为 100 的端口上的所有流表项:ovs-ofctl del-flows ovs-switch “in_port=100”
17.添加流表项(以“添加新的 OpenFlow 条目,修改从端口 p0 收到的数据包的源地址为 9.181.137.1”为例):
ovs-ofctl add-flow ovs-switch “priority=1 idle_timeout=0,in_port=100,actions=mod_nw_src:9.181.137.1,normal”
(更多说明请查阅:《基于 Open vSwitch 的 OpenFlow 实践》)
18.查看 OVS 的版本信息:ovs-appctl –version
19.查看 OVS 支持的 OpenFlow 协议的版本:ovs-ofctl –version

你可能感兴趣的:(SDN)