计算虚拟化与Hypervisor

一、计算虚拟化概述

随着云计算的不断普及,云计算、虚拟化等名词逐渐被大众所熟知,但是两者的概念却经常会让人混淆。云计算不是一项具体的技术,而是一种资源交付模型,云计算1.0是以虚拟化为基础,并在此之上进一步发展的。那么虚拟化又是什么呢?

在早期的“烟囱式架构”中,软硬件是耦合的,物理服务器被一个操作系统占用,资源利用率非常低。虚拟化技术出现后,可以通过Hypervisor在同一物理服务器上运行多个虚拟机,每个虚拟机都是一个完整的系统。虚拟化技术将软硬件解耦,大幅度提高了资源的利用率。

虚拟化中有以下重要概念:

    Hypervisor(虚拟化管理程序):位于物理机与虚拟机之间的“元”操作系统,用于创建和执行虚拟机。

    Virtual Machine(虚拟机):在Hypervisor上运行的虚拟计算机,具有分区、隔离、封装、独立等特点。

    Guest OS(客户操作系统):运行在虚拟机上的操作系统,与普通操作系统相同,不需要进行修改即可在虚拟机上运行。

前面提到的虚拟化是针对于CPU、内存、IO设备等计算资源,因此称为计算虚拟化。计算虚拟化可以将计算资源池化,而Hypervisor是虚拟化技术的核心,计算虚拟化就是通过Hypervisor向用户提供标准的虚拟机。

二、Hypervisor概述

Hypervisor也称为VMM(Virtual Machine Monitor,虚拟机监视器),是一种运行在物理服务器和虚拟机系统之间的中间软件层,可允许多个虚拟机共享一套物理基础设施。当Hypervisor被启动并执行时,会为虚拟机分配CPU、内存、磁盘、网络等硬件资源,并加载虚拟机的客户操作系统。

Hypervisor的架构主要分为两种:

    1.裸机型Hypervisor

裸机型是指Hypervisor运行在物理服务器上,Guest OS对硬件的访问必须通过Hypervisor完成。Hypervisor作为底层硬件的直接操作者,拥有硬件的驱动程序,可以直接管理和调用硬件资源。

裸机型代表是ESXi、Xen、Hyper-V以及KVM。

    2.宿主型Hypervisor

宿主型是指Hypervisor之下还有一层宿主操作系统,Guest OS对硬件的访问必须经过宿主操作系统。虚拟机上的应用程序调用硬件资源需要经过多层(VM内核→Hypervisor→主机内核),但可以充分利用宿主操作系统提供设备驱动和底层服务来进行内存管理、进程调度和资源管理等。

宿主型代表是Workstation、Virtual PC、Virtual Server以及GSX Server。

由于宿主型Hypervisor性能较低和开源生态优势等原因,目前很多厂商都是使用基于裸机型Hypervisor中KVM架构的计算虚拟化。KVM(Kernel-based Virtual Machine,基于内核的虚拟机)是一种基于Linux内核的虚拟化开源技术,其使用Linux调度器进行管理,因此核心源码非常少。

KVM运行在内核空间,属于Linux内核中的一个模块,可以提供CPU和内存的虚拟化,但还需要一个运行在用户空间用于模拟虚拟机硬件的组件。QEMU是一个完整的开源模拟器软件,可以作为模拟虚拟机硬件的用户空间工具。

Linux内核为内核空间的程序,可以直接管理所有物理设备。Linux系统上的服务则为用户空间的程序,需要使用内核的接口提供服务。

三、Hypervisor的技术实现

计算虚拟化对物理资源的虚拟可分为CPU虚拟化、内存虚拟化和I/O虚拟化,实现方式可分为全虚拟化、半虚拟化和硬件辅助虚拟化。

    1.CPU虚拟化

x86架构CPU有四个特权级(Ring0~Ring3),用来隔离系统软件和应用软件执行的指令。特权指令是指只能在CPU最高特权级(内核态)执行的指令,而大部分的可读写关键资源的指令都是特权指令。如果不在CPU内核态执行特权指令,便会引发异常由系统软件处理非法访问(陷入)。

实现虚拟化的经典方式是使用“特权解除、陷入模拟”,即将Hypervisor运行在最高特权,Guest OS运行在非特权级。解除Guest OS的特权级后,大部分指令仍然可以直接在硬件上运行,只有执行特权指令时,才会陷入到Hypervisor模拟执行。

CPU全虚拟化是将Hypervisor运行在Ring0,Guest OS运行在Ring1。Hypervisor为Guest OS提供CPU模拟,将指令翻译成真实的CPU指令,相当于Guest OS运行在模拟的Ring0上。CPU全虚拟化的虚拟机具有完全的物理机特性,Guest OS无需进行修改即可运行,兼容性高,但是所有指令都需要经过Hypervisor翻译,因此性能较差。

CPU半虚拟化是通过修改Guest OS的代码,将特权指令相关操作转交给Hypercall(超级调用),由运行在Ring0的Hypervisor处理。CPU半虚拟化的性能要优于CPU全虚拟化,但是需要修改Guest OS(Windows不支持修改),依赖于特定的Hypervisor,因此半虚拟化被很多虚拟化厂商放弃。

CPU硬件辅助虚拟化是通过引入新的CPU指令和运行模式,使Hypervisor和Guest OS运行在不同的模式,即Root模式和Non-root模式。这两个模式都有Ring0~Ring3特权级,Hypervisor运行在Root模式的Ring0,Guest OS运行在Non-root模式的Ring0。CPU硬件辅助虚拟化提升了性能且无需修改Guest OS,因此成为了发展趋势,而KVM就是基于硬件辅助虚拟化Intel-VT和AMD-V技术。

    2.内存虚拟化

虚拟内存是一种计算机系统内存管理机制,可以将物理内存抽象化,为应用程序提供连续的虚拟内存地址(64位系统地址空间为2^64)。系统将虚拟地址空间和物理地址空间分别划分为大小相同的页,并通过页表记录地址之间的映射关系,MMU(内存管理单元)根据页表完成虚拟地址到物理地址的转换。

在计算虚拟化中,Hypervisor管理系统的内存资源,虚拟机也有内存管理机制,因此有VA(客户机虚拟地址)、PA(客户机物理地址)、MA(宿主机机器地址)三层映射关系,而内存虚拟化需要完成VA到MA的转换。

内存全虚拟化是使用SPT(影子页表)实现,Hypervisor为Guest OS的每个页表维护一个VA到MA映射关系,并与Guest OS的页表保持同步的影子页表,Hypervisor通过影子页表直接完成VA到MA的转换。内存全虚拟化中的Guest OS无需感知地址转换,但是影子页表需要由Hypervisor维护并与Guest OS页表保持同步,因此性能较差。

内存半虚拟化是由Hypervisor截获Guest OS对页表的写入请求,直接将VA到MA的映射关系写入到Guest OS的页表中,Guest OS根据修改过的页表直接完成VA到MA的转换。内存半虚拟化的性能有较大提升,但是需要修改Guest OS以写入VA到MA的映射关系。

内存硬件辅助虚拟化是由Hypervisor将PA到MA的映射关系设置到CPU中,Guest OS修改页表无需Hypervisor的干扰,CPU自动查找两张页表完成VA到MA的转换。内存硬件辅助虚拟化提升了性能且无需修改Guest OS,相关技术有SLAT(Intel EPT、AMD NPT)。

    3.I/O虚拟化

从CPU的角度来看,外设是通过一组I/O资源访问的设备,因此设备相关的虚拟化被称为I/O虚拟化。Hypervisor通过I/O虚拟化来复用有限的设备资源,包括显卡、网卡和硬盘等。

I/O全虚拟化是通过Hypervisor截取虚拟机的I/O请求,以软件的形式模拟虚拟机I/O设备。I/O全虚拟化无需修改Guest OS即可完成I/O操作,但是整个过程是通过软件模拟,虚拟机的I/O请求需要与Hypervisor进行多次交互,因而开销较大、性能较差。

I/O半虚拟化是由Guest OS提供前端驱动,Hypervisor提供后端驱动,前端驱动通过通信机制,将虚拟机的I/O请求发送给Hypervisor的后端驱动处理。I/O半虚拟化需要Guest OS实现前端驱动,后端驱动容易成为瓶颈,但是性能相当于I/O全虚拟化有很大提升,相关技术有Virtio。

I/O硬件辅助虚拟化是指I/O直通或透传技术,其原理是将I/O设备直接分配给虚拟机,使虚拟机不需要经过Hypervisor,可以直接访问I/O设备。I/O硬件辅助虚拟化无需修改Guest OS且性能很好,但是需要硬件的支持,相关技术有IOMMU(Intel VT-d、SR-IOV等)。

(0)

相关推荐