本文将mark下macvtap的相关notes。
tap + bridge

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| +-------------------+ | QEMU VM | | | | virtio-net/e1000 | +---------+---------+ | | TAP fd v +-------------------+ | tap0 | +---------+---------+ | v +-------------------+ | br0 | Linux bridge | | | ports: tap0, eth0 | +---------+---------+ | v +-------------------+ | eth0 / ens33 | | physical NIC | +---------+---------+ | v +-------------------+ | 外部二层网络 | | switch / LAN | +-------------------+
|
QEMU -> tap0 -> br0 -> eth0 -> LAN
MACVLAN

一般情况下,网卡只有一个MAC地址。然而,有些场景下需要给一个网卡设置多个MAC地址。Linux通过MACVLAN技术在一个物理网卡上创建多个MACVLAN虚拟设备,每个设备有着不同的MAC地址。当物理网卡收到数据包时,MACVLAN driver根据数据包MAC地址将数据包交由匹配的虚拟网卡处理。使用MACVLAN可以替代使用bridge来连接物理网卡和虚拟网络设备。
macvlan没有/dev/tapX。
MACVTAP

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| +-------------------+ | QEMU VM | | | | virtio-net/e1000 | +---------+---------+ | | /dev/tapX fd v +-------------------+ | macvtap0 | | | | TAP 字符设备接口 | | + macvlan 二层逻辑 | +---------+---------+ | | lowerdev v +-------------------+ | eth0 / ens33 | | physical NIC | +---------+---------+ | v +-------------------+ | 外部二层网络 | | switch / LAN | +-------------------+
|
QEMU -> macvtap0 -> eth0 -> LAN
虚拟化中一般使用TAP和bridge来组建虚拟网络,但这样组网结构会稍显复杂。Linux上的MACTAP设备可以简化这种结构。MACVTAP设备集成了MACVLAN和TAP设备二者的特性。它可以基于一个物理网卡创建多个MAC地址不同的虚拟网卡,同时虚拟网卡收到的包不再交给内核协议栈,而是通过TAP设备的文件描述符传递到用户态进程。
macvtap把两层能力合并了:
普通 TAP 提供给 QEMU 的 fd + macvlan 提供的二层接入能力 = macvtap
所以它能替代 tap + bridge 的关键点是:
- QEMU 仍然拿到一个像 TAP 一样的 fd
- VM 仍然拥有独立 MAC
- 数据包仍然能从物理网卡进入外部二层网络
- 但中间不再需要显式 br0
参考资料:
- Introduction to Linux interfaces for virtual networking
- Linux虚拟网络设备