众所周知,虚拟化技术旨在将有限的物理资源(CPU、内存等)抽象成更多份的虚拟资源供上层应用使用。最常用的领域有云服务提供商,SDN/NFV,比如:在一台物理服务器上运行成百上千的虚拟机,并将单个虚拟机出租给不同用户。
虚拟化的实现主要由三项关键技术构成:CPU虚拟化、内存虚拟化和I/O虚拟化。其中CPU和内存虚拟化多由硬件支持实现,如intel VT-x、VT-d等IA架构扩展,还有EPT页表等。而I/O虚拟化则没有CPU和内存虚拟化那么统一,由于其大量基于软件实现,因此发展过程中,衍生出了好多种性能、灵活性各异的方案。我们通常所说的全虚拟化和半虚拟化一般都是在网络I/O虚拟化中体现的差异最大。
1.网络I/O全虚拟化
该方式采用软件模拟真实硬件设备。一个设备的所有功能或者总线结构(如设备枚举、识别、中断和DMA)等都可以在宿主机中模拟。而对客户机而言看到的是一个功能齐全的“真实”的硬件设备。其实现上通常需要宿主机上的软件配合截取客户机对I/O设备的各种请求,通过软件去模拟。比如:QEMU/KVM虚拟化中QEMU就可以通过模拟各种类型的网卡。
这种方式的好处是灵活,不需要专有驱动,因此能实现既不需要修改客户机、也无需考虑底层硬件,对客户机透明地使用网络资源。但是缺点在于,很多中断信号的处理需要让客户机感觉到自己运行在一个“真实环境”,因此QEMU软件模拟的很底层,效率低下。
2.网络I/O半虚拟化
在这种虚拟化中,客户机操作系统能够感知到自己是虚拟机,I/O的虚拟化由前端驱动和后端驱动共同模拟实现。在客户机中运行的驱动程序称之为前端,在宿主机上与前端通信的驱动程序称之为后端。前端发送客户机请求给后端,后端驱动处理完这些请求后再返回给前端。而在不同的虚拟化机制中,