服务器虚拟化技术要追述到IBM大型机的虚拟化 z/VM,在z系列大型机(非虚拟化操作系统是z/OS)上实现服务器虚拟化。基于z/VM可以运行上百个虚拟机。后来在Power上的KVM技术是PowerKVM;以及AIX虚拟化PowerVM,支持vSCSI和NPIV两种技术(虚拟出系统叫VIOS)。今天的内容覆盖了CPU虚拟化、内存虚拟化、Intel硬件辅助技术、IO虚拟化和GPU虚拟化等,技术深度科普文章;请老司机们让车,忽略今天的内容。
很多读者可能认为服务器虚拟化技术遭到了容器技术的冲击,可能已经过时了,事实上在很多场景下,虚拟化技术并非容器所能够替代的。所以作为要踏入云计算领域的初学者们,还是有必要深入了解服务器虚拟化。下面我们看看虚拟化发展历程和外在因素和推动力。
分区技术使得虚拟化层为多个虚拟机划分服务器资源的能力;使您能够在一台服务器上运行多个应用程序,每个操作系统只能看到虚拟化层为其提供的虚拟硬件。
虚拟机隔离让虚拟机是互相隔离,一个虚拟机的崩溃或故障(例如,操作系统故障、应用程序崩溃、驱动程序故障等等)不会影响同一服务器上的其它虚拟机。
封装意味着将整个虚拟机(硬件配置、BIOS 配置、内存状态、磁盘状态、CPU 状态)储存在独立于物理硬件的一小组文件中。这样,您只需复制几个文件就可以随时随地根据需要复制、保存和移动虚拟机。
CPU虚拟化发展
服务器虚拟化按照虚拟化程度可分为全虚拟化、半虚拟化、硬件辅助虚拟化。
CPU虚拟化的条件和技术难点,CPU本身有不同运行级别,这些级别对应不同权限。虚拟机执行到这些敏感指令的时候,很有可能出现错误,将会影响到整个机器的稳定,所以不允许VM直接执行。那就需要虚拟化平台解决这个问题。
全虚拟化: VMM在软件堆栈中的位置是传统意义上操作系统所处的位置,而操作系统的位置是传统意义上应用程序所处的位置。每个Guest OS对特殊指令访问通信需要进行二进制转换,以便提供到物理资源(如处理器、内存、存储、显卡和网卡等)的接口,模拟硬件环境。
半虚拟化: Guest OS的部分代码被改变,从而使Guest OS会将和特权指令相关的操作都转换为发给VMM的Hypercall(超级调用),由VMM继续进行处理并返回结果。
硬件辅助虚拟化: 引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式)下,且Guest OS运行在Ring 0下运行。使得Guest OS的核心指令可以直接下达到计算机系统硬件执行,而不需要经过VMM。
虚拟化软件架构分类
服务器虚拟化是云计算非常关键的技术之一,虚拟化的含义很广泛,包括服务器、存储、网络以及数据中心虚拟化。其宗旨就是将任何一种形式的资源抽象成另一种形式的技术都是虚拟化。今天我们讨论一下服务器虚拟化架构的分类。
寄居虚拟化: 虚拟化管理软件作为底层操作系统(Windows或Linux等)上的一个普通应用程序,然后通过其创建相应的虚拟机,共享底层服务器资源。
裸金属虚拟化: Hypervisor是指直接运行于物理硬件之上的虚拟机监控程序。它主要实现两个基本功能:首先是识别、捕获和响应虚拟机所发出的CPU特权指令或保护指令;其次,它负责处理虚拟机队列和调度,并将物理硬件的处理结果返回给相应的虚拟机。
操作系统虚拟化: 没有独立的hypervisor层。相反,主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。一个明显的区别是,如果使用操作系统层虚拟化,所有虚拟服务器必须运行同一操作系统(不过每个实例有各自的应用程序和用户账户),Virtuozzo/OpenVZ/Docker等等。
混合虚拟化: 混合虚拟化模型同寄居虚拟化一样使用主机操作系统,但不是将管理程序放在主机操作系统之上,而是将一个内核级驱动器插入到主机操作系统内核。这个驱动器作为虚拟硬件管理器(VHM)协调虚拟机和主机操作系统之间的硬件访问。可以看到,混合虚拟化模型依赖于内存管理器和现有内核的CPU调度工具。就像裸金属虚拟化和操作系统虚拟化架构,没有冗余的内存管理器和CPU调度工具使这个模式的性能大大提高。
各种架构对比
裸金属虚拟化架构与混合虚拟化架构将是未来虚拟化架构发展的趋势,配合硬件辅助虚拟化可以达到接近物理机的运行性能。KVM、Hyper-V、VMware等主流服务器虚拟化都支持硬件辅助虚拟化。
内存虚拟化
在虚拟环境里,虚拟化管理程序就要模拟使得虚拟出来的内存仍符合客户机OS对内存的假定和认识。在虚拟机看来,物理内存要被多个客户OS同时使用;解决物理内存分给多个系统使用,客户机OS内存连续性问题。
要解决以上问题引入了一层新的客户机物理地址空间来让虚拟机OS看到一个虚拟的物理地址,并由虚拟化管理程序负责转化成物理地址给物理处理器执行。即给定一个虚拟机,维护客户机物理地址到宿主机物理地址之间的映射关系;截获虚拟机对客户机物理地址的访问,将其转化为物理地址。
内存全虚拟化: 虚拟化管理程序为每个Guest都维护一个影子页表,影子页表维护虚拟地址(VA)到机器地址(MA)的映射关系。
内存半虚拟化技术: 当Guest OS创建一个新的页表时,其会向VMM注册该页表,之后在Guest运行的时候,VMM将不断地管理和维护这个表,使Guest上面的程序能直接访问到合适的地址。
硬件辅助内存虚拟化: 在原有的页表的基础上,增加了一个EPT(扩展页表)页表,通过这个页表能够将Guest的物理地址直接翻译为主机的物理地址。
I/O虚拟化技术
当虚拟化后,服务器的以太网端口被分割为多个后,网络、存储以及服务器之间的流量可能就不够用了。当遇到I/O瓶颈时,CPU会空闲下来等待数据,计算效率会大大降低。所以虚拟化也必须扩展至I/O系统,在工作负载、存储以及服务器之间动态共享带宽,能够***化地利用网络接口。
I/O虚拟化的目标是不仅让虚拟机访问到它们所需要的I/O资源,而且要做好它们之间的隔离工作,更重要的是,减轻由于虚拟化所带来的开销。
全虚拟化: 通过模拟I/O设备(磁盘和网卡等)来实现虚拟化。对Guest OS而言,它所能看到就是一组统一的I/O设备,VMM截获Guest OS对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对Guest而言非常透明,无需考虑底层硬件的情况。比如Guest操作的是磁盘类型、物理接口等等。
半虚拟化: 通过前端、后端架构,将Guest的I/O请求通过一个环状队列传递到特权域(也被称为Domain0)。因为这种方式的相关细节较多,所以会在后文进行深入分析。
硬件辅助虚拟化: ***代表性莫过于Intel的VT-d/VT-c,AMD的IOMMU和PCI-SIG的IOV等。这种技术也需要相应网卡配合实现,目前常见的网卡分为普通网卡、VMDq直通和SR-IOV。
普通网卡采用Domin0网桥队列。
VMDq通过VMM在服务器的物理网卡中为每个虚机分配一个独立的队列,虚机出来的流量可直接经过软件交换机发送到指定队列上,软件交换机无需进行排序和路由操作,Hyper-V就是采用这种模式。
SR-IOV通过创建不同虚拟功能(VF)的方式,给虚拟机使用物理独立网卡,实现虚拟机直接跟硬件网卡通信,不再经过软件交换机,减少了虚拟化管理程序层的地址转换。
Intel硬件对虚拟化支持
VT-x技术 为IA 32 处理器增加了VMX root operation 和 VMX non-root operation两种操作模式。VMM自己运行在 VMX root operation 模式,GuestOS运行在VMXnon-root operation 模式。两种操作模式都支持 Ring0-Ring 3特权运行级别,因此 VMM和 Guest OS 都可以自由选择它们所期望的运行级别。允许虚拟机直接执行某些指令,减少VMM负担。VT-x指至强处理器的VT技术,VT-i指安腾处理器的VT技术。
VT-d(VT for Direct I/O)主要在芯片组中实现,允许虚拟机直接访问I/O设备,以减少VMM和CPU的负担。其核心思想就是让虚拟机能直接使用物理设备,但是这会牵涉到I/O地址访问和DMA的问题,而VT-d通过采用DMA重映射和I/O页表来解决这两个问题,从而让虚拟机能直接访问物理设备。
VT-c(VTfor Connectivity)主要在网卡上实现,包括两个核心技术VMDq和VMDc。VMDq通过网卡上的特定硬件将不同虚拟机的数据包预先分类,然后通过VMM分发给各虚拟机,以此减少由VMM进行数据包分类的CPU开销。VMDc允许虚拟机直接访问网卡设备,Single Root I/O Virtualization(SR-IOV)是PCI-SIG规范,可以将一个PCIe设备分配给多个虚拟机来直接访问。
可信执行技术(TXT)通过使用高级的模块芯片,可以有效确保用户计算机免受各种安全威胁。主要是通过硬件内核和子系统来控制被访问的计算机资源。使得计算机病毒、恶意代码、间谍软件和其他安全威胁将不复存在。
GPU及GPU虚拟化技术
GPU直通将GPU设备直通给虚拟机;GPU共享则将GPU设备直通给GPU server虚拟机,GPU server可与GPU client共享其 GPU设备;GPU虚拟化是指将GPU设备可虚拟化为n个vGPU,对应的n个虚拟机可同时直接使用该GPU设备,支持虚拟化的GPU设备可配置为直通或虚拟化类型。
GPU虚拟化通过VGX GPU硬件虚拟化功能,把一个物理GPU设备虚拟为多个虚拟GPU设备供虚拟机使用,每个虚拟机通过绑定的vGPU可以直接访问物理GPU的部分硬件资源,所有vGPU都能够分时共享访问物理GPU的3D图形引擎和视频编解码引擎,并拥有独立的显存。
GPU虚拟化功能支持将一个物理GPU设备可同时供多个虚拟机使用,而GPU直通中一个GPU设备只能给一个虚拟机使用。GPU虚拟化使同时使用同一GPU物理设备的虚拟机间互不影响,系统自动分配物理GPU设备的处理能力给多个虚拟机,而GPU共享是通过GPU server挂载GPU设备,在主机上建立GPU Server与GPU client的高速通讯机制,使得GPU client可以共享GPU server的GPU设备,GPU client是否享有GPU功能完全依赖于GPU server。