qemu对设备的模拟可以分成两类:全模拟和半模拟。全模拟即完全模拟物理设备的工作过程,使得运行在虚拟机上的软件完全感知不到自身运行环境的差异。例如qemu中实现了对IDE磁盘、LSI控制器(其上可接SCSI磁盘)等物理存储设备的模拟,原先运行在物理机上的IDE驱动、LSI驱动或应用程序不做任何改动即可运行在虚拟机中。因此,全模拟的优点比较明显,即不用提供专门针对虚拟化场景的设备驱动,完全可以复用物理环境下的驱动程序。那么全模拟有何缺点呢?全模拟时,虚拟机内部驱动会频繁访问虚拟机IO端口,KVM平台下会导致大量的陷入和陷出操作;另外虚拟机内外数据传输时只能通过以字节为单位的拷贝方式进行,无法直接采用共享内存的方式,因此存在较大的访问性能问题。
为解决全虚拟化在性能上的问题,半模拟技术应运而生。它构造了一种虚拟化环境所独有的存储设备,因此半虚拟化需要在虚拟机内部安装特定的驱动程序才能正常驱使该设备进行工作。通常我们称\虚拟机内部的驱动为前端驱动*,称*负责实现其功能模拟的程序(KVM平台下即为qemu程序)为后端程序**,半模拟技术也常常被叫做前后端技术。采用半摸拟技术后,配合前端驱动,虚拟化设备完全可以采用全新的事件通知和数据传递机制进而大幅提升性能, 例如在virtio-blk磁盘中,采用io_event_fd进行前端到后端通知,采用中断注入方式实现后端到前端的通知,并通过IO环(vring)进行数据的共享**。至此,主要说明了virtio-blk产生的背景及其价值。附上qemu所模拟的PC(基于intel i440fx主板架构)的组成结构图,以作为后续深入分析的基础。
virtio-scsi和virtio-blk都是磁盘的半虚拟化驱动,virtio-scsi解决了virtio-blk的一些限制。
virtio scsi hba取代virtio blk,这是一种简单的高性能准虚拟化存储设备。然而,virtio blk的设计固有的局限性如下:
- •virtio blk的范围有限,这使得新的命令实现变得复杂。每次开发一个新命令时,virtio blk驱动程序都必须在每个客户机中更新。
- •virtio blk将PCI功能和存储设备映射为1:1,限制了可扩展性。
- •virtio blk不是真正的SCSI设备。这会导致一些应用程序在从物理机移动到虚拟机时中断。