前言
LINC switch是一个由flowforwarding. org主导开发的一款基于Apache2.0协议开源的Openflow交换机软件。本文介绍了其安装方式。
详细介绍
LINC switch是基于Erlang语言开发的一款支持Openflow的交换机软件,可以部署在物理机或是虚拟机上。特性如下:
- 1.支持Openflow协议的1.2、1.3及1.4版本。
- 2.支持OF-config的1.1.1版本。
- 3.非常容易扩展的模块化架构。
- 4.支持在一个Erlang node上运行多个逻辑交换机。
什么是Erlang?
Erlang是一款面向高并发环境的函数式语言,最早于上世纪80年代面世,在爱立信的产品中得到广泛应用。随着开源运动的发展,爱立信也开源了这一语言。Erlang能充分利用多核处理器,而且自身的OTP库为构建高可用的软件提供了非常可靠的支持。
使用Erlang开发的项目,比如:RabbitMQ,CouchDB,ejabberd,阿里云RDS中间件等等…
为什么选择LINC?
1.它提供了对Openflow特性完整支持,有利于深入理解Openflow的原理和细节。
2.在Erlang的支持下,实现了对多核处理器的充分利用,能在标准硬件上获得比较好的处理性能。同时有极高的容错性。
LINC架构图
安装:
官方方案:
在标准的64位x86服务器上安装。要求服务器至少拥有4GB内存,4个端口,Linux内核版本要求在3.1以上。详细安装方式可以参考官方文档:https://github.com/FlowForwarding/LINC-Switch/blob/master/docs/LINC_Switch_Quick_Start_Guide.pdf
本文只介绍在虚拟机上的安装。(备注:该文档的安装方式是通过ISO镜像安装,但是下载已经失效,也就是说只能依靠从源码编译安装)
可行方案:
我们将在在虚拟机中安装LINC。官方文档是在vsphere上安装的。这里我用了VMware workstation:
在虚拟机中安装只是为了以后的与其他虚拟机的联动测试。
前提准备:安装ubuntu 14.04 LTS 64bit,配置好源后,apt-get update,配置好ssh方便后续操作。
我使用xshell连接到虚拟机:
安装开始:
1.安装Erlang环境:
1 |
root@workgroup3:~# apt-get install erlang |
2.进入Erlang shell检查版本信息(最低要求为R16):
1 2 3 4 |
root@workgroup3:~# erl Erlang R16B03 (erts-5.10.4) [source] [64-bit] [async-threads:10] [kernel-poll:false] Eshell V5.10.4 (abort with ^G) 1> |
按下ctrl-c,再按v查看版本信息:
1 2 3 4 5 6 7 |
Eshell V5.10.4 (abort with ^G) 1> BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution v Erlang (BEAM) emulator version 5.10.4 Compiled on Tue Aug 19 16:45:11 2014 |
可以看到Erlang的相关信息,版本为R16B03,你也可以考虑从源码编译R18的版本。
(按ctrl-c再按a退出Erlang shell)
3.clone一份LINC的代码:
1 2 3 |
root@workgroup3:~# git clone https://github.com/FlowForwarding/LINC-Switch.git root@workgroup3:~# cd LINC-Switch/ root@workgroup3:~/LINC-Switch# |
4.安装其他用于构建LINC的工具:
1 |
root@workgroup3:~/LINC-Switch# apt-get install git-core bridge-utils libpcap0.8 libpcap-dev libcap2-bin uml-utilities |
5.重命名sys.config.orig为sys.config
1 2 3 4 5 6 |
root@workgroup3:~/LINC-Switch# ls apps docs LICENSE Makefile pcap.data README.md rebar rebar.config rel scripts root@workgroup3:~/LINC-Switch# cd rel/files/ root@workgroup3:~/LINC-Switch/rel/files# ls erl linc nodetool sys.config.orig vm.args root@workgroup3:~/LINC-Switch/rel/files# mv sys.config.orig sys.config |
如果不重命名,会导致编译中断。
5.编译LINC:
1 |
root@workgroup3:~/LINC-Switch# make |
在安装过程中会clone一些其他的库用于编译,编译时间很大程度上取决于网络状况。
如果没有出现其他问题,结果会是这样:
1 2 3 4 5 6 7 8 9 10 |
...... Compiled src/linc_us3_queue_sup.erl Compiled src/linc_us3_queue.erl Compiled src/linc_us3_sliding_window.erl Compiled src/linc_us3_sup.erl Compiled src/linc_us3_routing.erl ==> rel (compile) ==> LINC-Switch (compile) ==> rel (generate) root@workgroup3:~/LINC-Switch# |
6.初次启动LINC并进入console模式:
1 2 3 4 5 6 7 8 9 10 11 12 |
root@workgroup3:~/LINC-Switch# rel/linc/bin/linc console Exec: /root/LINC-Switch/rel/linc/erts-5.10.4/bin/erlexec -boot /root/LINC-Switch/rel/linc/releases/1.0/linc -mode embedded -config /root/LINC-Switch/rel/linc/releases/1.0/sys.config -args_file /root/LINC-Switch/rel/linc/releases/1.0/vm.args -- console Root: /root/LINC-Switch/rel/linc Erlang R16B03 (erts-5.10.4) [source] [64-bit] [async-threads:10] [kernel-poll:false] load_driver 'netlink_drv' from: '/root/LINC-Switch/rel/linc/lib/netlink-1/priv' 10:15:10.508 [info] Application lager started on node linc@workgroup3 10:15:10.508 [info] Application ssh started on node linc@workgroup3 10:15:10.511 [info] Application enetconf started on node linc@workgroup3 10:15:10.515 [info] Application linc started on node linc@workgroup3 Eshell V5.10.4 (abort with ^G) (linc@workgroup3)1> |
这样就可以在Erlang shell的协助下操作LINC。
可以根据自己的需求将代码copy到其他地方,比如/usr/local/bin并设置好PATH。
编译后的探索:
1.编译时,rebar会自动下载所依赖的代码至/LINC-Switch/deps目录,可以看到里面的代码目录:
1 2 3 |
root@workgroup3:~/LINC-Switch/deps# ls eenum epcap lager netlink of_protocol procket tunctl enetconf goldrush meck of_config pkt sync |
2.编译时需要/LINC-Switch/rel/files目录下存在一个合法的sys.config文件,你也可以尝试用/LINC-Switch/scripts目录下的工具生成配置文件config_gen:
1 2 3 4 5 |
root@workgroup3:~/LINC-Switch/scripts# ./config_gen ./config_gen [-s LOGICAL_SWITCH_ID [INTERFACE_NAME]] -c [[tcp|tls]:CONTROLLER_ADDRES:CONTROLLER_PORT] [-l CONTROLLERS_LISTENER_ADDRESS:PORT] -o OUTPUT_FILE Example usage: ./config_gen -s 0 tap0 tap1 -c tcp:10.48.11.5:6653 tls:10.48.11.6:5533 -o ../rel/files/sys.config |
如果不提供任何输入,只会输出usage。
3.编译后,进入/LINC-Switch/rel/linc/releases目录,可以看到一个RELEASES文件,可以查看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
root@workgroup3:~/LINC-Switch/rel/linc/releases# cat RELEASES [{release,"linc","1.0","5.10.4", [{kernel,"2.16.4","/root/LINC-Switch/rel/linc/lib/kernel-2.16.4"}, {stdlib,"1.19.4","/root/LINC-Switch/rel/linc/lib/stdlib-1.19.4"}, {sasl,"2.3.4","/root/LINC-Switch/rel/linc/lib/sasl-2.3.4"}, {asn1,"2.0.4","/root/LINC-Switch/rel/linc/lib/asn1-2.0.4"}, {crypto,"3.2","/root/LINC-Switch/rel/linc/lib/crypto-3.2"}, {public_key,"0.21", "/root/LINC-Switch/rel/linc/lib/public_key-0.21"}, {ssl,"5.3.2","/root/LINC-Switch/rel/linc/lib/ssl-5.3.2"}, {compiler,"4.9.4","/root/LINC-Switch/rel/linc/lib/compiler-4.9.4"}, {syntax_tools,"1.6.12", "/root/LINC-Switch/rel/linc/lib/syntax_tools-1.6.12"}, {runtime_tools,"1.8.13", "/root/LINC-Switch/rel/linc/lib/runtime_tools-1.8.13"}, {xmerl,"1.3.5","/root/LINC-Switch/rel/linc/lib/xmerl-1.3.5"}, {mnesia,"4.11","/root/LINC-Switch/rel/linc/lib/mnesia-4.11"}, {netlink,"1","/root/LINC-Switch/rel/linc/lib/netlink-1"}, {goldrush,"0.1.6","/root/LINC-Switch/rel/linc/lib/goldrush-0.1.6"}, {lager,"2.1.0","/root/LINC-Switch/rel/linc/lib/lager-2.1.0"}, {linc,"1.1","/root/LINC-Switch/rel/linc/lib/linc-1.1"}, {eenum,"0.1.2","/root/LINC-Switch/rel/linc/lib/eenum-0.1.2"}, {ssh,"3.0","/root/LINC-Switch/rel/linc/lib/ssh-3.0"}, {enetconf,"0.1","/root/LINC-Switch/rel/linc/lib/enetconf-0.1"}, {epcap,"0.05","/root/LINC-Switch/rel/linc/lib/epcap-0.05"}, {linc_us3,"1.1","/root/LINC-Switch/rel/linc/lib/linc_us3-1.1"}, {linc_us4,"1.1","/root/LINC-Switch/rel/linc/lib/linc_us4-1.1"}, {linc_us4_oe,"1.1", "/root/LINC-Switch/rel/linc/lib/linc_us4_oe-1.1"}, {linc_us5,"1.1","/root/LINC-Switch/rel/linc/lib/linc_us5-1.1"}, {of_config,"0.2","/root/LINC-Switch/rel/linc/lib/of_config-0.2"}, {of_protocol,"1.0", "/root/LINC-Switch/rel/linc/lib/of_protocol-1.0"}, {pkt,"0.03","/root/LINC-Switch/rel/linc/lib/pkt-0.03"}, {procket,"0.03","/root/LINC-Switch/rel/linc/lib/procket-0.03"}, {tunctl,"0.01","/root/LINC-Switch/rel/linc/lib/tunctl-0.01"}], permanent}]. |
可以详细地看到我们编译出来的LINC的版本信息和它依赖的包的信息。
4.LINC的配置文件是/LINC-Switch/rel/linc/releases/1.0目录中的sys.config,应该是从/LINC-Switch/rel/files复制出来的:
1 2 3 |
root@workgroup3:~/LINC-Switch/rel/linc/releases/1.0# ls linc.boot linc.script start_clean.rel sys.config linc.rel start_clean.boot start_clean.script vm.args |
总结:
本文介绍了LINC switch的从源码编译的安装方式。在接下来的文章中将介绍LINC switch的配置与使用。
参考资料:https://github.com/FlowForwarding/LINC-Switch
作者简介:何智刚,2015至今,现为广东的一名在校高三学生,在学习之余,主要研究Docker,OpenStack,SDN,对领域都有所涉猎,目标是迈向full stack。