原文:http://virt.kernelnewbies.org/MacVTap


目的
Macvtap是一个新的设备驱动程序,旨在简化虚拟化的桥接网络。它取代基于macvlan设备驱动模块的TUN / TAP和桥驱动器的组合。一个macvtap终点(endpoint)是一个字符设备,主要遵循的TUN / TAP ioctl接口,可以直接使用KVM/ qemu和其他支持TUN / TAP接口的虚拟机管理程序。终点(endpoint)扩展了现有的网络接口,较低的设备,在同一个以太网段上的,拥有自己的MAC地址。通常情况下,这是用来使双方的客户机和主机直接显示的主机连接到交换机上的。


VEPA,Bridge、private mode

在macvlan中,任何macvtap设备可以在以上三种模式之一。定义在一个单一较低的设备macvtap端点之间的通信:
1.Virtual以太网端口聚合器(VEPA),默认模式:相同的设备上的数据从一个端点到另一个端点被发送到外部交换机降低设备。如果该交换机支持的发夹模式,帧开始浏览送回对下位装置,并从那里到目标端点。
今天,大多数交换机不支持发夹模式,所以是不能够交换以太网帧的两个端点,虽然他们可能仍然能够使用TCP / IP路由器进行通信。相邻的桥作为一台Linux主机可以被放入写的/ sys/ class / net中的/ dev/ BRIF/端口/hairpin_mode的发夹模式。这种模式是特别有趣,如果你要管理的虚拟机网络交换机级的。了解的VEPA客人的的交换机是可以强制每个MAC地址的过滤和带宽的限制,而不知道它在Linux主机。
1.Bridge,可以直接相互连接的所有端点。两个端点都在桥接模式下可以直接交换以太网帧,无需通过外部桥接的往返。这是最有用的模式与经典的开关设置,和客体间的通信性能的关键。
二基于完整性,私人模式存在的行为就像一个发夹知道开关在没有一个VEPA模式端点。即使当开关处于发夹模式,一个私人端点永远不能在同一lowerdev任何其他端点通信。


设置macvtap
创建一个macvtap接口使用的IP链路命令IPRoute2包中,以同样的方式,我们macvlan或VETH的接口配置。
示例:

$ ip link add link eth1 name macvtap0 type macvtap
$ ip link set macvtap0 address 1a:46:0b:ca:bc:7b up
$ ip link show macvtap0
12: macvtap0@eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 1a:46:0b:ca:bc:7b brd ff:ff:ff:ff:ff:ff
在相同的时间会由udev创建一个字符设备。除非另有配置,udev的名称,这装置/ dev/ tapn的,具有n个对应于指数的新macvtap端点的网络接口的数量,在上述例子中'12'TUN / TAP不同,字符设备只能代表一个单独的网络接口,我们可以给用户或用户组,我们希望能够使用新的自来水的所有权。端点配置的MAC地址是很重要的,因为使用这个地址在外部网络上,客人是不能够欺骗或改变地址,必须配置使用相同的地址。
Qemu中上macvtap
的Qemu0.12不直接支持macvtap的,所以我们有(AB)使用的TUN / TAP的配置界面。在接口上启动来宾从上面的例子中,我们需要通过一个打开的文件描述符与qemu的设备节点,并告诉它的MAC地址。通常用于桥配置的脚本必须被禁止。可以用来打开一个bash重定向字符设备的读/写模式,并把它作为文件描述符3。
qemu -net nic,model=virtio,addr=1a:46:0b:ca:bc:7b -net tap,fd=3 3<>/dev/tap11