导航:首页 > 源码编译 > ovs编译执行

ovs编译执行

发布时间:2023-01-09 20:03:37

㈠ 如何让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

㈡ 如何在linux系统下使用ovs-vsctl

在正式下载安装OVS之前我们需要安装一些系统组件及库文件以作为OVS正确运行的环境依赖。请切换至root用户进行操作。
# apt-get update
# apt-get install -y build-essential

注:正常运行使用OVS只需要安装上述依赖即可,如果需要进一步开发OVS可能需要其他环境依赖,可以自行度娘。
部署Open vSwitch 2.3.0
1.下载OVS 2.3.0安装包。
2. 解压OVS 2.3.0安装包。

# wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz
# tar -xzf openvswitch-2.3.0.tar.gz
3. 构建基于Linux内核的交换机。
# cd openvswitch-2.3.0
# make clean
# ./configure --with-linux=/lib/moles/`uname -r`/build 2>/dev/null

4. 编译并安装OVS 2.3.0。

# make && make install

5. 如果需要OVS支持VLAN功能,还需要加载openvswitch.ko模块,如果不需要,此步可以忽略。

# modprobe gre
# insmod datapath/linux/openvswitch.ko

6. 我们需要安装并加载构建的内核模块。
# make moles_install
# /sbin/modprobe openvswitch

7. 使用ovsdb工具初始化配置数据库。

# mkdir -p /usr/local/etc/openvswitch
# ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema

注:vswitchd/vswitch.ovsschema 指的是当前openvswitch工程目录下的。
至此,如果没有报错的话OVS的部署已经成功完成。如果中间步骤出现问题,请仔细检查是否按步骤进行或有无单词拼写错误。

㈢ 如何使用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 的运行状况进行动态监控。

㈣ Dpdk与OpenvSwitch

1、DPDK
DPDK是X86平台报文快速处理的库和驱动的集合,大多数情况下运行在linux的用户态空间。

2、Open vSwitch
简称OVS是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer, KVM, and VirtualBox多种虚拟化技术。
在这种某一台机器的虚拟化的环境中,一个虚拟交换机(vswitch)主要有两个作用:传递虚拟机VM之间的流量,以及实现VM和外界网络的通信。
在 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,执行对应的操作, 例如转发数据到另外的端口。

3、OVDK

㈤ openswitch安装apt

1.更新系统sudoapt-getupdate,sudoapt-getupgrade2.安装OVS,sudoapt-getinstallopenvswitch-switch3.验证sudoovs-vsctlshow。
在补充的时候安装libssl相关套件,以及其他需要的套件。
还有一种方法,首先更新可安装的组件,安装相关依赖,从ovs的git仓库下载源码文件,并进入到ovs文件中,在ovs目录下执行,编译安装,最后启动。

㈥ ovs-dpdk-docker部署VNF实践

关于docker的基本概念相关,可以参考 官网介绍 ,介绍的挺全面的。另外这篇 文章 介绍的也很清晰,并附带有可以直接上手的实例。

关于container和vm的对比,需要重点关注下,直接放图如下:

由于我们公司大多的产品都是基于dpdk框架来实现,所以选取在docker中部署dpdk来进行预研。目前dpdk官网提供两种方案来支持container,如下图:
[图片上传失败...(image-848e3f-1591447286699)]
上图(1) 方案中需要NIC支持SR-IOV功能,物理NIC支持的VF个数也依赖于硬件资源;每个container的接口独占VF,多个VF共享下面的一个PF。基于这种方案实现的container,无论对硬件的依赖和绑定,还是container的迁移,支持性都做得不够好。
上图(2) 方案中需要在host中运行vswitch或者vRouter来将上层的containers和底层的物理NIC解耦,只要vswitch(当前比较流行的OVS+DPDK,将OVS放在用户态来实现)的性能足够,一样可以实现高性能的container app了。

基于以上比较,本次预研主要选取第二种方案来实现,该方案中container中涉及的组件如下图所示:
[图片上传失败...(image-36e69c-1591447286699)]

方案中使用virtual device(包括virtio-user和vhost-user backend)来实现高性能的container App 或者IPC。Virtio使用共享内存的方式来收发报文,传统的VM可以通过qemu来共享vhost后端的物理地址,但对container而言,作为系统的一个进程,使用这种方式则比较难。目前的思路是只能使用DPDK初始化的hugepages来进行内存共享。所以,要在container中使用dpdk,必须要分配足够的大页内存,且不同container在使用共享内存时要能够分区使用,避免地址重复。

hugepage的配置(配置使用1G大小的hugepagesize,同时最多分配8个):

pktgen的安装依赖于DPDK,安装前确保RTE_SDK和RTE_TARGET环境变量设置正确。

可以检查系统配置如下:

至此ovs就启动并配置好了,vhost-user backend口已经创建好,相应的流表路由表项也已经添加好,接下来就该部署container了。

l2fwd和testpmd都属于dpdk提供的app,使用同一个container即可。创建container时把之前build的dpdk目录到docker中。

同理,把之前编译好的pktgen映射到container中即可。此外需要注意的是,pktgen依赖libpcap,所以需要在container中安装一份。使用时还发现运行container提示无法找到共享库libpcap.so.1, 而安装libpcap后只有libpcap.so,解决办法就是做个软链就可以了。
具体的配置步骤如下:

pktgen端:

pktgen端:

说明l2fwd已按照我们的预想进行了报文的转发。

本次预研实践主要还是集中在OVS上面的container App的互通以及container内部对dpdk的支持,分别验证了在container内部运行testpmd和l2fwd来进行报文转发。其中,dpdk app的运行模式可以为后续cneos平台server docker化提供一定的技术指导作用。
如果从更系统化的层面来考虑docker结合ovs以及dpdk的使用,更通用的使用场景应该是这样的:在ovs的南向通过dpdk pmd和硬件平台上物理nic的PF或VF绑定,高速收发报文;在ovs的北向,通过virtual device和docker container来共享收发报文,进行上层业务的处理。 南北向之间的流量需要配置flow table来指导转发。流量示意如下图所示:

㈦ OVS(Open vSwitch)注包

OVS注包的场景:

UCloud的 SDN 网络是基于OVS做的。为了进行内网监控,需要 测试 用户的两台云主机通信是否正常。但是,作为服务方我们是无法登陆到用户的云主机的。因此,采用了向源端的OVS中注入一个ping包的方法测试网络是否正常。

基本原理

实验环境示意图:实现不登陆进SRC VM的前提下,发送Ping的请求包给DST VM,并捕获返回的应答包Ping Response。

染色:

用户有可能自己也会发送Ping包,为了区分用户的应答包和注入方式得到的应答包,需要对注入的Ping Request进行染色。首先看下ICMP包的格式,如下所示。

黄色标记起来的Identifier字段含义如下(RFC 792)

The identifier and sequence number may be used by the echo sender to aid in matching the replies with the echo requests

通过设置Identifier的值,可以区分不同的请求对应的应答包。

这里我们设置Identifier=111,捕获数据包时,需要指定ICMP包 icmp[4:2]=111,表明ICMP的第四、第五个字节的值等于111.

注入Ping Request包

需要使用ovs-ofctl packet-out进行注包操作,命令格式如下:

ovs-ofctl packet-out switch in_port actions packet...

说明:

1、packet-out:连接到OVS,并且让OVS对Packet执行某个Action

Connects  to  switch  and  instructs it to execute the OpenFlow actions on each packet

2、switch:交换机的名字,比如实验环境中的br0

3、in_port:SRC VM连接到OVS的端口号,就是实验环境示意图中的In Port

4、packet:数据包,实验中就是染了色的Ping Request数据包。

5、Action:关键是Action的选择,我们采用的是resubmit,说明如下。resubmit会找到数据包对应的流表,然后更换掉in_port并执行流表中的Action。我们这里设置port=in_port。所以仅仅会执行流表中的Action。

resubmit([port],[table]):Re-searches this OpenFlow flow table with thein_portfield replaced byportand executes the actions found

捕获Ping的Response包

采用tcpmp进行捕获染了色的Ping数据包。命令如下

tcpmp -c 1 -iVIRTUAL_INTERFACEicmp and src hostSRC_IPand dst hostDST_IPand icmp[4:2]=111

1. VIRTUAL_INTERFACE: 云主机使用虚拟网卡的名字

2. SRC_IP:源云主机的IP地址

3. DST_IP:目的云主机的IP地址

4. 111:染色标记

golang实现的主逻辑

injectICMPCmd=util.GetInjectICMPPacket(srcIp,dstIp,srcMac,dstMac)//构造染了色的Ping Request包,以及注入命令tcpDumpCmd=util.TcpDumpICMPCommand(iface,srcIp,dstIp)//构造tcpmp的抓包命令tcpDumpResponse:=make(chanstring)srcHostIp:="XXX"//宿主机的IP地址gofunc(){command:=fmt.Sprintf("ssh %s@%s %s","root",srcHostIp,tcpDumpCmd)util.SshRunWithChannelResponse(command,tcpDumpResponse)}()// inject Packet into OVStime.Sleep(100*time.Millisecond)gofunc(){command:=fmt.Sprintf("ssh %s@%s %s","root",srcHostIp,injectICMPCmd)util.SshRun(command)}()success:=trueselect{casemsg:=<-tcpDumpResponse:ifstrings.Contains(msg,dstIp){fmt.Printf("Checking Success, Response: %s\n",msg)}else{success=falsefmt.Printf("Checking Fail, Response: %s\n",msg)}}returnsuccess

阅读全文

与ovs编译执行相关的资料

热点内容
phpsae源码 浏览:853
为什么安卓手机一直要权限 浏览:227
汇编程序的伪指令 浏览:803
苹果7怎么更新app 浏览:318
c语言常用算法pdf 浏览:960
编程如何让画面动起来 浏览:865
大龄女程序员未来发展 浏览:976
数学书籍pdf 浏览:506
加密门禁卡写入成功无法开门 浏览:464
齿轮传动pdf 浏览:52
alpinelinux 浏览:150
手机端app的扫码功能在哪里 浏览:227
少儿编程中小班英语教案 浏览:452
锁屏密码加密手机怎么解除 浏览:205
linuxlostfound 浏览:135
征途服务器ip地址 浏览:330
git提交代码命令行 浏览:165
什么叫浏览器服务器结构 浏览:157
于谦聊天哪个app 浏览:449
小鹏汽车nlp算法工程师薪资 浏览:881