当前位置:首页 » 操作系统 » ovs源码

ovs源码

发布时间: 2022-12-31 08:53:18

1. open vswitch和网桥的区别

下载完后输入以下命令解压
[root@localhost ~]# tar –xzvf openvswitch-1.1.0pre2.tar.gz

进入解压后目录,输入以下命令配置Open vSwitch工程,生成Makefile文件。
[root@localhost ~]# ./configure --with-linux=/lib/moles/`uname -r`/build

–with- linux:生成内核模式的Open vSwitch时需指定的内核源码编译目录
指定Open
vSwitch的安装位置加参数:–prefix=/…
如有其他问题可参考源码根目录下的帮助文件:INSTALL.Linux

编译、链接、生成和安装Open vSwitch,命令如下,make install目录只安装Open vSwitch除内核模块外的其他所有模块,如ovs-vsctl、ovs-vswitchd、ovs-ofctl等
[root@localhost ~]# make[root@localhost ~]# make install

卸载原有虚拟网桥模块,命令如下,如果Xend正常启动,将自动加载linux虚拟网桥模块bridge.ko。
[root@localhost ~]# rmmod bridge

如果无法卸载,可用“lsmod”命令查看已加载的依赖于bridge的内核模块,并用“rmmod 模块名”卸载,常见的无法卸载的情况可通过预先执行下面两条命令解决。
[root@localhost ~]# /etc/init.d/iptables stop[root@localhost ~]# rmmod xt_physdev

加载Open
vSwitch内核模块openvswitch_mod.ko和linux虚拟网桥兼容模块brcompat_mod.ko
[root@localhost ~]# insmod openvswitch-1.1.0pre2/datapath/linux-2.6/openvswitch_mod.ko[root@localhost ~]# insmod openvswitch-1.1.0pre2/datapath/linux-2.6/brcompat_mod.ko

根据ovsdb模板vswitch.ovsschema创建ovsdb数据库ovs-vswitchd.conf.db,用于存储虚拟交换机的配置信息,只需第一次运行Open
vSwitch时创建
[root@localhost ~]# ovsdb-tool create/usr/local/etc/ovs-vswitchd.conf.dbopenvswitch-1.1.0pre2/vswitchd/vswitch.ovsschema

启动ovsdb数据库服务器,Open vSwitch虚拟网桥模块将通过ovsdb-server获得虚拟交换机配置信息,“—detach”表示以后台方式运行, ovsdb-server其他参数请参考“ovsdb-server –help”
[root@localhost ~]# ovsdb-server/usr/local/etc/ovs-vswitchd.conf.db--remote=punix:/usr/local/var/run/openvswitch/db.sock--remote=db:Open_vSwitch,manager_options--private-key=db:SSL,private_key--certificate=db:SSL,certificate--bootstrap-ca-cert=db:SSL,ca_cert--detach

初始化Open
vSwitch控制接口,以便用ovs-vsctl管理配置虚拟交换机
[root@localhost ~]#
ovs-vsctl –no-wait init

启动Open
vSwitch用户态模块,unix:后的文件为socket文件,为ovsdb-server监听的socket文件。
[root@localhost ~]#
ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock –detach

启动linux原有虚拟网桥兼容模块用户态组件ovs-brcompatd,该模块必须在ovsdb-server和ovs-vswitchd启动后才能启动。
[root@localhost ~]# ovs-brcompatd--pidfile--detach

2.2 apt-get安装

$apt-get install openvswitch-*

注意:使用deb安装openvswitch-datapath*也是需要依赖/lib/moles/`uname -r`/build,否则无法编译内核模块

2. 如何使用Floodlight连接并管理Open vSwitch

Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟化平台(例如 KVM,Xen)上的虚拟交换机。在虚拟化平台上,OVS 可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。

OVS 遵循 Apache 2.0 许可证, 能同时支持多种标准的管理接口和协议。OVS 也提供了对 OpenFlow 协议的支持,用户可以使用任何支持 OpenFlow 协议的控制器对 OVS 进行远程管理控制。

Open vSwitch 概述

在 OVS 中, 有几个非常重要的概念:

Bridge: Bridge 代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。
Port: 端口与物理交换机的端口概念类似,每个 Port 都隶属于一个 Bridge。
Interface: 连接到 Port 的网络接口设备。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 是一对多的关系。
Controller: OpenFlow 控制器。OVS 可以同时接受一个或者多个 OpenFlow 控制器的管理。
datapath: 在 OVS 中,datapath 负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。
Flow table: 每个 datapath 都和一个“flow table”关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。
Open vSwitch 实验环境配置

OVS 可以安装在主流的 Linux 操作系统中,用户可以选择直接安装编译好的软件包,或者下载源码进行编译安装。

在我们的实验环境中,使用的操作系统是 64 位 Ubuntu Server 12.04.3 LTS,并通过源码编译的方式安装了 Open vSwitch 1.11.0

$ lsb_release -a
No LSB moles are available.
Distributor ID:Ubuntu
Description:Ubuntu 12.04.3 LTS
Release:12.04
Codename:precise
OVS 的源码编译安装方式可以参考官方文档 How to Install Open vSwitch on Linux, FreeBSD and NetBSD。

安装完毕后,检查 OVS 的运行情况:

$ ps -ea | grep ovs
12533 ? 00:00:00 ovs_workq
12549 ? 00:00:04 ovsdb-server
12565 ? 00:00:48 ovs-vswitchd
12566 ? 00:00:00 ovs-vswitchd
查看 OVS 的版本信息, 我们安装版本的是 1.11.0

$ ovs-appctl --version
ovs-appctl (Open vSwitch) 1.11.0
Compiled Oct 28 2013 14:17:16
查看 OVS 支持的 OpenFlow 协议的版本

$ ovs-ofctl --version
ovs-ofctl (Open vSwitch) 1.11.0
Compiled Oct 28 2013 14:17:17
OpenFlow versions 0x1:0x4
基于 Open vSwitch 的 OpenFlow 实践

OpenFlow 是用于管理交换机流表的协议,ovs-ofctl 则是 OVS 提供的命令行工具。在没有配置 OpenFlow 控制器的模式下,用户可以使用 ovs-ofctl 命令通过 OpenFlow 协议去连接 OVS,创建、修改或删除 OVS 中的流表项,并对 OVS 的运行状况进行动态监控。

3. 如何让ubuntu开机自动运行脚本ovs

1. /etc/rc.local 文件添加 语句

可以在这文件里添加需要运行的脚本文件代码,代码要放在 exit 前面

可以用vi来进行编辑

vi/etc/rc.local
#!/bin/bash
pingwww..com(每次开机ping网络以下)
exit0

2. /etc/init.d


这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。举个例子来说,如果你要重新启动 sendmail 的话,而且你的 sendmail 是以 rpm 来安装的,那么下达 /etc/rc.d/init.d/sendmail restart 就可以直接启动 sendmail 啰!
前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别), 是该运行init.d里的脚本了,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。
那么,系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不一样,也大同小异),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活到init.d里的脚本。

linux /etc/rc.d/目录的详解

rc.d的内容如下:
init.d/ :各种服务器和程序的二进制文件存放目录。
rcx.d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。具体的后边叙述。
还有三个脚本:rc.sysinit, rc, rc.local

4. 谁知道数据结构顺序栈的插入和删除运算源代码啊

关于二十四点游戏的编程思路与基本算法

漫长的假期对于我来说总是枯燥无味的,闲来无聊便和同学玩起童年时经常玩的二十四点牌游戏来。此游戏说来简单,就是利用加减乘除以及括号将给出的四张牌组成一个值为24的表达式。但是其中却不乏一些有趣的题目,这不,我们刚玩了一会儿,便遇到了一个难题——3、6、6、10(其实后来想想,这也不算是个太难的题,只是当时我们的脑筋都没有转弯而已,呵呵)。

问题既然出现了,我们当然要解决。冥思苦想之际,我的脑中掠过一丝念头——何不编个程序来解决这个问题呢?文曲星中不就有这样的程序吗?所以这个想法应该是可行。想到这里我立刻开始思索这个程序的算法,最先想到的自然是穷举法(后来发现我再也想不到更好的方法了,悲哀呀,呵呵),因为在这学期我曾经写过一个小程序——计算有括号的简单表达式。只要我能编程实现四个数加上运算符号所构成的表达式的穷举,不就可以利用这个计算程序来完成这个计算二十四点的程序吗?确定了这个思路之后,我开始想这个问题的细节。
首先穷举的可行性问题。我把表达式如下分成三类——
1、 无括号的简单表达式。
2、 有一个括号的简单表达式。
3、 有两个括号的较复4、 杂表达式。
穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列,算法如下:
/* ans[] 用来存放各种排列组合的数组 */
/* c[] 存放四张牌的数组 */
/* k[] c[]种四张牌的代号,其中k[I]=I+1。
用它来代替c[]做处理,考虑到c[]中有可能出现相同数的情况 */
/* kans[] 暂存生成的排列组合 */
/* j 嵌套循环的次数 */
int fans(c,k,ans,kans,j)
int j,k[],c[];char ans[],kans[];
{ int i,p,q,r,h,flag,s[4],t[4][4];
for(p=0,q=0;p<4;p++)
{ for(r=0,flag=0;r if(k[p]!=kans[r]) flag++;
if(flag==j) t[j][q++]=k[p];
}
for(s[j]=0;s[j]<4-j;s[j]++)
{ kans[j]=t[j][s[j>;
if(j==3) { for(h=0;h<4;h++)
ans[2*h]=c[kans[h]-1]; /* 调整生成的排列组合在最终的表
达式中的位置 */
for(h=0;h<3;h++)
symbol(ans,h); /* 在表达式中添加运算符号 */
}
else { j++;
fans(c,k,ans,kans,j);
j--;
}
}
}

正如上面函数中提到的,在完成四张牌的排列之后,在表达式中添加运算符号。由于只有四张牌,所以只要添加三个运算符号就可以了。由于每一个运算符号可重复,所以计算出其可能的种数为4*4*4=64种。仍然利用嵌套函数实现添加运算符号的穷举,算法如下:

/* ans[],j同上。sy[]存放四个运算符号。h为表达式形式。*/
int sans(ans,sy,j,h)
char ans[],sy[];int j,h;
{ int i,p,k[3],m,n; char ktans[20];
for(k[j]=0;k[j]<4;k[j]++)
{ ans[2*j+1]=sy[k[j>; /* 刚才的四个数分别存放在0、2、4、6位
这里的三个运算符号分别存放在1、3、5位*/
if(j==2)
{ ans[5]=sy[k[j>;
/* 此处根据不同的表达式形式再进行相应的处理 */
}
else
}
}

好了,接下来我再考虑不同表达式的处理。刚才我已经将表达式分为三类,是因为添加三个括号对于四张牌来说肯定是重复的。对于第一种,无括号自然不用另行处理;而第二种情况由以下代码可以得出其可能性有六种,其中还有一种是多余的。
for(m=0;m<=4;m+=2)
for(n=m+4;n<=8;n+=2)
这个for循环给出了添加一个括号的可能性的种数,其中m、n分别为添加在表达式中的左右括号的位置。我所说的多余的是指m=0,n=8,也就是放在表达式的两端。这真是多此一举,呵呵!最后一种情况是添加两个括号,我分析了一下,发现只可能是这种形式才不会是重复的——(a b)(c d)。为什么不会出现嵌套括号的情况呢?因为如果是嵌套括号,那么外面的括号肯定是包含三个数字的(四个没有必要),也就是说这个括号里面包含了两个运算符号,而这两个运算符号是被另外一个括号隔开的。那么如果这两个运算符号是同一优先级的,则肯定可以通过一些转换去掉括号(你不妨举一些例子来试试),也就是说这一个括号没有必要;如果这两个运算符号不是同一优先级,也必然是这种形式((a+-b)*/c)。而*和/在这几个运算符号中优先级最高,自然就没有必要在它的外面添加括号了。

综上所述,所有可能的表达式的种数为24*64*(1+6+1)=12288种。哈哈,只有一万多种可能性(这其中还有重复),这对于电脑来说可是小case哟!所以,对于穷举的可行性分析和实现也就完成了。

接下来的问题就是如何对有符号的简单表达式进行处理。这是栈的一个着名应用,那么什么是栈呢?栈的概念是从日常生活中货物在货栈种的存取过程抽象出来的,即最后存放入栈的货物(堆在靠出口处)先被提取出去,符合“先进后出,后进先出”的原则。这种结构犹如子弹夹。
在栈中,元素的插入称为压入(push)或入栈,元素的删除称为弹出(pop)或退栈。

栈的基本运算有三种,其中包括入栈运算、退栈运算以及读栈顶元素,这些请参考相关数据结构资料。根据这些基本运算就可以用数组模拟出栈来。

那么作为栈的着名应用,表达式的计算可以有两种方法。

第一种方法——
首先建立两个栈,操作数栈OVS和运算符栈OPS。其中,操作数栈用来记忆表达式中的操作数,其栈顶指针为topv,初始时为空,即topv=0;运算符栈用来记忆表达式中的运算符,其栈顶指针为topp,初始时,栈中只有一个表达式结束符,即topp=1,且OPS(1)=‘;’。此处的‘;’即表达式结束符。
然后自左至右的扫描待处理的表达式,并假设当前扫描到的符号为W,根据不同的符号W做如下不同的处理:
1、 若W为操作数
2、 则将W压入操作数栈OVS
3、 且继续扫描下一个字符
4、 若W为运算符
5、 则根据运算符的性质做相应的处理:
(1)、若运算符为左括号或者运算符的优先级大于运算符栈栈顶的运算符(即OPS(top)),则将运算符W压入运算符栈OPS,并继续扫描下一个字符。
(2)、若运算符W为表达式结束符‘;’且运算符栈栈顶的运算符也为表达式结束符(即OPS(topp)=’;’),则处理过程结束,此时,操作数栈栈顶元素(即OVS(topv))即为表达式的值。
(3)、若运算符W为右括号且运算符栈栈顶的运算符为左括号(即OPS(topp)=’(‘),则将左括号从运算符栈谈出,且继续扫描下一个符号。
(4)、若运算符的右不大于运算符栈栈顶的运算符(即OPS(topp)),则从操作数栈OVS中弹出两个操作数,设先后弹出的操作数为a、b,再从运算符栈OPS中弹出一个运算符,设为+,然后作运算a+b,并将运算结果压入操作数栈OVS。本次的运算符下次将重新考虑。

第二种方法——
首先对表达式进行线性化,然后将线性表达式转换成机器指令序列以便进行求值。

那么什么是表达式的线性化呢?人们所习惯的表达式的表达方法称为中缀表示。中缀表示的特点是运算符位于运算对象的中间。但这种表示方式,有时必须借助括号才能将运算顺序表达清楚,而且处理也比较复杂。

1929年,波兰逻辑学家Lukasiewicz提出一种不用括号的逻辑符号体系,后来人们称之为波兰表示法(Polish notation)。波兰表达式的特点是运算符位于运算对象的后面,因此称为后缀表示。在对波兰表达式进行运算,严格按照自左至右的顺序进行。下面给出一些表达式及其相应的波兰表达式。
表达式 波兰表达式
A-B AB-
(A-B)*C+D AB-C*D+
A*(B+C/D)-E*F ABCD/+*EF*-
(B+C)/(A-D) BC+AD-/

OK,所谓表达式的线性化是指将中缀表达的表达式转化为波兰表达式。对于每一个表达式,利用栈可以把表达式变换成波兰表达式,也可以利用栈来计算波兰表达式的值。

至于转换和计算的过程和第一种方法大同小异,这里就不再赘述了。

下面给出转换和计算的具体实现程序——

/* first函数给出各个运算符的优先级,其中=为表达式结束符 */
int first(char c)
{ int p;
switch(c)
{ case '*': p=2; break;
case '/': p=2; break;
case '+': p=1; break;
case '-': p=1; break;
case '(': p=0; break;
case '=': p=-1; break;
}
return(p);
}
/* 此函数实现中缀到后缀的转换 */
/* M的值宏定义为20 */
/* sp[]为表达式数组 */
int mid_last()
{ int i=0,j=0; char c,sm[M];
c=s[0]; sm[0]='='; top=0;
while(c!='\0')
{ if(islower(c)) sp[j++]=c;
else switch(c)
{ case '+':
case '-':
case '*':
case '/': while(first(c)<=first(sm[top]))
sp[j++]=sm[top--];
sm[++top]=c; break;
case '(': sm[++top]=c; break;
case ')': while(sm[top]!='(')
sp[j++]=sm[top--];
top--; break;
default :return(1);
}
c=s[++i];
}
while(top>0) sp[j++]=sm[top--];
sp[j]='\0'; return(0);
}
/* 由后缀表达式来计算表达式的值 */
int calc()
{ int i=0,sm[M],tr; char c;
c=sp[0]; top=-1;
while(c!='\0')
{ if(islower(c)) sm[++top]=ver[c-'a'];/*在转换过程中用abcd等来代替数,
这样才可以更方便的处理非一位数,
ver数组中存放着这些字母所代替的数*/
else switch(c)
{ case '+': tr=sm[top--]; sm[top]+=tr; break;
case '-': tr=sm[top--]; sm[top]-=tr; break;
case '*': tr=sm[top--]; sm[top]*=tr; break;
case '/': tr=sm[top--];sm[top]/=tr;break;
default : return(1);
}
c=sp[++i];
}
if(top>0) return(1);
else
}

这样这个程序基本上就算解决了,回过头来拿这个程序来算一算文章开始的那个问题。哈哈,算出来了,原来如此简单——(6-3)*10-6=24。

最后我总结了一下这其中容易出错的地方——

1、 排列的时候由于一个数只能出现一次, 所以必然有一个判断语句。但是用什么来判断,用大小显然不行,因为有可能这四个数中有两个或者以上的数是相同的。我的方法是给每一个数设置一个代号,在排列结束时,通过这个代号找到这个数。

2、在应用嵌套函数时,需仔细分析程序的执行过程,并对个别变量进行适当的调整(如j的值),程序才能正确的执行。

3、在分析括号问题的时候要认真仔细,不要错过任何一个可能的机会,也要尽量使程序变得简单一些。不过我的分析可能也有问题,还请高手指点。

4、在用函数对一个数组进行处理的时候,一定要注意如果这个数组还需要再应用,就必须将它先保存起来,否则会出错,而且是很严重的错误。

5、在处理用户输入的表达式时,由于一个十位数或者更高位数是被分解成各位数存放在数组中,所以需对它们进行处理,将它们转化成实际的整型变量。另外,在转化过程中,用一个字母来代替这个数,并将这个数存在一个数组中,且它在数组中的位置和代替它的这个字母有一定的联系,这样才能取回这个数。

6、由于在穷举过程难免会出现计算过程中有除以0的计算,所以我们必须对calc函数种对于除的运算加以处理,否则程序会因为出错而退出(Divide by 0)。

7、最后一个问题,本程序尚未解决。对于一些比较着名的题目,本程序无法解答。比如说5、5、5、1或者8、8、3、3。这是由于这些题目在计算的过程用到了小数,而本程序并没有考虑到小数。

5. 如何在Linux发行版上安装和配置KVM和Open vSwitch

首先,安装用于构建OVS的依赖项。
$ sudo apt-get install build-essential libssl-dev linux-headers-$(uname -r)
通过源代码来构建OVS,如下所示。下列步骤将构建OVS内核模块以及OVS用户空间工具。
$ wget http://openvswitch.org/releases/openvswitch-1.9.3.tar.gz
$ tar xvfvz openvswitch-1.9.3.tar.gz
$ cd openvswitch-1.9.3
$ ./configure --with-linux=/lib/moles/`uname -r`/build
$ make
接下来,继续在/usr/local/share/下安装OVS用户空间组件:
$ sudo make install
下一步是,测试OVS内核模块(安装该模块之前)。为此,先在内核中装入内核模块。
$ sudo insmod ./datapath/linux/openvswitch.ko
证实OVS内核模块已成功装入。
$ lsmod | grep openvswitch
openvswitch 97934 0
一旦你证实openvswitch.ko已成功装入到内核中,继续安装内核模块,如下所示。
$ sudo make moles_install
配置和启动Open vSwitch
创建一个框架式OVS配置数据库。
$ sudo mkdir /etc/openvswitch
$ sudo ovsdb-tool create /etc/openvswitch/conf.db ./vswit
chd/vswitch.ovsschema
启动OVS数据库服务器。
$ sudo ovsdb-server --remote=punix:/usr/local/var/run/ope
nvswitch/db.sock - remote=db:Open_vSwitch,manager_options
--pidfile --detach
OVS配置数据库初始化。
$ sudo ovs-vsctl --no-wait init
最后,启动OVS守护程序。
$ sudo ovs-vswitchd --pidfile --detach
将KVM安装在Ubuntu或Debian上
使用apt-get命令,安装KVM和必要的用户空间工具。
$ sudo apt-get install qemu-kvm libvirt-bin bridge-utils
virt-manager
将一个普通的非根用户(如alice)添加到libvirtd群组,那样该用户不需要根用户权限,就能启动虚拟机。
$ sudo adser alice libvirtd
退出,重新以该用户身份登录,让群组成员的变更生效。
运行下面这个命令。如果你看到空空如也的虚拟机列表,这意味着KVM已成功设置完毕。
$ virsh -c qemu:///system list
Id Name State
为KVM配置Open vSwitch
现在是时候创建OVS网桥启动脚本了,那样启动或终止虚拟机时,OVS就能自动配置。
安装依赖项(用户模式Linux实用工具),这些依赖项将用于处理Linux网桥模式。
$ sudo apt-get install uml-utilities
创建网桥启动脚本,如下所示。
$ sudo vi /etc/openvswitch/ovs-ifup
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1
$ sudo vi /etc/openvswitch/ovs-ifdown
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
$ sudo chmod +x /etc/openvswitch/ovs-if*
然后,创建一个默认的网桥br0,并添加一个物理网络接口,虚拟机将通过这个接口与外部网络进行联系。在该教程中,我假设这类网络接口是eth5。
$ sudo ovs-vsctl add-br br0
$ sudo ovs-vsctl add-port br0 eth5
借助KVM启动虚拟机
现在你可以准备启动访客虚拟机了。
我假设,你已经准备好了一个访客虚拟机映像(比如ubuntu-client.img)。使用下面这个命令,启动访客虚拟机。
$ sudo kvm -m 1024 -net nic,macaddr=11:11:11:EE:EE:EE -ne
t tap,script=/etc/openvswitch/ovs-ifup,downscript=/etc/op
envswitch/ovs-ifdown -vnc :1 -drive file=/home/dev/images
/ubuntu-client.img,boot=on
这会创建并启动一个访客虚拟机;一旦访客虚拟机启动,其虚拟接口就自动添加到OVS网桥br0。
你可以使用ovs-vsctl这个命令,核实OVS的状态

6. openvswitch源码 从哪个文件开始看

建议先去了解下ovs的架构,ovs代码本身较为混乱,并且数据包处理(datapath)在内核空间,较为复杂。
大概了解模块结构后,可以去看看网上相关的源码分析,比自己看更快。
如果是自己去看,建议从一个bridge的创建到运行开始逐步深入,需要注意bridge的主循环中ctrlplane和dataplane没有分离,大量代码都是处理用户配置修改。

7. ovs 删除openflow流表

有如下三种方法可以删除openflow流表:
a. controller/ovs-ofctl主动发命令(OFPFC_DELETE or OFPFC_DELETE_STRICT)删除流表。OFPFC_DELETE_STRICT和OFPFC_DELETE 的区别是前者需要匹配所有的字段才能删除(包括优先级),并且一次只能删除一条流表,后者要求指定的字段必须是流表的一个子集(不能指定优先级),可以一次删除多个流表。

b. 流表的超时机制: 添加流表时如果指定idle_timeout或者hard_timeout参数,则流表超时后将被删除。如果不指定这俩参数,则默认不会被超时机制删除。hard_timeout指定的超时时间是从创建流表,或者修改流表开始计时,超时时间到后,不管此流表有没有被使用,都会被删除。idle_timeout指定流表空闲超时时间,从最近流表被使用开始计时,如果指定时间内此流表没有被使用,则被删除。
c. 强制回收机制: 添加流表时,如果当前流表个数大于等于最大流表个数,则判断是否可以强制回收之前添加的流表。可以通过Flow_Table里的overflow_policy参数指定当前流表个数大于等于最大流表个数时的行为,如果为refuse则拒绝添加新流表,如果为evict则强制删除即将超时的流表。强制回收只考虑指定了超时时间的流表。

添加流表时,如果指定了超时时间,并且流表指定的field包含group指定的field,则会将流表添加到一个分组中。具体为根据group指定的这些field计算hash值,再根据hash值到table->eviction_groups_by_id查找struct eviction_group。然后根据超时时间计算优先级,根据优先级将此流表插入struct eviction_group

针对强制删除流表,可以做如下实验

下面分析下这三种情况下的源码
controller/ovs-ofctl主动删除流表

将流表从分类器中删除

超时机制
添加流表时,如果指定了超时时间,则会将流表挂到链表ofproto->expirable上,在ovs-vswitchd的主循环中,会周期性的调用ofproto-dpif.c中的run函数,此函数会遍历链表ofproto->expirable判断流表是否超时,如果超时则将流表删除。

evict强制删除
添加流表时会将流表插入eviction_group中

当再次添加流表时,如果当前流表个数超过最大流表个数,则

8. 如何加载open vswitch kernel moudel

将Open vSwitch安装在Ubuntu或Debian上
虽然OVS以程序包的方式出现在Ubuntu或Debian上,但我在此还是通过源代码来构建OVS,这将拥有最新的功能特性和修正版。

首先,安装用于构建OVS的依赖项。

$ sudo apt-get install build-essential libssl-dev linux-headers-$(uname -r)
通过源代码来构建OVS,如下所示。下列步骤将构建OVS内核模块以及OVS用户空间工具。

9. openstack 基础 什么是ovs

使用的是Python和C++。 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。 OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它的社区拥有超过130家...

热点内容
android键盘开发 发布:2025-05-10 13:06:16 浏览:814
百度百科图片上传 发布:2025-05-10 12:51:38 浏览:564
dayz怎么搭建单人服务器 发布:2025-05-10 12:46:39 浏览:408
gifshow是什么文件夹 发布:2025-05-10 12:40:42 浏览:892
keil编译VS工程 发布:2025-05-10 12:39:41 浏览:42
android输入子系统 发布:2025-05-10 12:34:19 浏览:991
美团抵用密码在哪里看 发布:2025-05-10 12:31:15 浏览:935
sql数据库查询语句大全 发布:2025-05-10 12:29:41 浏览:420
微信点餐小程序源码 发布:2025-05-10 12:23:57 浏览:478
c语言读写结构体 发布:2025-05-10 12:19:16 浏览:491