在具体的执行上,通过下面的命令,你可以创建一个MACVLAN网卡,它是基于eth0虚拟出来的:
ip link add link eth0 name macv1 type macvlan 你可以认为有人将双绞线“物理上”每根一分为二,接了两个水晶头,从而连接了两块网卡,其中一块是虚拟的MACVLAN网卡。但是既然共享介质,难道不用运行CSMA/CD吗?当然不用,因为事实上,最终的数据是通过eth0发出的,而现代的以太网卡工作的全双工模式,只要是交换式全双工(某些标准而言,这是必须的),eth0自己能做好。
现在可以说一下MACVLAN技术构建的虚拟网卡的模式了。之所以MACVLAN拥有所谓的模式,是因为相比VETH,它更是将复杂性建立在了一个已经容不下什么的以太网概念上,因此相互交互的元素就会太多,它们之间的关系不同,导致最终MACVLAN的行为不同。还是图解的方式:
这种private模式的隔离强度比VEPA更强。在private模式下,即使是MACVLANeth1和MACVLANeth2同时配在在eth0上,eth0连接了外部交换机S,S支持“发夹弯”转发模式,即便这样,MACVLANeth1的广播/多播流量也无法到达MACVLANeth2,反之亦然,之所以隔离广播流量,是因为以太网是基于广播的,隔离了广播,以太网将失去了依托。
如果你想配置MACVLAN的模式,请在ip link命令后面添加mode参数:
ip link add link eth0 name macv1 type macvlan mode bridge|vepa|private
VETH网卡与MACVLAN网卡之间的异同
我们先看一下如何配置一个独立的net namespace。
1.VETH方式
ip netns add ns1 ip link add v1 type veth peer name veth1 ip link set v1 netns ns1 brctl addbr br0 brctl addif br0 eth0 brctl addif br0 veth1
ifconfig br0 192.168.0.1/16
2.MACVLAN方式
ip link add link eth0 name macv1 type macvlan ip link set macv1 netns ns1 可以看到,MACVLAN做起同样的事,比VETH来的简单了。那么效率呢?Linux的bridge基于软件实现,需要不断查找hash表,这个同样也是MACVLAN bridge模式的做法,但是VEPA模式和private模式下,都是直接转发的。它们的区别可以从下图展示出来:
VEPA技术
VEPA是什么?Virtual Ethernet Port Aggregator。它是HP在虚拟化支持领域对抗Cisco的VN-Tag的技术。所以说,Cisco的VN-Tag和VEPA旨在解决同一个问题或者说同一类问题。解决的是什么问题呢?通俗点说,就是虚拟机之间网络通信的问题,特别是位于同一个宿主机内的虚拟机之间的网络通信问题。
难道这个问题没有解决吗?我使用的VMWare可以在我的PC中创建多个虚拟机,即便我拔掉我的PC机网线,这些虚拟机之间也能通信...VMWare内部有一个vSwitch。就是说,几乎所有的虚拟机技术,内置的交叉网络都能解决虚拟机之间的通信问题。那么还要VN-Tag以及VEPA干什么?
这个问题涉及到两个领域,一个是扩展性问题,另一个是职责边界问题。说明白点就是,内置的vSwitch之类的东西在性能和功能上足以满足要求吗?它属于虚拟机软件厂商的边缘产品,甚至说不是一个独立的产品,它一般都是附属虚拟机软件赠送的,没有自己的销售盈利模式,虚拟机厂商之所以内置它是因为它只是为了让用户体验到虚拟机之间“有相互通信的能力”,所以厂商是不会发力将这种内置的虚拟交换机或者虚拟路由器做完美的,它们推的是虚拟机软件本身。
另外,千百年来,网络管理员和系统管理员之间的职责边界是清晰的,直到到达了虚拟化时代。如果使用内置的虚拟交换机,那么如果这个交换机出了故障或者有复杂的配置任务计划,找谁呢?要知道这个虚拟交换机内置于宿主服务器内部,这是系统管理员的领域,一般的网管设置无法触摸到这些设备,数据中心复杂的三权分立管理模式也无法让网管去登录服务器。反过来,系统管理员对网络协议的认知程度又远远比不上专业网管。这就造成了内置于虚拟机软件的虚拟网络设备的尴尬处境。另一方面,这个虚拟的网络设备确实不是很专业的网络设备。爆炸!
Cisco不愧为网络界的大咖。它总是在出现这种尴尬场景的时候率先提出一个标准,于是它改造了以太网协议,推出了VN-Tag,就像ISL之于IEEE802.1q那样。VN-Tag在标准的协议头中增加了一个全新的字段,这种做法的前提是Cisco有能力用最快的速度推出一款设备并让其真正跑起来。在看看HP的反击,HP没有Cisco那样的能力,它不会去修改协议头,但是它可以修改协议的行为从而解决问题,虽然比Cisco晚了一步,但是HP提出的VEPA不愧是一种更加开放的方式,Linux可以很容易的增加对其的支持。
VEPA,它很简单,一个数据包从一个交换机的一个网口进入,然后从同一个网口发回去,好像是毫无意义的做法,但是它却没有改变以太网的协议头。这种做法在平常看来真的是毫无意义的,因为正常来讲,一块网卡连接一根网线,如果是自己发给自己的数据,那么这个数据是不会到达网卡的,对于Linux而言,直接就被loopback给bypass了。但是对于虚拟化场景而言,情况就有所不同了,虽然物理宿主机上可能拥有一块以太网卡,但是从该网卡发出的数据包却不一定来自同一个协议栈,它可能来自不同的虚拟机或者不同的net namespace(仅针对Linux),因为在支持虚拟化OS的内部,一块物理网卡被虚拟成了多块虚拟网卡,每一块虚拟网卡属于一个虚拟机...此时,如果不修改以太网协议头且又没有内置的虚拟交换机,就需要外部的一台交换机来协助转发,典型的就是从一个交换口收到数据包,把它从该口再发出去,由宿主网卡决定是否接收以及如何接收。如下图所示:
IPVLAN的创建命令如下:
ip link add link <master-dev> <slave-dev> type ipvlan mode { l2 | L3 } 将一个IPVLAN虚拟网卡放入一个独立的net namespace的方式和MACVLAN完全一样,但是它俩之间改如何作出选择呢?好在IPVLAN有Linux源码树上的Document,因此我就不多嘴了:
4.1 L2 mode: In this mode TX processing happens on the stack instance attached to the slave device and packets are switched and queued to the master device to send out. In this mode the slaves will RX/TX multicast and broadcast (if applicable) as well. 4.2 L3 mode: In this mode TX processing upto L3 happens on the stack instance attached to the slave device and packets are switched to the stack instance of the master device for the L2 processing and routing from that instance will be used before packets are queued on the outbound device. In this mode the slaves will not receive nor can send multicast / broadcast traffic. 5. What to choose (macvlan vs. ipvlan)? These two devices are very similar in many regards and the specific use case could very well define which device to choose. if one of the following situations defines your use case then you can choose to use ipvlan - (a) The Linux host that is connected to the external switch / router has policy configured that allows only one mac per port. (b) No of virtual devices created on a master exceed the mac capacity and puts the NIC in promiscous mode and degraded performance is a concern. (c) If the slave device is to be put into the hostile / untrusted network namespace where L2 on the slave could be changed / misused.