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. Mac下Homebrew的图形化界面工具Cakebrew

    安装: brew cask install cakebrew 如果不能下载直接上官网下载dmg包进行安装. 参考: https://www.cakebrew.com/ https://github.c ...

  2. Highcharts图表.net版开源,支持webform 和 mvc3,完全开源

    Highcharts是一个制作图表的纯Javascript类库,主要特性如下: 兼容性:兼容当今所有的浏览器,包括iPhone.IE和火狐等等: 对个人用户完全免费: 纯JS,无BS: 支持大部分的图 ...

  3. 自定义类型转换器之TypeConverter

    C#提供了很多类型转换的方法如ConvertToInt.int.Parse.int.tryParse等等,这些方法都能将一个C#的基本数据类型转换成另一个C#基本数据类型.那么.既然如此,C#肯定会提 ...

  4. 趣说Java:我是一个线程

    第一回 初生牛犊 我是一个线程,我一出生就被编了个号:0x3704,然后被领到一个昏暗的屋子里,在这里我发现了很多和我一模一样的同伴. 我身边的同伴0x6900 待的时间比较长,他带着沧桑的口气对我说 ...

  5. 分段锁——ConcurrentHashMap

    1.线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 2.效率低下的HashTable容 ...

  6. rails 中 create, new, build, save 的用法以及误区汇总 (转)

    自己很初级,初级的不能再初级,所以初次接触rails的时候,对于里面的create,new,build等方法不是很了解,用的很混乱,导致经常出现不必要的bug,很苦恼,决定,总结一下,结合网上已有资源 ...

  7. 把AspDotNetCoreMvc程序运行在Docker上-part2:修改容器以及发布镜像

    在上一个part<把AspDotNetCoreMvc程序运行在Docker上-part1>,已经将成功将aspdotnetcore程序运行在两个不同的容器中,目前两个容器的内容完全相同,只 ...

  8. [编程] C语言结构体指针作为函数参数

    结构体指针作为函数参数:结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针.如果结构体成员较多,尤其是成员为数组时,传送的时间和空间 ...

  9. SpringBoot Mybatis的驼峰命名

    开启驼峰命名的方法 第一种方式: 可以在配置类中进行配置.配置的Demo如下: @Bean(name="sqlSessionFactory") public SqlSessionF ...

  10. python循环删除列表里的元素!漏删!

    li = [1,2,3,4,5,6] for i in li: if i<3: li.remove(i) print(li) #输出的结果是 [2,3,4,5,6]    2没有remove掉 ...