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 9: macvtap0@eth1: <BROADCAST,MULTICAST,UP,M-DOWN> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500 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>