XenServer本身并没有在网络方面自己开发专门的网络堆栈模式,而是使用现有的网络堆栈模式来进行集成。目前XenServer的网络堆栈主要有两种:Bridge和OpenvSwitch模式。其中,Bridge是属于Linux系统的技术,OpenvSwitch是一款开源的虚拟交换机软件。在本文中我想说说Bridge堆栈模式。
Bridge中文称为网桥,Linux网桥就是通过一个虚拟的网桥设备来实现桥接,这个设备可以绑定若干个以太网接口设备,从而将它们桥接起来。一般来讲,Bridge就是switch,所以具备了switch的最基本功能:
-
数据包转发:把数据包从一个端口转发到另一个端口的能力;
-
学习和维护PDB(forwarding database)。每个switch都有一张PDB,得知输入的数据包应该由那个端口转发出去,如果PDB中没有对应的记录,则广播该数据包得到所有的端口信息。
备注:PDB的主要作用就是记录MAC地址和端口的对应关系。在Linxu Bridge中,PDB通过hashtable来管理和维护。
在XenServer中,将一台服务器服务器虚拟成很多虚拟机,上面的虚拟机的设备都是通过虚拟化技术实现的。即上面虚拟机的CPU、内存和IO设备等都是虚拟机出来的,每台虚拟机分别有一张虚拟出来的网卡。而我们的物理服务器设备,可能只有一张真实的物理网卡(当然也可能有多个)。当所有的虚拟机都需要和外部进行网络通讯的时候,只能使用这张物理网卡进行实际的网络通讯,这势必所以的虚拟机都会共享这张物理网卡的功能,所以XenServer要处理不同虚拟机的虚拟网卡和物理网卡之间的数据包转发。基于Bridgr网络堆栈模式呢,XenServer的Bridge堆栈架构图下图所示:
本图来自Xen官方社区
XenServer会在Domain0中创建一个Linux的Bridge设备,一般第一个设备默认命名为(Bridge xenbr0),对于真实的物理网卡,叫做peth#(physicaleth#);同时我们看到,XenServer在Domain0中,为每个虚拟机的虚拟网卡都创建了一个对应虚拟网络接口,对于的命名为vifn.m(virtual interface.m),其中,n代表了虚拟机对应的编号,m代表了接口对应的虚拟机的虚拟网卡的编号。例如vif0.0对应Domain0的第一块虚拟网卡eth0,vif1.0对应DomainU#1的第一块虚拟网卡eth0。
为了更加直观,我自己画了一个图,在下面:
我们可以看到,物理网卡peth和虚拟网卡接口vif都连接到了Bridge上面,物理网卡负责和外部的网络进行所有内部的数据包传递和转发。那么网桥的桥接的意思是什么呢?入上图,我们的各虚拟机的vif都分别桥接到了xenbr0上面,对应上面来说只能看见一个设备,就是xenbr0。因为桥接是在数据链路层实现的,上层不需要关心桥接的细节。当外部的网络数据包到达物理网卡后,有Domain0中的网卡驱动进行处理,然后传递给peth接口,peth接口将数据传递给Bridge,即xenbr0设备,网桥设备的处理代码再根据数据包的目的MAC地址来判断报文该被转发到那个虚拟接口vif,或者都是,然后又Xen虚拟化层来处理 vif与虚拟机中的虚拟网卡之间的数据包传递工作。反过来,从eth0接收到的报文被提交给网桥的处理代码,在这里会判断报文该转发、丢弃、或提交到协议栈上层。
上文说道,vif和虚拟机之间的数据包传递工作由Xen虚拟化层来进行,那么是怎么进行的呢?vif和虚拟机中的虚拟网卡的传递取决于虚拟机的类型,即是的全虚拟化还是半虚拟化。
对于半虚拟化来说,虚拟机的OS是经过修改的,虚拟机本身知道自己是虚拟的,其虚拟机网络采用了驱动分离的技术,什么意思呢?就是说这台虚拟机的的虚拟网卡要通讯,需要有2个部分的驱动,称为前段驱动和后端驱动,其中,前段驱动位于虚拟机中,后端驱动位于Domain0中,他们之间的通讯通过页面交换技术来传递信息。所以在半虚拟化中,vif并不对Bridge转发给他的数据包做任何操作和处理,而是转发给后端程序,有后端驱动程序交由虚拟机的虚拟网卡进行处理。
如果是对于全虚拟化的方式呢?全虚拟化的方式在XenServer中简称为HVM。
在全虚拟化模式下,虚拟机本身OS并不做任何的修改操作,他自己也不知道自己是运行在虚拟化环境上的,甚至不知道自己是虚拟的。所以在全虚拟化方式下需要借助硬件虚拟化来截获虚拟机对引进设备的访问,利用QEMU模拟器来模拟虚拟机的设备如虚拟网卡,(QEMU 是一个面向完整 PC 系统的开源仿真器。除了仿真处理器外,QEMU 还允许仿真所有必要的子系统,如连网硬件和视频硬件。它还允许实现高级概念上的仿真(如对称多处理系统(多达 255 个 CPU)和其他处理器架构(如 ARM 和 PowerPC)。感兴趣的朋友可以去查找资料进行了解,在后面我也会写点有相关的QEMU的文章)。通过vif和QEMU模拟设备之间的关联,完成物理网卡和虚拟网卡之间的数据交换。
下面我们来说说XenServer对网络相关的管理系统都有哪些组件,如何进行管理?
在XenServer中,和虚拟网络相关的组件分别是:
-
Xend
-
Brctl
-
Linux Bridge module
下面对上图的组件进行介绍:
1、Xend:这是Xen对外提供管理和控制服务的最重要的组件。他处于应用层,是用户管理虚拟机的入口,对外提供XML-RPC协议的API。
2、Linux Bridge Module:这是Linux Bridge的模块,在系统启动时加载到内核。
3、Brctl:Linux bridge在应用层的命令行工具,所以和bridge相关的操作,都是通过该工具进行实现,在XenServer中,XE命令通过XAPI对Brctl进行操作。
4、Xe:XenServer的命令行管理工具。用于执行将输入的命令传递都XAPI去执行。
5、Libxenctrl:Xen的一个C语言库,Xend通过调用此库的函数来访问Hypervisor。
6、Privcmd:Domain 0中的驱动程序。Libxenctrl通过此程序实现向下访问。
7、Xen hypervisor:XenServer的软件抽象层,负责为运行与硬件之上的不同虚拟机提供CPU调度和内存分配等功能。
最后说说在Bridge模式物理网卡绑定。
在虚拟化环境中,一台物理服务器上的虚拟机一版有多台,他们共享网络的资源,不管虚拟交换机如何设置,最多都是通过服务器的物理网卡和外部进行通信。如果服务器只有一块网卡,那么所有的虚拟机对外置共享一条物理链路,当物理链路出现问题时,导致所有的虚拟机网络不通,对业务系统来说是很大的影响。二是多台虚拟机使用统一张网卡通一条链路,会照成资源争用的情况,在网络流量很大的时候,物理网卡的处理性能可能闭关不能同时处理那么多的流量。所以一般在生产环境中就需要我们提供多块网卡进行绑定,体提高网络的冗余和高可用。
在Bridge模式下,最多只支持2块网卡绑定,不正常2块以上的物理网卡进行绑定。
下图显示了绑定网卡的一个架构图
本图来自Xen社区
基于VLAN的网卡架构图
本图来自Xen社区
网卡绑定的架构图:
本图来自Xen社区
基于绑定网卡和VLAN的架构图: