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. 修改VS项目的目标平台(目标框架)

    如果是正常的情况下.. 右键项目属性里就有修改的地方.. 可是有时候打开属性发现修改的下拉框是禁用的.. 这时候可以右键 "卸载项目" 编辑 .csproj 项目文件 在上方有个& ...

  2. 16个最佳响应式HTML5框架分享

    HTML5框架可以快速构建响应式网站,它们帮助程序员减少编码工作,减少冗余的代码.如今有很多免费的HTML5框架可供使用,由于它们有着响应式设计.跨浏览器兼容.相对轻量级等特点,这些框架在开发中都十分 ...

  3. (转)nginx+iis实现负载均衡

    最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为Load Balance,其 ...

  4. Struts2方法调用的三种方式(有新的!调用方法的说明)

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="heroAction" class="com.ABC ...

  5. spring中redistemplate不能用通配符keys查出相应Key的问题

    有个业务中需要删除某个前缀的所有Redis缓存,于是用RedisTemplate的keys方法先查出所有合适的key,再遍历删除.但是在keys(patten+"*")时每次取出的 ...

  6. python-wsgi测试服务器

    #!/usr/bin/python from wsgiref.simple_server import make_server def application(environ,start_respon ...

  7. Python基础(10) - 异常

    Python 异常:程序出现了错误而在正常控制流以外采取的行为 Python中常见的异常: 1. NameError:尝试访问一个未声明的变量 >>> something Trace ...

  8. sql server数据库导出表里所有数据

    主要步骤: 连接数据库>选择需要导出数据的数据库>任务>生成脚本 点击下一步,选择特定数据库对象>选择需要导出的数据表,下一步 选择高级>要编写脚本的数据的类型:仅限数据 ...

  9. CentOS虚拟机不能联网状况下yum方式从本地安装软件包

    大家都知道yum是linux下一个非常好用的软件安装/卸载软件,它方便操作,而且最厉害的是可以解决令人头疼的包依赖关系.但是若是你的linux不能联网,若想使用yum安装软件,可以依照下面的方法. 1 ...

  10. C# 之StringBulider简单用法

    StringBuild的是个动态对象,可直接拼加上字符串:而string对象的步骤:先初始化对象并赋值了,而后在拼加字符串时,先要创建需要拼加的字符串,然后再拼加,所以这就是StirngBuild远比 ...