为了获得stable分支我们需要将hydrogen的stable分支checkou到本地,并将其命名为myhydrogen
git checkout -b myhydrogen remotes/origin/stable/hydrogen
这时候再用git branch看本地分支就多了一个myhydrogen分支,并且同时切换到了该分支(当然也可以随时切换到master分支:git checkout master)
这时候代码就是hydrogen版本的stable分支了 3、编译代码
46
按照上述说明获得controller、openflowjava、openflowplugin三个项目的hydrogen版本的stable分支代码后就可以进行编译。
上述三个项目的依赖关系如下: openflowjava依赖controller;
openflowplugin依赖openflowjava和controller 因此编译顺序如下: 编译controller 编译openflowjava 编译openflowplugin
最后在openflowplugin的distribution下面就生成了带OF1.3的版本。例如:D:\\openflowplugin\\distribution\\base\\target\\distributions-openflowplugin-base-0.0.2-1-SNAPSHOT-osgipackage\\opendaylight,就是源代码编译出来的版本。值得注意的是controller下的distribution下的版本是不带openflowplugin和openflowjava的。
OpenDaylight研究的一些感受
分类: OpenDaylight 2014-03-22 09:27 1678人阅读评论(0) 收藏举报 目录(?)[+]
前阵子研究了OpenDaylight的发布前的版本,主要是AD-SAL模型和OF1.0的支持以及SNMP4SDN项目。最近正在研究release版本的Yang工具相关的MD-SAL模型,兼容OF1.0和OF1.3的OpenflowPlugin项目及其相关流程,也基本上搞懂了里面的来龙去脉。结合研究过程和遇到的一些问题谈一些个人感受。
OpenDaylight的主要优点(主要的设计原则和开源项目)
OSGi体系结构:采用OSGi体系结构,做到了功能的隔离,解决了可扩展性、热部署等等问题。
SAL(Service Abstract Layer):整个架构中引入了业务抽象层(思科的贡献),使得上层(北向)和下层(南向)之间的调用相互隔离,这个设计模式中的Dependence Inversion Principle 原则一致。
MD(Model Drive):使用Yang工具,使用业务模型驱动来设计接口、实现业务功能,根据yang文件,Yang工具直接生成业务管理的“骨架”,使开发者真正专注于具体业务。
In?nispan :用开源的数据网格平台实现Controller的集群。 Netty:南向使用Netty来管理底层的并发IO。 Jersey:北向使用Jersey提供REST接口。 OpenDaylight目前感觉存在的一点问题
47
版本演进过程没有清晰的说明,并且存在很多废弃的代码。
版本功能较多,没有如何定制、“瘦身”的相关说明,这样整个ODL给人“大象”的感觉。
文档不够完善,我曾开玩笑的抱怨“凡是文档不齐全的开源都是耍流氓”,看代码非常累。
相关的测试环境、工具还不够成熟。
目前还没有基于该平台的Demo或者原型,基本上还是处于研究阶段,我们很难感受到直观的SDN,当然这也是研究的目的。
OpenDaylight学习、研究建议
背景技术要掌握,Java、Maven、OSGi等核心技术要掌握
对里面的项目或者开源项目学习要基于“需求驱动”,不可能把里面开源项目的所有代码都研究清楚,应该结合研究的重点,有针对的去看代码。
多关心OpenDaylight 相关组织和论坛的动向,和小伙伴们多交流。 等等
3.3 OpenDaylight与Mininet应用实战
本文版本较老,仅供参考。
3.3.1 基本环境搭建
简要介绍在没有OpenFlow硬件设备下如何搭建一个OpenFlow环境。控制器使用OpenDaylight(以下简写为ODL),是现在主流的控制器项目,功能比较完善。模拟OpenFlow设备使用Mininet,远比基于KVM的虚拟机应用更高效、更简洁,且更容易理解。 3.3.1.1
环境准备
主要的最简单的环境准备是:一台PC及安装VMware station(或VirtualBox)工作站用来承载VM。 3.3.1.2
ODL获取安装
可直接通过地址链接下载ODL的VM镜像:
http://archive.openflow.org/wk/index.php?title=OpenDayLight_Tutorial,下载此镜像后,可用VMware station直接打开此VM,使用并启动ODL。如想具体了解ODL的安装详情,可搜索有关ODL的文档,会在技术文档中更新ODL的具体安装。
48
打开VM后,先进入OpenDaylight目录:
cd opendaylight/opendaylight/distribution/opendaylight/
再进入OpenDaylight启动目录:
cd target/distribution.opendaylight-package/opendaylight
执行:
run.sh
在浏览器中(VM环境或本地环境)输入http://[VM_IP]:8080可转到如下登录界面,其中[VM_IP]替换为控制器IP。登录用户名:admin,密码:admin,登录进入ODL的Web界面查看并可对ODL操作。
3.3.1.3
Mininet获取安装
Mininet主要是虚拟出OpenFlow交换机以及host主机节点,并且能通过自定义来构造用户想要的拓扑。虚拟OpenFlow交换机主要是使用基于Open vSwitch的应用。
从http://mininet.org/download/下载Mininet的VM镜像,打开此镜像后,用户名为mininet,密码为mininet。登录进入Mininet虚拟机,之后即可通过 mn命令来创建拓扑。后续也会提供Mininet的源码编译安装方法。 3.3.1.4
支持OpenFlow的wireshark插件安装
建议wireshark安装在ODL的VM上,因为ODL的VM是桌面版,可直接显示wireshark的抓包数据。1.6版本的wireshark要支持OpenFlow,需要做如下操作(注:此文档配置只支持1.6版本)。
4.1下载安装OpenFlow
$ sudo apt-get install git-core automake m4 pkg-config libtool
49
$ git clone git://openflow.org/openflow.git或git clone git://gitosis.stanford.edu/openflow.git $ cd openflow $ ./boot.sh
4.2 安装编译命令 在openflow目录下执行
$ sudo apt-get install gcc $ ./configure $ make
$ sudo make install
4.3 安装Wireshark Dissector(扫描器) 在openflow目录下,获取wireshark
$ sudo apt-get install wireshark libgtk2.0-dev
安装并编译:
$ cd utilities/wireshark_dissectors/openflow
修改utilities/wireshark_dissectors/openflow/packet-openflow.c文件的769行(注:“:set nu” 命令可显示行数)
dissector_add(TCP_PORT_FILTER, global_openflow_proto, openflow_handle)
改为:
dissector_add_uint(TCP_PORT_FILTER,global_openflow_proto,openflow_handle)
修改保存后编译:
$ make
$ sudo make install
将编译好的库packet-openflow.so放入wireshark插件目录,命令如下:
$ scp packet-openflow.so /usr/lib/wireshark/libwireshark1/plugins/
查看目录/usr/lib/wireshark/libwireshark1/plugins/的文件,含有packet-openflow.so文件。
在root用户权限下执行命令,打开wireshark:
$ wireshark &
50
1 SDN
1.1 什么是SDN
软件定义网络(Software Defined Network, SDN),是由美国斯坦福大学clean slate研究组提出的一种新型网络创新架构,SDN 技术就相当于把每人家里路由器的的管理设置系统和路由器剥离开。以前我们每台路由器都有自己的管理系统,而有了SDN之后,一个管理系统可用在所有品牌的路由器上。如果说现在的网络系统是功能机,系统和硬件出厂时就被捆绑在一起,那么SDN 就是Android系统,可以在很多智能手机上安装、升级、使用,同时还能安装更多更强大的手机 App(SDN 应用层部署)。
SDN的设计理念是将网络的控制面与数据转发面进行分离,并实现可编程化控制。SDN的典型架构共分三层,最上层为应用层,包括各种不同的业务和应用;中间的控制层主要负责处理数据平面资源的编排,维护网络拓扑、状态信息等;最底层的基础设施层负责基于流表的数据处理、转发和状态收集。
图3 SDN网络结构
从传统的网络设备(路由器,交换机)的设计上看,它由软件控制和硬件数据通道组成。软件控制包括管理(CLI,SNMP)以及路由协议(OSPF,ISIS,BGP)等。数据通道包括针对每个包的查询、交换和缓存。此时如果将网络中所有的网络设备视为被管理的
1
资源,那么参考操作系统的原理,可以抽象出一个网络操作系统(Network OS)的概念,这个网络操作系统一方面抽象了底层网络设备的具体细节,同时还为上层应用提供了统一的管理视图和编程接口。这样,基于网络操作系统这个平台,用户可以开发各种应用程序,通过软件来定义逻辑上的网络拓扑,以满足对网络资源的不同需求,而无需关心底层网络的物理拓扑结构。
SDN的好处:
SDN本质上具有“控制和转发分离”、“设备资源虚拟化”和“通用硬件及软件可编程”三大特性,这带来了一系列的好处。
第一,设备硬件归一化,硬件只关注转发和存储能力,与业务特性解耦,可以采用相对廉价的商用的架构来实现。
第二,网络的智能性全部由软件实现,网络设备的种类及功能由软件配置而定,对网络的操作控制和运行由服务器作为网络操作系统(NOS)来完成。
第三,对业务响应相对更快,可以定制各种网络参数,如路由、安全、策略、QoS、流量工程等,并实时配置到网络中,开通具体业务的时间将缩短。
SDN的三大要素:
1. 转发与控制分离,这使得网络交换机的数据转发变得更加简单、快速;同时,控制变成了网络操作系统中一个相对集中的逻辑功能。
2. OpenFlow协议,它向交换机传送转发表,交换机依此转发报文。这种做法与传统网络完全不同。在传统网络架构中,交换机和路由器需要自己决定报文的转发路径,这可能会给网络运营商带来一些不可预知的负面影响,包括成本增加、性能降低、上市时间延缓等。有了SDN,控制软件决定报文的转发路径,使得运营商可以“随心所欲”地控制网络。
3. 具有一致性的、全系统范围的网络操作系统可编程接口,它能让网络实现真正意义上的可编程或者软件定义。如果不能实现转发与控制分离,那么几乎所有SDN所能带来的好处都无法体现;如果能实现转发和控制分离,但没有OpenFlow协议,那么就需要通过其它途径,将所需要的流量表信息传递给交换机。OpenFlow就是实现这一功能的行业标准。
1.2 我所理解的SDN
闵应骅
下一代互联网,大家都关心,方案也很多了。最近,看见国内那么多权威人士在各种场合大谈SDN,介绍SDN,总是不甚了了,都是比较宏观,比较笼统抽象,看不出来与现在的因特网有什么不同。只得静下心来读文章。看了一些文章以后,有了一些感想。不知是否正确,与大家分享一下,欢迎批评指正
2
1.2.1 为什么要搞SDN
因特网存在和发展了几十年。随着服务类型和规模的急剧增加出现了一些问题。长期以来通过命令行接口的手动配置阻碍了网络虚拟化的前进,操作费用高,网络刷新慢,容易引入差错。取消把应用联系到特定网络详情,譬如端口和地址,使物理具体事项的改变无需重写应用和手动配置网络设备的时延和费用,也许是一种思路。路由是一个大问题。路由器里面的路由表越来越复杂,分散到各地去路由,既做不到最优的路由,又产生许多重复的计算。从你的PC到一个网站浏览器,可能要经过20-100路由器或交换机。如果一个包到来,只知道目的地,但不知道怎么走,那只有交给下一跳。下一跳要是也不知道呢?这么盲目跳下去,怎么就相信会到达目的地呢?那只能靠相邻路由器经常交换信息。由于各路由器独立工作,就会有许多重复计算。ISP只考虑自己这一块,并不管整个因特网。路由表只可能存本自治域的地址,区域外则送网关路由器。路由算法复杂就在于根据线索推断它所应该知道的东西。就像没有地图在高速公路上开车。如果能集中考虑路由就会更有效率。
再说应用。在智能手机中,一个应用可以使一个API为其他开发者所用,而不需要修改原来的应用。譬如说,谷歌地图提供一个API,某饭店可以把它的地点加进去。这些地址信息实际上重构了谷歌地图的数据,但不需要修改谷歌地图数据的结构。如果应用可以跳过网络交换,通过API,重构网络资源,就更能适应该应用的需要。现在的网络主要不是传送信息。它们并不需要智能自动控制,不需要基于线路交换的增值服务。我们需要统一的控制平面处理包交换和线路交换来提供服务。而IP网络不利于支持频繁的动态链路和动态连接。由于服务的多样化;用户数量增加,IP网络协议可以说是头痛医头、脚痛医脚,修补的补丁很多。而SDN统一在控制平面里面用编程来解决。功能网络图使许多网络功能可以用集中方式实现,又简单,又可扩展。又如游戏。游戏者在移动、在不同地方玩同一个游戏,地址不同、网速不同,比赛怎么能公平?OpenFlow可以使地址不变,在同一个游戏服务器上,基本保持网速不变。自己笔记本上的软件也不变。
再说管理。分散管理的方式不是最有效的。现在的SDN实现基本上是试验性的,但已减少网络管理经费50%,减少IP地址使用60%。谷歌把它连接全世界数据中心的G-Scale WAN换成OpenFlow网络,使预留空间的利用率提高95%,不损失任何东西。
再说安全。安全规则越来越多,分散管理各自为政,很难保证切实实行。集中管理起来以后,只要在控制层面不断完善和修改,就可以达到安全要求。
总之,现在网络的分散管理和信息处理,不如集中起来更加高效。
1.2.2 SDN与传统的因特网有什么不同
SDN体系结构用下图表示比较直观。
3
现在的因特网是点对点,用路由器、交换机、负载均衡器、网络地址翻译器或防火墙等连接起来。而SDN把网络作为一个整体的平台,将网络的控制平面与数据转发平面进行分离,并实现可编程化控制。在控制平面,网络操作系统就是控制器。它控制所有的APP,以及安全策略。在数据平面,网络基础设施,包括OpenFlow交换机。每个交换机除了存有流表之外,就是一个交换CPU。控制平面与数据平面的联系通过一个应用程序接口,譬如OpenFlow,遵循OpenFlow协议。当包到达交换机,交换机判断是不是一个流表中的入口。假如是,流表给出怎样传送该包;如果不是,交换机产生packet_in信息送回控制器。控制器把这事通知适当的控制应用。此应用根据网络状态和该应用逻辑,送回一个消息packet_out或者增加、修改流入口。控制平面根据流量特征进行交换排队。反应模式、状态要求和拓扑发现使控制平面完全可见和网络动态控制。拓扑发现包括控制屏幕集中管理相互连接着的交换机群(OpenFlow island)。控制器可以指令数据平面从交换机端口送出链路层发现协议(Link Layer Discovery Protocol)包到链接。基于这些信息,控制平面可以判断流岛内的连通性,从而构造网络拓扑。SDN的基础建设包括OpenFlow交换机,WiFi接入点(运行OpenFlow软件交换),虚拟局域网运行OpenFlow。网络路由优化、安全、策略、QoS、流量工程等,都在控制平面解决。所有网络控制逻辑作为网络操作系统上面的应用。这些应用做出控制决策,处理一个带说明的网络图,这就是软件定义的网络。
1.2.3 怎么研究SDN
在美国,整个试验如果从2007年算起,已经进行了8年。他们的试验由斯坦福大学牵头,组织普林斯顿、华盛顿、威斯康星、佐治亚理工学院、堪萨斯等10几所大学校园网通力合作,做了四个阶段的试验,一次比一次深入。他们在文章中,公开每一
4
阶段都了什么试验,解决了什么问题。介绍该项研究的文章有8个人署名,致谢的人按贡献的领域大约有上百人。
这样大规模的试验,大家不是来抢大头的科研经费,而是协作怎么能让这事搞成。和我们国家的情况有所不同。我们的大单位、大牛常常是竞争课题,分完钱就各司其事了,做的结果对大众好像也没个交待,或者是开发一个已经成熟的网络给大家用,没有科研结果,也就完了。这是科研吗?这能创新吗?他们的研究中还有一个特点,就是尽量使用公司的产品,让公司出产品、出人力、物力,参与研制。公司对此也很有兴趣。因为公司要考虑:如果SDN真正商业化,自己能做什么,公司能得到什么利益。
上述粗略的介绍对于关心SDN的朋友也许会有一个概略的了解。但是,由于本人也是初学,而且,SDN是一个新的网络体系结构,问题还很多。本人衷心希望内行和外行的朋友多多提出问题。这种交流也许本身就是一种研究。
1.3 SDN案例之王:Google B4网络
如果要问当前最著名、最有影响力的基于SDN技术搭建的商用网络是哪个,我想大多数人都会投票给Google的B4网络,一方面因为Google本身的名气,另一方面也是因为Google在这个网络的搭建上投入大、周期长,最后的验证效果也很好,是为数不多的大型SDN商用案例,而且非常成功,是充分利用了SDN优点(特别是OpenFlow协议)的案例。
1.3.1 背景介绍
Google的网络分为数据中心内部网络(IDC Network)及骨干网(Backbone Network,也可以称为WAN网)。其中WAN网按照流量方向由两张骨干网构成,分别为:第一,数据中心之间互联的网络(Inter-DC WAN,即G-scale Network),用来连接Google位于世界各地之间的数据中心,属于内部网络;第二,面向Internet用户访问的网络(Internet- facing WAN,即I-Scale Network)。Google选择使用SDN来改造数据中心之间互联的WAN网(即G-scale Network),因为这个网络相对简单,设备类型以及功能比较单一,而且WAN网链路成本高昂(比如很多海底光缆),所以对WAN网的改造无论建设成本、运营成本收益都非常显著。他们把这个网络称为B4(我在网上搜了一下也没找到该名字的由来)。
Google的数据中心之间传输的数据可以分为三大类: 1. 用户数据备份,包括视频、图片、语音和文字等;
2. 远程跨数据中心存储访问,例如计算资源和存储资源分布在不同的数据中心; 3. 大规模的数据同步(为了分布式访问,负载分担)。
5
IFlowProgrammerNotifier(plungin) IPluginOutFlowProgrammerService IPluginOutConnectionService 全局接口……
…… 主要的接口导出和依赖关系的类示意图见,分析代码过程可以参考这些图顺藤摸瓜,研究里面的机制
http://download.csdn.net/detail/ictcamera/6860635 4、理解
Container和Componet的关系呢?
每个具体的接口实现和容器的Container为关键字通过DependencyManager(依赖管理)创建一个Componet,这里每个Component就是一个服务,里面说明了导出的接口和依赖的接口,DependencyManager以Component的形式来管理依赖。见源代码中的ContainerManager.java。
Container和Cluster关系?
Container是OpenDaylight中的一个网络域,默认是default,北向bound提供的API可以增加、删除、修改Container,查询Container中的信息(有很多链接信息、整个域网络信息)。Cluster管理模块也管理集群Controllers(OpenDaylight)中的所有Container信息。
(六)添加流表流程(North-To-South)
分类: OpenDaylight 2014-01-18 08:11 1203人阅读评论(0) 收藏举报 1、org.opendaylight.controller.flows.web.Flows: public
String
actionFlow(@RequestParam(required
=true)
String
action,@RequestParam(required =false) String body,
@RequestParam(required =true) String nodeId, HttpServletRequest request,
41
@RequestParam(required =false) String container) 2
org.opendaylight.controller.forwardingrulesmanager.internal.ForwardingRulesManager:
public Status addStaticFlow(FlowConfig config)
3、opendaylight.controller.sal.implementation.internal. FlowProgrammerService: public Status addFlow(Node node, Flow flow)
4、rg.opendaylight.controller.protocol_plugin.openflow.core.internal.SwitchHandler: private Object syncMessageInternal(OFMessage msg, int xid, boolean syncRequest),这个方法使用Controller对象获取Socke信息,Controller是整个南向OpenFlow Plugin的总控
[原]OpenDaylight实战手记(七)添加网元流程(South -To- North)
2014-1-18阅读1308 评论4
1、org.opendaylight.controller.protocol_plugin.openflow.core.internal.ControllerIO
controllerIOThread线程的runnabble接口中接收设备的连接请求
2、org.opendaylight.controller.protocol_plugin.openflow.core.internal.Controller public
每个连接请求对应一个switch,new一个SwitchHandler,然后调用SwitchHandler的start()方法
3、org.opendaylight.controller.protocol_plugin.openflow.core.internal.SwitchHandler
start()方法启动收发线程和消息通道。
4、org.opendaylight.controller.protocol_plugin.openflow.core.internal.SwitchHandler
void
handleNewConnection(Selector
selector,
SelectionKey
serverSelectionKey)
、
42
接收线程switchHandlerThread,接受消息、处理消息:主要从IMessageReadWrite msgReadWriteService这个接口获取接受到的消息,判断OFMessage类型消息的用途,对应不同通途进行处理。
5、org.opendaylight.controller.protocol_plugin.openflow.core.internal.Controller
如果是对交换机进行处理(增加、删除、更新),调用public void takeSwitchEventMsg(ISwitch sw, OFMessage msg)方法,然后生成交换机事件SwitchEvent,放到交换机时间处理队列,PriorityBlockingQueue
6、org.opendaylight.controller.protocol_plugin.openflow.internal.InventoryServiceShim
InventoryServiceShim
中
通
过
private UpdateType plugin
listeners
void type, ,
notifyInventoryShimListener(NodeConnector IInventoryShimInternalListenerSet
注:交换机的删除和更新也是类似
基于OpenDaylight的二次开发一步一个脚印(一)GIT源代码 分类: OpenDaylight 2014-08-17 11:24 915人阅读评论(4) 收藏举报 目录(?)[+] Git学习准备
可以大概学习下git相关知识。参考http://www.liaoxuefeng.com/的git教程 下载git
下载git安装程序mysysgit(这是git的客户端,包含了git本地功能,而git的服务器功能需要另外安装github for windows,在普通的pull和push code,只要按照mysysgit就可以了),下载的安装程序例如 Git-1.8.5.2-preview20131230.exe,官方下载地址http://code.google.com/p/msysgit/downloads/list,
43
nodeConnector, 后
通
知
Set
,
然
Container,通知
notifyInventoryShimExternalListener(NodeConnector nodeConnector, UpdateType type,
安装git
安装过程使用默认选择项目,一直Next即可。参照百度经验如何在windows下安装GIT_百度经验。
配置GIT
1. 安装完成GIT后运行Git Bash(不知什么原因打开git bash要等一段时间才正常,有时候还会失败,失败的话关闭后重新打开即可)
2. 创建新的ssh keys
a) $ ssh-keygen -t rsa -C mwdnjupt@sina.com【这是你github网站上注册的邮箱,OpenDaylight有自己的github网站(http://git.opendaylight.org)】
b) 输入你的passphrase(密码)【此密码并非是你的github密码,可以自己创建,这个密码在后续的git操作中使用】
c) 记录ssh keys的存放位置,复制id_rsa.pub文件内容【这个公钥就是和用来在github网站中认证的。具体位置为C:\\Documents and Settings\\Administrator\\.ssh或者C:\\Program Files\\Git\\.ssh,即git的安装目录下的.ssh】
3. 本地设置Git信息
$ git config --global user.name mwdnjupt【github上注册的用户名】 $ git config --global user.email mwdnjupt@sina.com【github上注册的邮箱】 4. 将你新生成的ssh keys内容添加到github中
在Opendaylight的 GitHub网站点击“Account Settings”>点击“SSH Public Keys”>点击“Add another public key”,将刚才记录的id_rsa.pub整个文件内容复制进去,增加公共key。
5. github中生产http的password
在Opendaylight的在 GitHub网站点击“Account Settings”>点击“Http Password”>点击“Generate Password”,生成key。
下载OpenDaylight源码。
OpenDaylit源码下载包括SSH和Https两种方式 Https 1、设置代理
一般公司上外网都要通过代理,因此需要设置http的代理
$ git config --globalhttp.proxy http://proxy.yourcompanyname.com:80或者git config –global http.proxy http://user:password@proxy.yourcompanyname.com:80【这里的用户名/密码是http代理的鉴权信息,端口是代理端口】
2、下载源码
Git bash模式下进入源码存放的目录后进行初始化,$ git init
git clone https://mwdnjupt@git.opendaylight.org/gerrit/p/controller.git【这里用到了用户名username】
44
SSH
类似Https,SSh下载也是比较简单
1、同样如果上外网需要代理,需要设置SSH的代理,相对比较麻烦,这里不介绍了。
2、可以先测试测试是否设置正确:{$ ssh -T git@github.com /yes,输入passphrase(密码)}。
3、Git bash模式下进入源码存放的目录后进行初始化,$ git init 4、git clone ssh://
按照《基于OpenDaylight的二次开发一步一个脚印(一)GIT源代码》说明,我们可以将controller、openflowjava、openflowplugin三个项目的代码clone到本地。然而clone出来的本地分支是远程master分支的代码,而我们一般使用远程stable分支,因为这个分支相对比较稳定,方便我们学习。我们在hydrogen版本基础上进行二次开发,因此我们最终需要hydrogen版本的stable分支代码。这里用openflowjava项目来说明获取hydrogen版本stable分支代码方法。
2、获取stable分支代码
git branch –a 命令查看所有分支(本地+远程),打*说明的本地分支的当前分支。如下图所示
git branch 命令查看本地的分支,只有一个master
45
s1 dpctl dump-flows tcp:127.0.0.1:6634
查看流表,此时的输出应为:
只有stats_reply,暂时没有流表
接下来让h1 ping h2, 促使控制器产生流表 h1上 ping 10.0.0.2 -c 3 再次dptcl 可以看见:
交换机上已经产生了两条流表
wireshark 上可以抓到这条修改流表的报文,对应openflow协议的规定可以看到各个字段。
mininet上执行pingall,促使LLDP发现拓扑:
接下来进入浏览器,打开http://192.168.199.140:8181/dlux/index.html 登陆后就已经可以看到拓扑了:
31
3.2 OpenDaylight实战手记
3.2.1
环境搭建
注:下面的实战都在Windows环境下完成,下面几部分的内容需要仔细阅读,动手实践。 3.2.1.1
JDK1.7和Eclipse安装与配置
JDK1.7:jdk-7u45-windows-i586.exe(配置环境变量JAVA_HOME、PATH等等) Eclipse:eclipse-jee-kepler-SR1-win32.zip(配置反编译插件、包搜索插件等等) 3.2.1.2
maven安装和使用
《Maven的安装、配置及使用入门》
http://www.cnblogs.com/dcba1112/archive/2011/05/01/2033805.html 其中eclipse maven plugin插件安装和配置可以参考: 《eclipse maven plugin插件安装和配置》
http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 《Eclipse安装Maven插件》
http://dead-knight.iteye.com/blog/1841658 《CheckStyle,强制你遵循编码规范》
http://www.huangbowen.net/blog/2013/06/21/introduce-checkstyle/ 《Maven3入门篇》
32
http://liuzhijun.iteye.com/blog/1472008 3.2.1.3
OSGi
《人人都会OSGI--实例讲解OSGI开发》 http://longdick.iteye.com/blog/457310 《OSGI是什么》
http://wenku.http://m.njliaohua.com//link?url=A7HJD2ZNkOvTWI0LtLvZEU10hMbphWeZ5gdn4zHUWqIcGLkwC24_ucPwY5VCXGAuhOkDo8FdLJrTK-YQyyCvLV6R_ok-6vbXW91-8HthxXa
《探索 Eclipse 的 OSGi 控制台》
https://www.ibm.com/developerworks/cn/opensource/os-ecl-osgiconsole/ 《基于Eclipse开发OSGI的简单实例》
http://blog.csdn.net/pengpeng2395/article/details/3298231 《基于 OSGi 和 Spring 开发 Web 应用》
http://www.ibm.com/developerworks/cn/opensource/os-cn-osgi-spring/?S_TACT=105AGX52&S_CMP=tec-csdn
《浅析OSGI的bundle依赖》 http://www.xeclipse.com/?p=1165 《OSGI心得体会》
http://georgezeng.iteye.com/blog/1124455
3.2.2
3.2.2.1
编译、安装、运行
下载源代码
打开https://jenkins.opendaylight.org/controller/job/controller-daily/ws/opendaylight/ 最新https://github.com/opendaylight/controller
在页面下方点击“打包下载全部文件”。然后解压,解压后的目录尽量保证全部为英文字符。 3.2.2.2
安装
打开控制台窗口,进入解压后目录controller\\opendaylight\\distribution\\opendaylight目录,运行mvn install命令。如果java、maven安装、配置都确的,会执行安装,并且有最后“BUILD SUCCESS”的提示。该过程主要的工作是:下载依赖的相关包到maven本地的repository;Maven执行clean、compiler、package、install(包括从maven的本地repository copy相关的jar包等)等相关操作。
33
3.2.2.3 运行
成功安装后,在controller\\opendaylight\\distribution\\opendaylight下会多出一个target目录,这个目录就是最后opendaylight的版本输出目录。同样打开控制台窗口,进入target\\distribution.opendaylight-osgipackage\\opendaylight目录,也就是进入目录:controller\\opendaylight\\distribution\\opendaylight\\target\\distribution.opendaylight-osgipackage\\opendaylight,然后执行run命令,等待OSGI bundle加载运行后,敲Enter(回车键)后,出现osgi>提示符,在OSGI提示符下敲ss命令,会出现很多bundle的运行状态显示。打开网页浏览器,输入网址:http://127.0.0.1:8080后,输入用户名/密码为admin/admin后,点击log In按钮,能够成功打开web界面,说明运行成功。 3.2.2.4
直接下载编译好的版本
如果安装成功,运行过程也可能出现版本不一致之类的错误,再者,编译也可能经常出错,这时候也可以直接从网上下载编译好的版本,即直接下载某个每日构造版本
(
打
包
下
载
target
目
录
),
例
如
打
开
https://jenkins.opendaylight.org/controller/job/controller-bulk-release/ws/target/
(controller-bulk-release 2 月 29 days - #5这个版本)然后点击“打包下载全部文件”。同
样
可
以
使
用
这
个
版
本
,
在
target\\distribution.opendaylight-0.1.0-osgipackage\\opendaylight目录下执行run就可以。
3.2.3
OpenDaylight中使用Eclipse的几个Tricks
分类: OpenDaylight 2013-12-27 21:24 3130人阅读评论(9) 收藏举报 目录(?)[+]
OpenDaylight中使用Eclipse的几个Tricks 构建新的bundle放入OpenDaylight环境中运行 三种方法: 1、手工
手工编译java文件,手工编辑manifest文件,手工打包,最后放到目录:controller\\opendaylight\\distribution\\opendaylight\\target\\distribution.opendaylight-osgipackage\\opendaylight\\plugins,完成部署。
2、 Eclipse创建maven项目
通过IDE创建maven项目,然后进行编辑、调试,然后mvn install,最后从maven的本地repository手动copy jar包到opendaylight的plugins目录下进行部署。
3、 Eclipse创建plug-in项目
34
通过IDE创建plug-in项目,然后进行编辑、调试,导出plug-in development中的deployable plug-ins and fragments类型的项目。最后将导出的jar包copy到opendaylight的plugins目录下进行部署。
修改OpenDaylight中模块代码 基本过程
1、找到对应的plug代码,修改代码
2、修改对应的manifest文件、pom.xml(这里文件的修改是可选的)。 3、进入该plug-in的目录,执行mvn install
4、从maven的本地repository手动copy jar包到opendaylight的plugins目录下进行部署,更新后自动被OSGI框架感知。
Eclipse下源代码运行OpenDaylight
1、利用eclpsede import “existing maven project”,选择源代码的controller目录,这时候导入所有maven项目,但是不进行复制,Eclipse会自动解析pom.xml文件,下载依赖的jar包。
2、运行或者debug OSGi framework下的opendaylight-osgi-launcher(disribution bundle)。
导入到eclipse之后在run配置中,执行opendaylight-assembleit来干净编译整个项目。
几个target的含义如下。
opendaylight-application.launch =>运行控制器。
opendaylight-assembleit-fast.launch =>仅编译所选资源 (Project / Bundle)。 opendaylight-assembleit-noclean.launch =>编译所有bundle,但不执行clean。 opendaylight-assembleit-skiput.launch =>编译所有bundle,但不进行Unit Tests。 opendaylight-assembleit-sonar.launch =>编译所有bundle并运行Sonar (Code-Coverage, Stati
c-Analysis tool)。
opendaylight-assembleit.launch =>干净编译所有bundle。
opendaylight-sonar-fast.launch =>仅对所选的资源运行Sonar任务。 opendaylight-sonar.launch =>执行所有的Sonar 任务。 利用 Eclipse分析OpenDaylight代码
1、上述方便要把所有的plug-in都调试通需要下载很多包,并且有很多依赖关系,有一个plug-in出现问题都将是整个OpenDaylight无法联调。为了更好的阅读代码一般可以将关注的plug-in的代码建立java project。注意:为了方面建议安装jad、classlocator等插件,为了看到更多的日志信息,可以在日志的配置文件中调整打印级别。
35
2、如果要看某个plug-in代码某时刻的运行逻辑,可以进行远程调试,即打开java远程端口,编辑target\\distribution.opendaylight-osgipackage\\opendaylight下的run.bat文件,在java命令所在的这一行前面插入调试参数:
“
-Xdebug
-Xnoagent
-Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n”。这一行变为:
\VA_HOME%\\bin\\java.exe\%*-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n-Djava.io.tmpdir=\ir!work\\tmp\
-Dosgi.configuration.area=\
-Dosgi.install.area=!basedir!
-Dosgi.frameworkClassPath=!fwcp!
-Dosgi.framework=\-classpath !cp! org.eclipse.equinox.launcher.Main -console –consoleLog。这样启动的OpenDaylight就可以使用Eclipse进行远程调试,从中去分析、验证执行逻辑。
注:这里可知在非集群安装中,所有的OpenDaylight的plug-ins都运行在一个虚拟机中。
研究simple forwarding
分类: OpenDaylight 2014-01-17 22:03 1671人阅读评论(0) 收藏举报
这里的simple forwarding不是指simple forwarding bundle,而指简单的添加网元,同网段ping、增加subnet、不同网段ping的测试和分析
1、SDN和OpenDaylight技术概览
SDN的基本思路是转发和控制分离,这和软交换(业务与控制分离,控制与承载分离)的思路不谋而合,再往远点看,也颇有智能网(IN)的影子,opendaylight大致相当于IN的SCP。
http://www.opendaylight.org/project/technical-overview下面这个high level图需要看懂
2、SDN设备模拟环境 Openflow的学习
http://archive.openflow.org/wk/index.php/OpenFlow_Tutorial Mininet和VirtualBox安装 http://mininet.org/download/
https://www.virtualbox.org/wiki/Downloads Mininet的使用
36
http://mininet.org/vm-setup-notes/
https://wiki.opendaylight.org/view/OpenDaylight_Controller:Installation 3、研究simple forwarding 可以参考:
《OpenDaylight学习 ( by quqi99 )》
http://blog.csdn.net/quqi99/article/details/9156497 《OpenFlow Tutorial(1)》
http://blog.sina.com.cn/s/blog_4b5039210102e1og.html
《Forwarding Mechanism Researching Based on OpenDayLight SDN Network》 http://www.sdnap.com/sdnap-post/3254.html
实际过程按照下面的例子动手实战,进行simple forwarding功能的分析。这时候可以用web界面触发,简单的分析各个层面的bundle的调用关系。
《Using Mininet》
https://wiki.opendaylight.org/view/OpenDaylight_Controller:Installation
[原]OpenDaylight实战手记(五)源代码研读
2014-1-18阅读3111 评论2
1、OSGi依赖、接口相关的基本知识
《OSGI中的service依赖关系管理》
http://www.blogjava.net/aoxj/archive/2010/05/25/321844.html
《Apache Felix OSGi Tutorial》
http://felix.apache.org/site/apache-felix-osgi-tutorial.html
http://felix.apache.org/site/apache-felix-dependency-manager-getting-started.html
http://felix.apache.org/site/dependency-manager-usage.html
37
http://felix.apache.org/开源源代码可以从这里下载
2、关键类分析
ComponentActivatorAbstractBase是SAL核心的一个类,这个类可以看出各个bundle之间、Componet之间、全局和容器Container之间的依赖和调用关系。
注意:这里的容器指OpenDaylight中的Container,当然OSGi实现felix-osgi本身就是一个大容器,它管理着各个bundle。
ComponentActivatorAbstractBase:bundle的抽象基类,完成该bundle相关的各种Componet的管理,子类覆盖相关钩子方法实现定制 关键方法 Public void containerCreate(String containerName) 功能说明 根据getImplementations()获取容器相关的服务,每个实现和容器的Name为关键字通过DependencyManager(依赖管理,以Componet的形势管理依赖)创建一个Componet(这里每个Component就是一个服务,里面说明了导出的接口和依赖的接口),然后增加该服务的生命周期的监听器,从代码可知,服务在状态转变的时候会调用实现类38
Implementation的started()、stopping(),接着配置这个Componet,主要是指定导出接口和依赖的接口、实现接口。紧接着设置Componet的属性containerName。最后将这个Componet放到DependencyManager和缓存(并发Map:dbInstances)中。 public void 先根据OSGi上下文信息,生成bundle对应的DependencyManager再根据getGlobalImplementations ()获取全局相关的服务,每个实现关键字通过DependencyManager创建一个Componet,接着配置这个Componet,主要是指定导出接口和依赖的接口、实现接口。然后将这个Componet放到DependencyManager和缓存(并发Map:dbGlobalInstances)中。接着向OSGi容器注册IContainerAware接口以便容器的生命周期转换点调用。最后调用bunndle的钩子函数init()。该函数的功能代码的注释已经概括的很明确。 protected ServiceDependency 生成服务依赖对象,需要被子类调用,在配置Componet的依赖关系createServiceDependency() 的时候需要用到。 start(BundleContext context) 对象(这里看来肯定先是生成bundle对象然后再生成容器对象),以
OpenFlow的南向Bundle为例说明Bundle如何实现
ComponentActivatorAbstractBase,
org.opendaylight.controller.protocol_plugin.openflow.internal.Activator:继承ComponentActivatorAbstractBase,管理全局和容器相关的服务,当然bundle本身就是一个大服务 关键方法 Object[] getImplementations() 功能说明 返回容器相关的这四个服务的实现 TopologyServices.class, DataPacketServices.class, InventoryService.class, ReadService.class, FlowProgrammerNotifier.class void configureInstance(Component c, Object imp, String containerName) Object[] getGlobalImplementations() 覆盖方法,根据各个服务的实现,配置容器相关的Componet,主要是指定接口和实现类以及依赖的接口 返回全局的服务实现,Controller.class, OFStatisticsManager.class, FlowProgrammerService.class, ReadServiceFilter.class, DiscoveryService.class, DataPacketMuxDemux.class, InventoryService.class, InventoryServiceShim.class, 39
TopologyServiceShim.class configureGlobalInstance(Component c, Object imp) 覆盖方法,根据各个服务的实现,配置全局的Componet,主要是指定接口和实现类以及依赖的接口
3、Bundle之间的关系分析
接口导出和功能概览可以看下面链接:
https://wiki.opendaylight.org/view/Controller_Project's_Modules/Bundles_and_Interfaces
以南向的openflow plungin为例:
org.opendaylight.controller.protocol_plugin.openflow.internal.Activator 导出接口(Component) 依赖接口 IPluginOutTopologyService 说明 IPluginInTopologyService IRefreshInternalProvider (plungin) ITopologyServiceShimListener(plungin) IPluginInInventoryService IController(plungin) IInventoryShimInternalListener(plungin) IPluginOutInventoryService IInventoryProvider(plungin) IPluginInDataPacketService IController(plungin) IDataPacketMux(plungin) IPluginOutDataPacketService IPluginOutConnectionService IReadFilterInternalListener(plungin) IPluginInReadService IReadServiceFilter(plungin) IPluginOutReadService IPluginOutConnectionService 40
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库SDN资料整理在线全文阅读。
相关推荐: