四、virtio 半虚拟化驱动
virtio 是半虚拟化 hypervisor 中位于设备之上的抽象层,virtio 并没有提供多种设备模拟机制(针对网络、块和其他驱动程序),而是为这些设备模拟提供一个通用的前端,从而标准化接口和增加代码的跨平台重用。
在传统的完全虚拟化环境中,hypervisor 必须捕捉guest OS的IO请求,然后模拟物理硬件的行为。尽管这样做可以运行未更改的操作系统,但它的效率比较低(如下图左边部分)。在半虚拟化的实现中,来宾操作系统知道自己运行在 hypervisor 之上,并包含了充当前端的驱动程序,而Hypervisor 为特定的设备模拟实现后端驱动程序(下图的右边部分)。
目前,有不少虚拟机都采用了virtio半虚拟化驱动来提高性能,如KVM和Lguest。virtio分别为块设备(virtio-blk),比如磁盘,console设备(virtio-console),网络设备(virtio-net)、PCI 模拟(virtio-pci)和 balloon (virtio-balloon)驱动程序列出了 5 个前端驱动程序,每个前端驱动程序在 hypervisor 中有一个对应的后端驱动程序。
在virtio的架构中(如下所示),前端驱动(frondend,如virtio-blk、virtio-net等)是在客户机中存在的驱动程序模块,而后端处理程序(backend)是在QEMU中实现的,因此后端驱动程序与 hypervisor 的用户空间交互,以通过 QEMU 为 I/O 提供便利。
Virtio半虚拟化驱动的方式,可以获得很好的I/O性能,其性能几乎可以达到和native(即:非虚拟化环境中的原生系统)差不多的I/O性能。但是virtio的也是有缺点的,它必须要客户机安装特定的Virtio驱动使其知道自身是运行在虚拟化环境中,且按照Virtio的规定格式进行数据传输,在客户机中可能有一些老的Linux系统不支持virtio和主流的Windows系统需要安装特定的驱动才支持Virtio。