虚拟化技术
虚拟化技术的通用实现方案是将软件和硬件相互分离,在操作系统与硬件之间加入一个虚拟化软件层,通过空间上的分割、时间上的分时以及模拟,将服务器物理资源抽象成逻辑资源,向上层操作系统提供一个与它原先期待一致的服务器硬件环境,使得上层操作系统可以直接运行在虚拟环境上,并允许具有不同操作系统的多个虚拟机相互隔离,并发运行在同一台物理机上,提高的资源利用率和灵活性。
我的新书《LangChain编程从入门到实践》 已经开售!推荐正在学习AI应用开发的朋友购买阅读!
VMM
计算虚拟化的虚拟化软件层需要模拟出来的逻辑功能主要为高效、独立的虚拟计算机系统,称之为虚拟机,在虚拟机中运行的操作系统软件,称之为Guest OS。虚拟化软件层模拟出来的每台虚拟机都是一个完整的系统,它具有处理器、内存、网络设备、存储设备和BIOS,因此虚拟机中运行的操作系统和应用程序与在物理服务器上运行的操作系统和应用程序并没有本质的区别。
计算虚拟化的这个软件层就是虚拟机监控器(Virtual Machine Monitor,VMM),是联系HostOS和GuestOS的一个中间件,通常被称为Hypervisor,Hypervisor软件架构方案分为两类,即Type-I型和Type-II型。
- Type-I型(裸金属型)
Type-I型(裸金属型)指VMM直接运行在裸机上,使用和管理底层的硬件资源,Guest OS对真实硬件资源的访问都要通过VMM来完成,作为底层硬件的直接操作者,VMM拥有硬件的驱动程序。 - Type-II型(宿主型)
Type-II型(宿主型)指VMM之下还有一层宿主操作系统,由于Guest OS对硬件的访问必须经过宿主操作系统,因而带来了额外的性能开销,但可充分利用宿主操作系统提供的设备驱动和底层服务来进行内存管理、进程调度和资源管理等。
虚拟化实现方式
全虚拟化(Full Virtualization)
全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其他系统软件完全不做任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。
全虚拟化VMM以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。比较著名的全虚拟化VMM有VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac和QEMU(QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件)
半虚拟化(Paravirtualization)
半虚拟化(Paravirtualization)是一种修改Guest OS部分访问特权状态的代码以便直接与VMM交互的技术。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给Guest OS,可以通过Hypercall(VMM 提供给Guest OS直接调用,与系统调用类似)的方式来提供。由于不会产生额外的异常和模拟部分硬件执行流程,半虚拟化可以大幅度提高性能,比较著名的有Xen。
硬件辅助虚拟化(Hardware-Assisted Virtualization)
硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了Intel-VT技术的支持,Guest OS和VMM的执行环境自动地完全隔离开来,Guest OS有自己的“全套寄存器”,可以直接运行在最高级别。因此Guest OS能够执行修改页表的汇编指令。Intel-VT和AMD-V是目前x86体系结构上可用的两种硬件辅助虚拟化技术。
KVM(kernel-based virtual machine)就是基于内核的虚拟机,是Linux全虚拟化解决方案,KVM从2.6.20版本开始被合入kernel主分支维护,成为Linux的重要模块之一,已经实现了对x86、PowerPC等体系结构的支持。KVM本身只能够提供CPU虚拟化和内存虚拟化等部分功能,而其他设备的虚拟和虚拟机的管理工作,则需要依靠QEMU来完成。在KVM虚拟化方案中,通过在Linux内核中增加虚拟机管理模块,直接使用Linux非常成熟和完善的模块和机制,例如内存管理和进程调度等,从而使Linux内核成为能够支持虚拟机运行的Hypervisor。
一般x86 CPU的架构
CPU为了保证程序代码执行的安全性、多用户的独立性、保护OS的正常运行,提出了CPU执行状态的概念。这样能够限制不同程序之间的访问能力,避免一个程序获取另一个程序的内存数据造成数据混乱,同时也避免了程序错误的操作物理硬件。一般CPU都会划分为 用户态 和 内核态 ,x86的CPU架构更是细分为了Ring3~0四种状态。
在KVM虚拟化场景中,KVM主机在根模式下运行,主机的kernel处于Ring0级别,而用户态程序则处于Ring3级别。Guset OS运行在非根模式下,其中,kernel运行在非根模式中的Ring0,而其他用户态程序则在Ring3上运行。当处于非根模式中的主机(即Guset OS)执行敏感指令时候,会触发VM-Exit,CPU会从非根模式切换到根模式,也就是KVM主机会进行接管,对敏感指令进行一系列的处理。同样也存在从根模式到非根模式的VM-Entry切换。