Virtio是半虚拟化hypervisor中位于设备之上的抽象层,主要用来提高虚拟化的I/O性能。Virtio最早由澳大利亚的天才程序员Rusty Russell开发,用来支持自己的Lguest虚拟化解决方案。
Virtio并没有提供多种设备模拟机制(比如,针对网络块和其他驱动程序),而是为这些设备模拟提供一个通用的前端,从而标准化接口和增加代码的跨平台重用。在这里,客户机操作系统运行在Hypervisor之上,并包含了充当前端的驱动程序。而Hypervisor为特定的设备模拟实现后端驱动程序。通过在这些前端和后端驱动程序中的Virtio,为开发模拟设备提供标准化接口,从而增加代码的跨平台重用率并提高效率。现在,很多虚拟机都采用了Virtio半虚拟化驱动来提高性能,例如KVM和Lguest。
Virtio的基本架构如图3-18所示。
图3-18 Virtio的基本架构
前端驱动程序(front-end driver),即virtio-blk、virtio-net、virtio-pci、virtioballon和virtio-console,是在客户机操作系统中实现的。
后端驱动程序(back-end driver),是在Hypervisor中实现的。另外,Virtio还定义了两个层来支持客户机操作系统与Hypervisor之间的通信。
Virtio是虚拟队列接口,它在概念上将前端驱动程序附加到后端驱动程序。一个驱动程序可以使用0个或多个队列,队列的具体数量取决于该驱动程序实现的需求。例如,virtio-net这个网络驱动程序使用两个虚拟队列,一个用于接收,另一个用于发送。而virtio-blk块设备驱动程序仅使用一个虚拟队列。虚拟队列实际上是跨越客户机操作系统和Hypervisor的衔接点,可以通过任意方式实现,但前提是客户机操作系统和Hypervisor必须以相同的方式实现它。
transport实现了环形缓冲区,用于保存前端驱动和后端处理程序的执行信息,在该环形缓冲区可以一次性保存前端驱动的多次I/O请求,并且交由后端驱动去批量处理,最后调用宿主机中的设备驱动来实现物理上的I/O操作,这样就实现了批量处理,而不是客户机中每次I/O请求都处理一次,从而提高客户机与Hypervisor信息交换的效率。(www.xing528.com)
现在,使用Virtio半虚拟化驱动方式,可以获得很好的I/O性能,其性能几乎可以达到和native(即非虚拟化环境中的原生系统)差不多。
目前,在宿主机中除了一些比较老的Linux系统不支持Virtio,Linux2.6.24及以上的内核版本都已支持Virtio,而且较新的Linux发行版本都已经将Virtio相关驱动编译成内核,可以直接为客户机使用。由于Virtio后端处理程序是在位于用户空间的QEMU中实现的,在宿主机中只需要比较新的Linux内核即可。
以Utuntu为例,相关的内核模块包括virtio.ko、virtio_ring.ko、virtio_pci.ko、virtio_balloon.ko、virtio_net.ko、virtio_blk.ko等。其中,virtio、virtio_ring和virtio_pci驱动程序是公用模块,提供了对Virtio API的基本支持,是任何Virtio前端驱动都必须使用的,其他模块都依赖于这三个模块,而且它们的加载是由一定顺序的,要按照virtio、virtio_ring、virtio_pci的顺序加载。其余的驱动可以根据实际需要进行选择性的编译和加载。比如,客户机需要使用Virtio驱动的balloon动态内存分配功能,则启用virtio_balloon模块;客户机使用Virtio驱动的网卡功能,则启用virtio_net模块;如果使用Virtio驱动的硬盘功能,则启用virtio_blk模块。
以Ubuntu14.04版本的内核配置文件为例,其中与Virtio相关的配置如下:
还可以通过命令查找系统中加载的Virtio相关模块,如下:
由于Windows操作系统不是开源的操作系统,微软公司本身没有提供Virtio相关的驱动,因此需要额外安装特定驱动来支持Virtio。以Utuntu14.04为例,包含一个名为virtio-win的RPM软件包,能为许多Windows版本提供Virtio相关的驱动。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。