MacVlan的功能是给同一个物理网卡配置多个MAC地址,可以在软件上配置多个以太网口,属于物理层的功能。MacVTap是用来替代TUN/TAP和Bridge内核模块的。MacTap是基于MacVlan这个模块,提供TUN/TAP中TAP设备使用的接口,使用MACVTap以太网口的虚拟机能够通过TAP设备接口,直接将数据传递到内核中对应的MacVTap以太网中。

MacVTap工作模式

1.VEPA

同一物理网卡下的MacVTap设备之间的流量也要发送到外部交换机再由外部交换机转发回服务器,前提是交换机必须支持hairpin模式。

2.Bridge

同一物理网卡下的MacVTap设备可以直接进行以太网帧交换,不需要外部交换机介入。

3.private

同一物理网卡下的MacVTap设备互相无法联通,无论外部交换机支不支持hairpin模式。

创建MacVTap

[root@Linux78 ~]# ip link add link eth1 name macvtap0 type macvtap
[root@ Linux78 ~]# ip link set macvtap0 address 1a:2b:3c:4d:5e:6a up
[root@ Linux78 ~]# ip link show macvtap0
: macvtap0@eth1: <BROADCAST,MULTICAST,UP,M-DOWN> mtu qdisc pfifo_fast state UNKNOWN qlen
link/ether 1a:2b:3c:4d:5e:6a brd ff:ff:ff:ff:ff:ff

KVM虚拟机使用MacVTap接入网络的方法,在Libvirt中使用MacVTap的置配。

<interface type='direct'>
<mac address='1a:2b:3c:4d:5e:6a'/>
<source dev=‘eth0’ mode=‘bridge' />
<model type=‘e1000’ />
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

虚拟机创建后,宿主机会自动创建出一台MacVTap设备给虚拟机使用,这台MacVTap设备附属于母设备eth0,工作模式为bridge。

虚拟机之间及物理机与虚拟机的通信

macvlan有bridge、VEPA、private、passthru 4种工作模式,其中private和passthru我没用过, 这里主要讲另外两种。

VEPA(Virtual Edge Port Aggregator)是默认的工作模式,它的初衷是希望由物理的交换机来进行所有包交换, 这样可以在交换机上统一配置DHCP filtering之类的策略。

因此这个模式下的macvlan会把所有的包都扔到外部端口上去,期待交换机进行包交换, 把目的地址为本机机器的包再传回来。很多交换机考虑安全原因(防止包打环)是不支持这样的行为的, 但是一些较新的交换机上有这样一个特性,叫hairpin、VEPA或者802.1Qbg。

bridge模式则考虑到某些情况下需要更高效的macvlan之间的通信,因此会在内存中进行包交换,提高速度。

但是无论哪种模式,在没有外部交换机的支持的情况下,都是不可能支持物理端口到macvlan端口的包交换的。 上面的原理部分已经提到了,macvlan的port是在物理端口注册了一个rx_handler, 它只会对物理端口收到的包进行处理,而物理端口发出去的包macvlan是不会看到的。

private模式我没有细看,但应该是drop掉了目的端口为其他macvlan端口的包。

综上,结论如下:

  • 对于有交换机支持的网络中,使用VEPA模式和bridge模式都可以实现物理机与虚拟机之间的所有通信。
  • 在无交换机支持的网络中,
    • 使用VEPA模式,虚拟机之间及物理机与虚拟机之间不能进行任何形式的通信;
    • 使用bridge模式,虚拟机之间可以正常通信,虚拟机与物理机不能正常通信。

vhost-net技术使虚拟机的网络通信绕过用户空间的虚拟化层,可直接和内核通信,从而提高虚拟机的网络性能,MacVTap则是跳过内核的网桥。使用vhost-net必须使用Virtio半虚拟化网卡。

vhost-net是对于Virtio的优化。Virtio本来是设计用于进行客户系统的前端与VMM的后端通信,减少硬件虚拟化方式根模式和非模式的切换。vhost-net是对于Virtio的优化,Virtio是虚拟化层的前端优化方案,减少硬件虚拟化方式下根模式与非根模式的切换,而vhost-net是虚拟化层后端优化方案。不使用vhost-net,进入CPU的根模式后,需要进入用户态将数据发送到tap设备后,再次切入内核态,使用vhost-net方式后,进入内核态后不需要进行内核用户态的切换,进一步减少物权切换的开销。

vhost_net技术

运行虚拟机是由用户空间的QEMU和内核KVM共同完成,QEMU负责模拟各种设备提供给虚拟机,KVM负责完成CPU和内存的虚拟化。Virtio的后端处理程序一般是由用户空间的QEMU提供。为减少延迟,提高性能,新的内核中增加了一个vhost_net驱动模块,在内核中实现Virtio的后端处理程序。

vhost_net配置

<interface type='bridge'>
<mac address='1a:2b:3c:4d:5e:6a'/>
<model type=‘virtio’ />
<driver name=‘vhost’ />
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

macvtap与vhost-net技术的更多相关文章

  1. 【随笔---转载】xip.io

    http://xip.io/ wildcard DNS for everyone 今天看到一个老外发布的DNS小工具,XIP.IO.功能十分简单,就是将foo.bar.10.0.0.1.xip.io  ...

  2. 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP (转)

    网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP 27 March 2013 TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设 ...

  3. 网络虚拟化技术 TUN/TAP MACVLAN MACVTAP

    TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设备是如何工作的:

  4. 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP

    TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设备是如何工作的:

  5. 网络虚拟化技术 -- LXC TUN/TAP MACVLAN MACVTAP

    Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等 [ LXC内核命名空间 ],这里使用LXC的网络虚拟化来模拟多个网络环境. 创 ...

  6. KVM虚拟化网络优化技术总结

    https://www.intel.com/content/dam/www/public/us/en/documents/technology-briefs/sr-iov-nfv-tech-brief ...

  7. virtio,macvtap,sriov

    本文转自http://xiaoli110.blog.51cto.com/1724/1558984 一个完整的数据包从虚拟机到物理机的路径是: 虚拟机--QEMU虚拟网卡--虚拟化层--内核网桥--物理 ...

  8. macvtap使用教程

    kubernetes一键安装 macvtap是虚拟机网络虚拟化常用的一种技术,当然容器也可以用. MACVTAP 的实现基于传统的 MACVLAN. 和 TAP 设备一样,每一个 MACVTAP 设备 ...

  9. RabbitMq 技术文档

    RabbitMq 技术文档 目录 1 AMQP简介 2 AMQP的实现 3 RabbitMQ简介 3.1 概念说明 3.2 消息队列的使用过程 3.3 RabbitMQ的特性 4 RabbitMQ使用 ...

随机推荐

  1. 一段自用javascript代码

    function jsontoarray(mjson) { var arr = []; ; for(var x in mjson.data){ arr[i] = new Array(); arr[i] ...

  2. WCF系列教程之WCF实例化

    本文参考自http://www.cnblogs.com/wangweimutou/p/4517951.html,纯属读书笔记,加深记忆 一.理解WCF实例化机制 1.WCF实例化,是指对用户定义的服务 ...

  3. zendstudio 设置默认编码 utf-8 gbk

    1.Project > Properties > Resource 2.Window > Preferences > General > Workspace 3.Wind ...

  4. 如何为 Go 设计一个通用的日志包

    需求 一个通用的日志包,应该满足以下几个需求: 兼容 log.Logger,标准库大量使用了 log.Logger 作为其错误内容的输出通道,比如 net/http.Server.ErrorLog,所 ...

  5. CentOS和Ubuntu系统下安装 HttpFS (助推Hue部署搭建)

    不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...

  6. JavaScript设计模式-12.门面模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 事务实现,redo,undo,锁

    事务(Transaction)是数据库区别于文件系统的重要特性之一.在文件系统中,如果你正在写文件,但是操作系统突然崩溃了,这个文件就很有可能被破坏.当然,有一些机制可以把文件恢复到某个时间点.不过, ...

  8. WPF中设置Border的BorderThickness属性会让背景图片产生模糊感

    <!--设置BorderThickness会让border的Background图片看起来有模糊感--> <Border x:Name="border" Bord ...

  9. SharePoint 2007 form.js兼容性修改

    因SharePoint 2007发布时微软的主要IE的版本是7,所以其中不少的JS是不规范的,在新的IE8 9 10 11等版本中碰到不少的问题,以下是部分的修复,记录下,不断完善. ()语法问题 d ...

  10. R语言数组array函数

    数组是一个可以在两个以上的维度存储数据的R数据对象.例如 - 如果创建尺寸(2,3,4)的数组,那么创建4个矩形矩阵每2行3列.数组只能存储数据类型. 使用 array()函数创建数组.它需要向量作为 ...