本文将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

参考资料:

  1. Introduction to Linux interfaces for virtual networking
  2. Linux虚拟网络设备