基于Vmware的路由器主控单元功能虚拟化
2016-10-10黎文伟
黎文伟,吉 萌,戴 非
(1.武汉邮电科学研究院,武汉 430074; 2.武汉烽火网络有限责任公司,武汉 430074;3.江西师范大学,南昌 330022)
基于Vmware的路由器主控单元功能虚拟化
黎文伟1,2,吉 萌1,2,戴 非3
(1.武汉邮电科学研究院,武汉 430074; 2.武汉烽火网络有限责任公司,武汉 430074;3.江西师范大学,南昌 330022)
虚拟化是在通用服务器平台上实现路由器主控单元功能的主要方法之一,虚拟化的实现首先要解决路由器代码的移植。基于x86服务器和通用操作系统的纯软件虚拟化开发,可以利用英特尔在处理器和虚拟化领域的技术积累,获得在网络功能虚拟化领域的竞争优势。高端路由器主控单元的基础是收发数据包及相应的处理功能,移植的重点在于网卡驱动。文章分析了如何实现高端路由器主控单元代码运行在虚拟化平台上,并就调试程序过程中可能出现的技术问题做了深入的探讨。
路由器;虚拟化;网络功能虚拟化;软件定义网络
0 引 言
通信技术的发展和工业4.0时代的到来,让物联网、云计算从概念变为现实。电信运营商不断地进行硬件升级来满足数据流量的增长,成本高且部署网络设备周期长。而NFV(网络功能虚拟化)不仅降低了运营商的硬件采购成本,使组网更灵活,而且与SDN(软件定义网络)、云计算等前沿技术密切相关。其中基于x86架构的虚拟化技术是实现NFV的重要途径[1]。虚拟化技术的实现面临的挑战是路由器代码在虚拟环境下的移植。使用虚拟化技术后,要兼顾处理器高性能和通用性的矛盾,而解决该问题,可以在集成和软件层面做优化。
1 技术简介
1.1技术背景
纯软件虚拟化技术出现较早,之后还进一步出现了处理器级虚拟化和I/O(输入/输出)级虚拟化。纯软件虚拟化的主要问题是效率和隔离性。为了解决这个问题,市场上出现了OS(操作系统)虚拟化和完全虚拟化方法,但不管何种方法,都因为Hypervisor(虚拟机监视器)的参与而降低了处理器性能。目前Intel开发的VT-d(直接I/O访问的虚拟化技术),不仅成功解决了上述问题,还在I/O设备中增加了虚拟化性能[2-3]。Intel在处理器和I/O级的虚拟化工作,缓解了纯软件虚拟化所固有的效率和隔离性问题,为纯软件虚拟化应用提供了支撑。
Intel至强系列芯片广泛应用于服务器等领域。至强系列处理器的多核架构提高了虚拟化多任务环境的程序执行效率。路由器硬件组成包括主控卡、线卡和多核卡等,其中主控卡主要实现协议包的处理,转发主要由线卡完成。主控要实现一些基本的协议功能,例如BGP(边界网关协议)、OSPF(开放式最短路径优先)和RIP(路由信息协议)等。路由器主控功能虚拟化,可以为SDN和云计算等前沿网络技术的实现做支撑。
1.2技术框架
本文采用纯软件虚拟化方案,其虚拟化技术的实现不依赖于硬件,可以先在普通计算机上实现虚拟化,再拷入服务器板卡[4],整体技术框架如图1所示。
图1 路由器主控卡虚拟化实现方案
服务器板卡背板接口接收到其他线卡或者网络设备的报文后,VxWorks虚拟机判断该报文是协议包还是普通数据包,如果是协议包,则上传到CPU(中央处理器)进行协议栈处理,比如路由信息计算等,再交由相应端口进行转发;如果是普通数据包,则直接转发给外接交换机。虚拟主控卡要保证透明传输和高效率。外接交换机可以为普通交换机,利用其线速转发效率来弥补主控转发性能的不足;也可以为Openflow交换机,利用Windows系统内的java控制器来控制Openflow交换机流表的产生与转发,进而应用到SDN和云计算等嵌入式领域中。因而,路由器主控功能的虚拟化主要在于收发包功能的实现,至于上层协议栈和Openflow交互信息的控制方面,可以根据逻辑需要来配置和修改。而收发包功能主要涉及到虚拟网卡驱动的编译以及与协议栈和集成代码的联调问题。
本文采用tornado for Pentium的x86环境替代高端路由器编译环境tornado for ppc。该软件自带ln97xEnd.c,在tornado中编译boot,然后在Vmware中启动,即建立了基本的开发环境。
2 高端路由器主控虚拟化设计
2.1BSP(板级支持包)配置与空镜像加载
VxWorks镜像在BSP中的启动顺序为:romInit()-romStart()-sysInit()-usrInit()-usrRoot()。高端路由器主控卡的驱动代码主要在网卡加载时,即usrconfig.c文件中的usrRoot()函数执行过程中会出现问题,因此在编译lnPci网卡驱动前,要对BSP文件做修改,例如 argetconfigpcPentium下的config.h和sysLn97xEnd.c文件,用来设置FTP(文件传输协议)下载的IP(网际协议)地址和指定网卡驱动程序,包含PC_CONSOLE。在tornado里编译一个空镜像VxWorks image,运行在Vmware中,ping通VxWorks系统后,再进行网卡功能移植。
2.2对应网络模块的修改
路由器的代码一般基于嵌入式系统生成,通常使用专用CPU(如power pc),目标文件生成一般在该环境下进行;与驱动和网络相关的libnet.a、libdrv.a需要在Pentium环境下重新编译。与调试相关的libwdb.a也需要修改。分析ppc和Pentium 的tornado目录自带文件,可以看到targeth和targetsrcdrv下有很多文件不同,这会影响驱动设备end device的加载。移植过程中必须尽量使用路由器内的文件,例如muxlib.c、ipproto.c、end.h和netbuflib.c等。
2.3虚拟网卡编译过程
VxWorks网络框架如图2所示。END(增强型网络驱动)包括BSP和驱动部分。
图2 VxWorks网络框架
系统启动后,任务tUsrRoot()初始化网络,函数调用关系为usrRoot()调用usrNetInit(),在usr-NetInit()中调用sockLibAdd(),sockLibAdd()调用bsdSockLibInit(),usrNetInit()也调用muxDev-Load()和ipAttach()。函数muxDevLoad()中,通过参数initstring两次调用ln97xEndLoad()函数,第一次返回设备名称,避免重复加载,第二次装载网卡参数,初始化ln97xDevice和end_object结构体。
应用程序通过MUX接口实现与驱动层接口函数的信息交互,在VxWorks虚拟机里可观察MUX接口是否被正确创建。在shell中输入muxShow命令,可以查看创建的MUX接口信息,包括设备名lnPci、设备unit号、END_OBJ参数值和网卡描述信息等,验证底层网卡驱动是否被正确加载。虚拟网卡通过muxBind()函数绑定TCP/IP(传输控制协议/网际协议)栈[5],确认虚拟网卡Attached上TCP/IP后,程序进入协议驱动程序层。该层实现socket接口的协议初始化。
在协议驱动程序层,主要实现相关协议栈的函数调用和初始化工作。当协议层通过接口队列调用驱动层的函数来启动输出时,驱动接口层产生硬件中断,并且产生协议队列送协议层处理,这时协议层产生软件中断,与协议层有关的协议如TCP、UDP(用户数据报协议)、IP、ICMP(Internet控制报文协议)和IGMP(Internet组管理协议)等做进一步封装,并通过socket队列传送给socket层,进而实现系统调用。协议栈初始化功能由函数usrNetProtoInit()实现,该函数由tornado组件自带,但有些tornado for Pentium版本中并不会带有函数usr-NetProtoInit()里所有函数的初始化代码,这时可将tornado for PPC下的协议栈代码移植进该版本,实现网络协议栈的正常初始化。
协议栈初始化函数移植完毕后,输入ifAddrSet命令设置网卡IP地址,可用ifShow命令观察网卡地址信息以及收发包情况。在VxWorks虚拟机中设置网卡带外IP地址,如果能ping通VxWorks系统,证明网卡驱动程序已正常加载,然后调试socket接口,设置一个简单的服务器和客户端通信socket函数,实现虚拟网卡收发包功能。虚拟化调试平台即搭建完成。
2.4可能出现的问题和解决办法
路由器主控代码移植到虚拟环境下运行时,因tornado环境的不同,可能缺少在虚拟化环境下运行时所需的相关参数初始化工作,进而会经常出现“PageFault”错误。具体原因是指针返回错误,例如结构体指针返回空值,导致该指针访问成员时出错。解决办法是理顺函数调用顺序,避免错调或者漏调的情况。例如ln97xEnd.c中的ln97xEndLoad函数,该函数实现驱动和设备参数的初始化,会调用END_OBJ_INIT和END_MIB_INIT函数,这两个函数实现end.h中end_bject结构体初始化和mib-II结构体初始化,如果错调,那么在muxlib.c的muxdevload函数调用pNew→pFuncTable→ioctl时会出现PageFault错误。
在ipproto.c中调用ipAttach函数时,也可能出现PageFault,原因是一些函数没有被调用,例如mbinit等。在ipAttach函数中,会调用muxbind绑定TCP/IP到lnPci设备上。网卡设备Attached之后,说明muxbind绑定生效,此时可以设置网卡IP地址,调用socket接口。这时有可能出现无法成功设置IP地址的情况,原因是一些协议栈函数没有被初始化,可移植网络协议栈usrNetProtoInit()中的相关函数,在相关BSP文件中做修改。
Tornado版本不同且缺少某些组件时,网络初始化顺序也会不同。为了支持上层协议栈,移植时不能缺少原组件的功能。END增加了if模块,实现MUX功能,也可以根据驱动开发需要,绕过MUX,实现上层应用程序与驱动接口直接通信。同时需注意处理器的大小端模式,PPC(一种精简指令集架构)的处理器是大端模式,x86架构的Pentium处理器是小端模式。
3 高端路由器主控虚拟化的实现与评测
3.1主控虚拟化实现
在驱动和socket接口调试通过后,需要调试软件和集成代码。软件代码主要指OSPF、RIP、BGP等协议栈,集成代码是为实现一些新的平台功能而增加的部分代码,此外还有网管代码,主要实现命令行控制功能。
为了提高纯软件虚拟化的运行效率,可以通过修改软件和集成代码来优化虚拟主控的性能。在实际应用中,路由器主控虚拟化常与Openflow交换机结合来实现SDN,并实现与Openflow客户端流表等信息进行交互。
高端路由器虚拟主控卡在VxWorks虚拟机中的启动过程如图3所示。
图3 高端路由器虚拟主控卡启动过程
在图3中,虚拟主控可以在监控态进行版本升级,否则将在文件系统中寻找和加载主控代码镜像,最后在大程序中运行,此时是特权态,可以设置带外IP地址。
调试路由器协议栈代码,用服务器的背板接口连接普通交换机或者Openflow交换机、思博伦仪表及普通电脑,在仪表中设置二层和三层报文进行流量发包测试。在VxWorks虚拟机中设置带外口,连接Secure CRT软件,输入相关命令行,观察MAC表和路由表的建立信息、协议包的接收和转发情况。此时,高端路由器主控虚拟化的基本工作已实现,后续如需添加新的协议与功能,可以进一步修改软件和集成代码以适应新的虚拟化需求。
3.2主控虚拟化评测
高端路由器主控虚拟化的评测主要针对主控转发数据包性能和路由协议功能的实现。虚拟主控可以与外接普通交换机或者Openflow交换机进行通信,通过思博伦仪表进行二层和三层包打流测试来测评其数据包的转发性能。
虚拟主控主要功能是完成协议包的处理,包括OSPF、RIP、BGP等协议包。图4所示为服务器虚拟主控多区域OSPF测试拓扑。
图4 服务器虚拟主控多区域OSPF测试拓扑
图中服务器虚拟主控、路由器1和路由器2的OSPF主要配置命令分别如下:
其中,router ospf命令用于启动和配置IPv4的OSPF协议,数字1为默认进程号,network命令用于宣告参与OSPF协议的路由接口,area 0代表OSPF路由接口的主干区域,设置其他区域并将其连接到主干区域,例如area 1。在服务器的虚拟主控环境下,配置完上述命令后,可以在该虚拟主控环境下输入命令show ip ospf neighbor,查看此时虚拟主控建立的ospf邻居信息。
其他协议包的测试也可以借鉴常规路由器主控卡功能的测试步骤。测试完成后,将数据与常规路由器主控测试结果进行对比,以对虚拟主控功能进行改进。
4 结束语
基于Vmware平台下的x86虚拟化开发,可以有效利用服务器硬件资源,包括高性能至强系列Intel处理器等,减少网络设备开发周期和运营商网络设施运维成本。而高端路由器虚拟主控是虚拟路由器的核心组成部分,对主控单元实现虚拟化,可以更灵活地实现主流路由协议包的处理和转发,为SDN和云计算技术的开发与应用提供新的技术支撑。
[1]Wright G R,Stevens W R.TCP/IP IIIustrated Volume2:The Implementation[M].北京:机械工业出版社,2010.
[2]董耀祖,周正伟.基于X86架构的系统虚拟机技术与应用[J].计算机工程,2006,32(13):71-73.
[3]徐惠民.基于VxWorks的嵌入式系统及实验[M].北京:北京邮电大学出版社,2006.
[4]Kurose James F,Ross Keith W.Computer Networking:A Top-Down Appproach[M].Fourth Edition.北京:机械工业出版社,2008.
[5]杨洪波.高性能网络虚拟化技术研究[D].上海:上海交通大学,2012.
The Router’s Main Control unit Function Virtualization Based on Vmware
LI Wen-wei1,2,JI Meng1,2,DAI Fei3
(1.Wuhan Research Institute of Post and Telecommunications,Wuhan 430074,China;2.Wuhan FiberHome Networks Co.,Ltd.,Wuhan 430074,China; 3.Jiangxi Normal University,Nanchang 330022,China)
The virtualization of the Router’s Main Control unit function based on the x86platform can provide support for several technologies including virtualization,Software Defined Network(SDN)and cloud computing for further applications.Traditional router code is developed on private network processor.In order to achieve traditional function of a router in a virtualized environment,we recompile the virtual network interface card’s board support package,drive and protocol stacks based on traditional router code.This method realizes the router’s code mirror running normally in Vmware virtual machines based on normal Windows platform.The feasibility is also verified by the sending and receiving packet test.Compared with the traditional method of programmable router virtualization,this method utilizes a pure software virtualization technology and it is based on VxWorks router protocol stack,which shows much better versatility and flexibility.
router;virtualization;NFV;SDN
TN393
A
1005-8788(2016)02-0011-04
10.13756/j.gtxyj.2016.02.004
2015-08-29
黎文伟(1985-),男,湖北大悟人。硕士研究生,主要研究方向为通信与信息系统。