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 / 18.04
使用pip3的Ryu源码安装
1.安装依赖
sudo apt install gcc python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev zlib1g-dev
2.安装pip3
sudo apt-get install python3-pip
3.下载源码
git clone https://github.com/osrg/ryu.git
4.进入主目录,安装其他组件依赖
根据GitHub提示
下载安装额外的组件用于支持ryu的OF-Config,NETCONF,BGP speaker (SSH console),Zebra protocol service (database)组件
cd ryu
sudo pip3 install -r tools/pip-requires -i https://pypi.tuna.tsinghua.edu.cn/simple
5.安装ryu(install后面有空格和点)
sudo python3 setup.py install
6.查看版本
ryu --version
参考资料
参考博客,直接尝试安装pip3,更方便。
RYU+mininet实践
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
- 继续添加内容
新的代码开头多了几行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对交换机的自定义控制。