Ryu控制器安装部署和入门

Ryu官网简介,原滋原味
Ryu is a component-based software defined networking framework. Ryu provides software components with well defined API that make it easy for developers to create new network management and control applications. Ryu supports various protocols for managing network devices, such as OpenFlow, Netconf, OF-config, etc. About OpenFlow, Ryu supports fully 1.0, 1.2, 1.3, 1.4, 1.5 and Nicira Extensions. All of the code is freely available under the Apache 2.0 license.(内容来源:Ryu网站)

Ryu安装

  • 系统环境:Ubuntu16.04

pip命令安装

pip命令安装
pip命令安装可能没办法安装到自定义目录,不便于定位,推荐源码安装

Ryu源码安装

1.安装依赖

sudo apt install gcc python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev zlib1g-dev

2.下载源码

mkdir RYU
cd RYU
git clone https://github.com/osrg/ryu.git

Ryu控制器安装部署和入门_第1张图片

3.进入主目录

cd ryu

4.其他组件依赖
根据GitHub提示
Ryu控制器安装部署和入门_第2张图片
下载安装额外的组件用于支持ryu的OF-ConfigNETCONFBGP speaker (SSH console)Zebra protocol service (database)组件

sudo pip install -r tools/optional-requires

如果提示无pip命令,那么需要安装pip

sudo apt-get install python-pip

继续运行sudo pip install -r tools/optional-requires,如果看到提示pip版本问题:

请用下面的命令解决↓↓↓↓↓↓↓↓↓↓

sudo apt-get remove python-pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
hash -r

5.安装ryu(install后面有空格和点)

sudo pip install .

6.查看版本

ryu --version

安装心得

按照Ryu网站给的方法,不论是pip简易安装还是源码安装,都可能会因为pip版本问题而报错
为了解决这个问题,除了上述解决方法外,可以参考博客,直接尝试安装pip3,更方便。

sudo apt-get install python3-pip
git clone https://github.com/osrg/ryu.git
cd ryu
sudo pip3 install -r tools/pip-requires -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo python3 setup.py install

我在装依赖的时候报错了,重新执行一次命令成功了。
这个方法比之前更方便,pip和pip3分开装。
Ryu控制器安装部署和入门_第3张图片

Ryu入门

官方参考资料
SDNLAB参考资料
Ryu一大特点就是便于二次开发,用户可以自定义控制器的功能。

  • 从最简单开始
    新建一个l2.py,添加代码:
from ryu.base import app_manager

class L2Switch(app_manager.RyuApp):
    def __init__(self, *args, **kwargs):
        super(L2Switch, self).__init__(*args, **kwargs)

代码中定义了一个L2Switch类,它继承自RyuApp这个基类(在~/ryu/ryu/base/app_manager.py文件中定义),然后只做了声明、初始化,所以这段代码执行后不会做什么实质的事情,但是它确实一个ryu应用程序。
在l2.py目录下执行:

ryu-manager l2.py

Ryu控制器安装部署和入门_第4张图片

  • 继续添加内容
    新的代码开头多了几行from ryu.xxx,涉及到ryu安装目录~/ryu/ryu/中controller、ofphoto文件夹

    controller目录下的ofo_event.py定义了OpenFlow事件,handler.py定义了事件的处理,具体可以查看两个文件的内容。
    ofphoto目录下主要是OpenFlow版本信息,ofproto_v1_0是OpenFlow1.0版本的定义,具体亦可查看文件内容。
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0

class L2Switch(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]

    def __init__(self, *args, **kwargs):
        super(L2Switch, self).__init__(*args, **kwargs)

    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def packet_in_handler(self, ev):
        msg = ev.msg
        dp = msg.datapath
        ofp = dp.ofproto
        ofp_parser = dp.ofproto_parser

        actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
        out = ofp_parser.OFPPacketOut(
            datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
            actions=actions)
        dp.send_msg(out)

新增的代码中加入了新方法packet_in_handler,当Ryu收到OpenFlow交换机送来的packet_in消息时调用,set_ev_cls的第一个参数也声明了。
set_ev_cls的第二个参数MAIN_DISPATCHER意味着当Ryu和交换机握手过程(即hello, features request/reply, Set Config等)完毕,才会调用packet_in_handler。
之后定义packet_in消息数据结构,交换机datapath,OpenFlow协议和解析过程;
定义发给交换机packet_out的动作,要求交换机将数据包泛洪广播;定义Ryu向交换机发送的packet_out内容,最后发送消息。
至此,一个能够接收packet和转发packet的交换机完成了(接收packet,广播packet)。

  • 继续扩展
    Ryu主目录的app文件夹下可以查看各种应用并做二次开发,实现Ryu对交换机的自定义控制。

你可能感兴趣的:(Ryu控制器安装部署和入门)