本文结合Solaris的实现,简单介绍一下paravirtualization网卡驱动。Paravirtualization相对于full virtualization的主要优势在于其性能,前者需要修改Guest OS,而后者则需要模拟真实的网卡设备以利用操作系统上现有的网卡驱动。现在的虚拟机采用了一种叫做IOVM的技术,也就是hypervisor不提供网卡驱动,而是由IOVM提供。IOVM可以是Dom0。这样一来简化了hypervisor,二来可以利用现有的驱动。如果某种型号的网卡Solaris暂不支持,而Linux支持,就可以让Linux作Dom0,Solaris作DomU。
网卡驱动被拆分为了两部分,前端(backend)和后端(frontend)。Dom0中的驱动是后端,DomU中的驱动是前端。前后端通过event channels机制通讯,并配合基于共享内存(术语叫做grant table)的I/O Rings高效传输。以发送来为例,首先前端将上层传来的包建立DMA映射,将该页面通过grant table共享出去(xnf_send/xnf_send_one),通过event channels通知后断。后端通过grant table将前端共享的页面映射到自己的地址空间,然后通过Dom0 mac层接口(mac_tx)利用自身网卡驱动,例如e1000g,将包发送出去。对Solaris来说后端的实现有两种,一种是类Linux的实现,内核模块是xnbu+xnb,另外一种是结合Crossbow VNIC的实现,内核模块是xnbo+xnb。以前写过一篇文章,是说如何利用openvpn和bridge-utils软件让QEMU虚拟机联网。其原理是一样的,就是说让Dom0和DomU(或者主机和虚拟机)中的网卡通过网桥互联,当然这里的网卡和网桥都是软件模拟的,这样的话xnbu本是就是一个GLDv3网卡驱动。Solaris的另外一种实现xnbo本身不是GLDv3网卡驱动,而是打开Dom0上的网卡驱动,例如e1000g,让后端通过前端驱动间接拥有物理网卡,这样的局限性显而易见,我们不能为每一个domain都分配一个物理网卡,所以可以结合Crossbow的VNIC。
刚才提到了I/O Rings,这个ring和物理网卡的ring的用法是一样的。是一种生产者消费者的模型。仍以发送为例,前端不断向ring中填充descriptor,其中主要内容包括共享内存页面号(grant table reference),起始offset,大小等。后端被notified后读取其内容,然后将descriptor中所指的DMA buffer发送出去,然后前移指针,直到ring为空。I/O Rings由前端建立,其共享页面号通过XenStore告知后端,然后后端由grant table机制将共享页面映射到自己的地址空间。这些工作都是xnf/xnb驱动在attach的时候由函数xnf_be_connect/xnb_connect_rings完成的。
Event channel有几种类型,其中一种是interdomain events。这是一种双向的,主要用于PV环境下前后端之间的消息传递机制。Solaris使用中断来实现event channel。以传输为例,前端通知后端有包发送,后端通过中断函数xnb_intr来完成相应的发送任务的。同样,后端接收到网络上传来的包后,通知前端接收,前端通过中断函数xnf_intr来完成接收,然后交给DomU上层的。
http://blog.chinaunix.net/photo/23177_090427170458.pngDom0
# modinfo | grep xn
294 fffffffff8003220 f48 250 1 xnbo (xnbo driver)
295 fffffffff889b000 5158 - 1 xnb (xnb)
# mdb -k
> ::interrupts
IRQ Vect Evtchn IPL Bus Trg Type CPU Share APIC/INT# ISR(s)
4 0x38 27 12 ISA Edg Fixed 1 1 0x0/0x4 asyintr
7 0x50 25 5 ISA Edg Fixed 1 1 0x0/0x7 ecpp_isr
9 0x60 5 9 PCI Lvl Fixed 0 1 0x0/0x9 acpi_wrapper_isr
16 0xb8 12 9 PCI Lvl Fixed 1 5 0x0/0x10 drm_irq_handler_wrap, audiohd_intr, iwk_intr, pepb_intr_handler, uhci_intr
17 0xc0 13 1 PCI Lvl Fixed 0 2 0x0/0x11 uhci_intr, uhci_intr
18 0xa0 8 6 PCI Lvl Fixed 1 3 0x0/0x12 0, elxl_intr, uhci_intr
21 0xc8 19 6 PCI Lvl Fixed 1 1 0x0/0x15 e1000g_intr_pciexpress
22 0xa8 10 1 PCI Lvl Fixed 0 1 0x0/0x16 ehci_intr
23 0xb0 11 1 PCI Lvl Fixed 1 2 0x0/0x17 uhci_intr, ehci_intr
256 - I 15 - Edg ipi all - - xc_serv
257 - I 13 - Edg ipi all - - xc_serv
258 - I 11 - Edg ipi all - - poke_cpu
259 - 1 15 - Edg virq all - - xen_debug_handler
260 - T 14 - Edg virq all - - cbe_fire
261 - I 14 - Edg ipi all - - cbe_fire
262 - 16 3 - Edg virq all - - gcpu_xpv_virq_intr
263 - 21 1 - Edg evtchn 0 - - xenbus_intr
264 - D 1 xpvd Edg device 0 - - evtchn_device_upcall
265 - 2 9 xpvd Edg virq all - - xenconsintr_priv
266 - 28 5 xpvd Edg evtchn 0 - - xdb_intr
267 - 29 6 xpvd Edg evtchn 1 - - xnb_intr
DomU
# modinfo | grep xnf
148 fffffffff7e6c000 4748 192 1 xnf (Virtual Ethernet driver)
# mdb -k
> ::interrupts
IRQ Vect Evtchn IPL Bus Trg Type CPU Share APIC/INT# ISR(s)
256 - 1 15 - Edg virq all - - xen_debug_handler
257 - 1 1 - Edg evtchn 0 - - xenbus_intr
258 - T 14 - Edg virq all - - cbe_fire
259 - 5 5 xpvd Edg evtchn 0 - - xdf_intr
260 - 2 9 xpvd Edg evtchn 0 - - xenconsintr
261 - 6 6 xpvd Edg evtchn 0 - - xnf_intr
安装DomU
function xen-install
{
typeset file=/root/xvm/snv102_pv.img
typeset image=/net/bounty/ftp/pub/CDimages/nv/102/x86/solarisdvd.iso
/usr/bin/virt-install -p -n domu-102 -r 768 --nographics \
-f $file -s 10 -m "0:21:9b:cb:ee:c1" -l $image
}
一些基本用法
# virsh list
Id Name State
----------------------------------
0 Domain-0 running
- domu-102 shut off
# virsh start domu-102
Domain domu-102 started
# virsh list
Id Name State
----------------------------------
0 Domain-0 running
1 domu-102 running
# virsh console domu-102
v3.1.4-xvm chgset 'Mon Oct 13 22:14:51 2008 -0700 15904:94bd0a643efe'
SunOS Release 5.11 Version snv_102 64-bit
Copyright 1983-2008 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
...
参考文献:
The Definitive Guide to the Xen Hypervisor
Intel® Virtualization Technology for Directed I/O
Xen and the Art of Virtualization