《虚拟化技术——实战与原理解析》 第二章 KVM原理介绍

虚拟化模型

下图中显示了虚拟化模型
处于底层的是整个物理系统,主要包括处理器、内存和输入输出设备。
在物理设备之上,运行的是虚拟监控器(VMM),也称为Hypervisor。虚拟机监控器的主要职能是:管理真实的物理硬件平台,并为每个虚拟客户提供对应的虚拟硬件平台。
虚拟化模型

其实,在每个虚拟机中,我们也可以运行自己的虚拟机监控器,这种情况我们可以称为嵌套虚拟化。KVM支持嵌套虚拟化技术,只是该技术没有达到非常稳定和成熟的状态。

一个X86平台的核心是其中的处理器,X86平台虚拟化技术的核心部分是处理器的虚拟化。只要处理器虚拟化技术支持“截获重定向”,内存和输入输出设备的虚拟化都可以基于虚拟器虚拟化技术之上实现。在处理器虚拟化基础之上,为了增强虚拟机的性能,内存虚拟化和IO虚拟化的新技术也不断加入到X86虚拟化技术之中。X86平台虚拟化技术从开始的单一处理器开始,逐步涉及芯片组、网卡、存储设备以及GPU的虚拟化。

KVM框架

我们将虚拟机分为两种:称之为类型一类型二

类型一

“类型一”虚拟机是在系统上电之后首先加载运行虚拟机监控程序,而传统的操作系统则是在运行在其创建的虚拟机中。从某种意义上来说,类型一的虚拟机监控程序可以视为是一个特别为虚拟机而优化剪裁的操作系统内核。虚拟机监控程序作为运行在底层的软件层,必须实现诸如系统的初始化、物理资源的管理等操作系统的职能;它对虚拟机的创建、调度和管理,与操作系统对进程的创建、调度与管理有共通之处。这样的虚拟机监控程序一般会提供一个具有一定特权的特殊虚拟机,由这个虚拟机来运行需要供给用户日常操作和管理使用的操作系统环境。类型一的代表是:Xen、VMware、ESX/ESXi、和微软的Hyper-V。

类型二

类型二虚拟机监控程序,在系统上电以后仍然运行一般意义上的操作系统(也就是俗称的宿主机操作系统),虚拟机监控程序作为特殊的应用程序,可以视为操作系统功能的扩展。对于类型二的虚拟机来说,其最大的优势在于可以充分利用现有的操作系统。因为虚拟机监控程序通常不必自己实现物理资源的管理和调度算法,所以实现起来比较简洁。
但是,这一类型的虚拟机监控程序既然依赖操作系统来实现管理和调度,就同样也会受到宿主操作系统的一些限制。例如:常常会因为无法对操作系统进行修改来优化虚拟机。KVM、VMware workstations 、virtualBox是属于类型二的虚拟机。

KVM基本架构

KVM架构
KVM是一个基于宿主机操作系统的类型二虚拟机。类型二的虚拟机监控程序是作为内核的一个模块,其他的部分则尽可能充分利用Linux内核的既有实现,最大限度地重用代码。
图中,左侧部分是一个标准的linux操作系统,可以是RHEL、Fedora、Ubuntu等。KVM内核模块在运行时需要加载进入内核空间运行。KVM本身不执行任何设备模拟,需要用户空间程序QEMU通过/dev/kvm接口设置一个虚拟客户机的地址空间,向它提供模拟的I/O设备,并将它的视频显示映射回宿主机的显示屏。

KVM模块

处理器虚拟化

KVM模块是KVM虚拟机的核心模块,主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
为了软件的简介和性能,KVM仅支持硬件虚拟化。KVM的职责就是打开并初始化系统硬件以支持虚拟机的运行。以KVM在Intel的CPU上运行为例,在被内核加载的时候,KVM模块会先初始化内部的数据结构;做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统(包括KVM模块)置于虚拟化模式中的根模式;最后,KVM模块创建特殊设备文件/dev/kvm 并等待来自用户空间的命令。接下来虚拟机的创建和运行将是一个用户空间的应用程序(QEMU)和KVM模块相互配合的过程。
KVM模块与用户空间QEMU之间的通信接口主要是一系列针对特殊设备文件的IOCTL调用。
在KVM模块加载之初,只存在/dev/kvm文件,而针对该文件的最重要的IOCTL调用就是创建虚拟机。这里,创建虚拟机可以理解成KVM为了某个特定的虚拟客户机(用户空间程序穿件并初始化)创建对应的内核数据结构。同时,KVM还会返回一个文件句柄来代表所创建的虚拟机。针对该文件句柄的IOCTL调用可以对虚拟机做相应的管理,比如创建用户空间的虚拟地址和客户机物理地址及真是内存物理地址的映射关系,再比如创建多个可供运行的虚拟处理器(vCPU)。同样,KVM模块会对每个创建出来的虚拟处理器生成对应的文件句柄,对虚拟处理器相应的文件句柄进行相应的IOCTL调用,就可以对虚拟处理器进行管理。
针对虚拟处理器的最重要的IOCTL调用就是执行虚拟处理器。通过它,用户空间准备好的虚拟机在KVM模块的支持下,被置于虚拟化模式中的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令会被处理器捕捉到,处理器在保存现场之后自动切换到根模式下,由KVM决定如何处理(要么由KVM模块直接处理,要么返回用户空间交由用户空间程序处理)

内存虚拟化

实际上,内存虚拟化往往是一个虚拟机实现过程中代码量最大、实现最复杂的部分(至少,在硬件支持二维地址之前是这样)。处理器的内存管理单元(MMU)是通过页表的形式将程序运行的虚拟地址转换为物理内存地址。在虚拟机模式下,内存管理的页表则必须在一次查询的时候完成两次地址转换——除了要将客户机程序的虚拟地址转换为客户机物理地址之外,还需要将客户机物理地址转换成为真实物理地址。KVM模式开始使用了影子页表的技术来解决这个问题:在客户机运行的时候,处理器真正使用的页表不是客户机操作系统维护的页表,而是KVM模块根据这个页表维护的另外一套影子页表。
影子页表实现复杂,并且有时候开销很大。为解决这个问题,新的处理器在硬件上做了增强(Intel的EPT技术)。通过引入第二级页表来描述客户机虚拟地址和真实物理地址的转换,硬件可以自动进行两级转换生成正确的内存访问地址,KVM将其称为二维分页机制
处理器对设备的访问主要是通过IO指令和MMIO,其中IO指令会被处理器直接截获,MMIO会通过配置内存虚拟化来捕捉。但是外设的模拟一般并不由KVM模块负责。一般来说,只有对性能要求比较高的虚拟设备才会由KVM内核模块开直接负责。比如虚拟中断控制器和虚拟时钟,这样可以大量减少处理器的模式切换的开销。大部分的输入输出设备还是会交给下一节将要介绍的用户态程序QEMU来负责。

QEMU设备模型

QEMU本身是一个著名的开源虚拟机软件。与KVM不同,QEMU虚拟机是一个纯软件的实现,所以性能低下。它的优点是,在支持QEMU本身编译运行的平台上就可以实现虚拟机的功能,甚至虚拟机还可以与宿主机不是统一架构。作为一个存在已久的虚拟机,QEMU中有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化,以及KVM用到的虚拟设备模拟(如,网卡、显卡、存储器和硬盘等等)。
为了简化开发和代码重用,KVM在QEMU的基础上进行了修改。虚拟机运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM模块负责将虚拟机置于处理器的特殊模式运行。遇到虚拟机进行输入输出操作,KVM模块会从上次的系统调用出口返回QEMU,由QEMU开负责解析和模拟这些设备。

从QEMU角度来看,也可以说QRMU使用了KVM模块的虚拟化功能,为自己的虚拟机运行以来的虚拟设备,虚拟机运行时的用户操作环境和交互每一集一些针对虚拟机的特殊技术(诸如动态迁移),都是由QEMU自己实现的。

Intel虚拟化技术

Intel虚拟化技术是一系列硬件技术的集合,虚拟化监控机软件同构选择利用各项技术,从而提高虚拟化软件的性能或者实现各种不同的功能。
如下图所示,Intel虚拟化技术可以分为三大类:

  • 处理器相关的,称为VT-x,是实现处理器虚拟化的硬件扩展,这也是硬件虚拟化的基础
  • 芯片组相关的,称为VT-d,是从芯片组的层面为虚拟化那个必要支持,通过它,可以实现诸如直接分配物理设备给客户机的功能
  • 输入输出设备相关的,主要目的是通过定义新的输入输出协议,使新一代的输入输出设备可以更好地支持虚拟化环境下的工作,比如Intel网卡自有的VMDq技术和PCI组织定义的单根设备虚拟化协议(SR-IOV)

Intel虚拟化技术进化图

发布了18 篇原创文章 · 获赞 2 · 访问量 6421
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览