LINC switch是一个由flowforwarding. org主导开发的一款基于Apache2.0协议开源的Openflow交换机软件。本文介绍了其安装方式。
LINC switch是基于Erlang语言开发的一款支持Openflow的交换机软件,可以部署在物理机或是虚拟机上。特性如下:
Erlang是一款面向高并发环境的函数式语言,最早于上世纪80年代面世,在爱立信的产品中得到广泛应用。随着开源运动的发展,爱立信也开源了这一语言。Erlang能充分利用多核处理器,而且自身的OTP库为构建高可用的软件提供了非常可靠的支持。 使用Erlang开发的项目,比如:RabbitMQ,CouchDB,ejabberd,阿里云RDS中间件等等…
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环境:
root@workgroup3:~# apt-get install erlang
2.进入Erlang shell检查版本信息(最低要求为R16):
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查看版本信息:
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的代码:
root@workgroup3:~# git clone https://github.com/FlowForwarding/LINC-Switch.git
root@workgroup3:~# cd LINC-Switch/
root@workgroup3:~/LINC-Switch#
4.安装其他用于构建LINC的工具:
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
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:
root@workgroup3:~/LINC-Switch# make
在安装过程中会clone一些其他的库用于编译,编译时间很大程度上取决于网络状况。 如果没有出现其他问题,结果会是这样:
......
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模式:
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目录,可以看到里面的代码目录:
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:
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文件,可以查看:
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复制出来的:
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的配置与使用。