虚拟化简介
文章目录
背景
本文试图对虚拟化的一些概念和原理进行一个简单介绍,用以作为跟进一步的虚拟化学习的铺垫。
虚拟化概念
virtualization——虚拟化,维基百科的解释:In computing, virtualization (v12n) is a series of technologies that allows dividing of physical computing resources into a series of virtual machines, operating systems, processes or containers.
VM——虚拟机,Virtual machine,可以像真实机器一样运行程序的计算机的软件实现
虚拟化技术是指在一个或以上的客操作系统(Guest Operating System,简称:Guest OS)在一个宿主操作系统(Host Operating System,简称:Host OS)下运行的一种技术。客操作系统也称为客户机,宿主操作系统也称为宿主机。
一个典型计算机系统的硬件组成(摘自深入理解计算机系统):
本文讨论的虚拟化就是需要模拟其中部分或者全部的硬件。
更广泛地虚拟化则可以理解为对资源的复用。将任何形式的资源抽象成另一种形式的技术都是虚拟化。比如虚拟内存是对物理内存的虚拟化,进程是对物理硬件执行环境的虚拟化。
虚拟化管理程序(Hypervisor)
Hypervisor,又称虚拟机器监视器(英语:virtual machine monitor,缩写为 VMM),是用来建立与执行虚拟机器的软件、固件或硬件。hypervisor提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;这些客体操作系统,共同分享虚拟化后的硬件资源。
虚拟化指令集
虚拟化指令集指的是将某个硬件平台的二进制代码转换为另一个平台的二进制代码,从而实现不同硬件指令集之间的兼容。这种技术也被形象地称为“二进制翻译”。
敏感指令集
敏感指令(Sensitive Instruction):在虚拟化场景下,在GuestOS的内核中有一部分非特权指令,它们不一定会改变或者损害整个系统,但是会影响基于虚拟化的整个系统的安全。
敏感指令是操作特权资源的指令,包括修改虚拟机的运行模式,改变宿主机的状态,读/写时钟、中断等寄存器,访问存储保护系统、地址重定位系统及所有的I/O指令。
例如,GuestOS的内核指令可以读取宿主机CPU的寄存器内容,从而看到整个系统的状态,这样一台虚拟机就可以看到另一台虚拟机的内部信息了。在虚拟化场景下,所有会危害到系统安全的指令集被称为“敏感指令集”。
波佩克与戈德堡将ISA的全部指令分为三类:
- 优先级指令
当处理器处于用户态时自陷,处于内核态时不自陷的指令。 - 控制敏感指令
试图改变系统资源配置的指令。 - 行为敏感指令
其行为或结果取决于资源配置状态(如重定位寄存器的内容或处理器所处模式)的指令。
Popek&Goldberg 原理
Popek&Goldberg 原理定义了如何设计一个有效的虚拟机监视器。
Popek&Goldberg虚拟化需求(Popek and Goldberg virtualization requirements)是一组充分条件,用于验证某一计算机体系结构可否被有效虚拟化。杰拉尔德·J·波佩克与罗伯特·P·戈德堡于1974年合作论文《可虚拟第三代架构的规范化条件(英语:Formal Requirements for Virtualizable Third Generation Architectures)》中提出。尽管这组条件基于简单化假设获得,但它们仍为判定一个计算机架构是否能够有效支持虚拟化提供了一个便利方法,也为设计可虚拟化计算机架构给出了指导原则。
系统虚拟机(system virtual machine)是指能够虚拟包括单或多处理器、内存、外存及周边设备在内之全体硬件资源的虚拟机。虚拟机监视器(virtual machine monitor,VMM)是一个软件,用于提供虚拟机的抽象(Abstraction)。当分析一个VMM所创造的环境时,有三点性质值得特别关注:
等价性:任何一个程序,在被管理程序控制时,除时序和资源可用性之外,应该与没有被管理程序控制时是一样的,而且预置的特权指令可以自由执行。即一个运行于VMM下的程序,其行为应与直接运行于等价物理机上的同程序的行为完全一致。
管理程序通常指的是虚拟机监视器,也称为hypervisor。虚拟机监视器是一种软件,它允许多个操作系统在同一台物理计算机上运行,并且对它们进行管理和监视。虚拟机监视器负责分配计算机的资源,如处理器时间、内存和输入/输出设备,以便多个操作系统之间可以共享这些资源。
时序指的是程序执行的时间顺序和时序关系,包括程序的指令执行顺序、时钟周期、中断处理等。在虚拟机监视器中,被管理程序受到虚拟机监视器的控制,因此其时序可能会受到影响。
资源可用性指的是系统中各种资源的可用性,包括CPU、内存、磁盘、网络等。在虚拟机监视器中,被管理程序的资源使用受到虚拟机监视器的限制和调度,因此其资源可用性也可能会受到影响。
资源控制:一个程序发出的任何调用系统资源的动作在被执行时,都应先调用控制程序(虚拟机监视器)。即VMM对虚拟资源进行完全控制。
效率性:一个程序产生的所有无害指令都应该由硬件直接执行,控制程序不应该在任何地方产生中断。即机器指令中经常使用的那一部分应在没有VMM干预下执行。
Popek和Goldberg虚拟化原理是一种计算机虚拟化技术的基本原理。该原理由Gerald J. Popek和Robert P. Goldberg于1974年提出。该原理规定了一个处理器架构必须满足的条件,以便能够支持虚拟化。这些条件包括特权指令的识别、特权指令的陷阱和仿真、设备I/O的虚拟化等。根据这些条件,Popek和Goldberg提出了一个虚拟机监视器(VMM)的概念,该监视器可以在硬件层面上管理和支持虚拟化环境。这个原理对虚拟化技术的发展产生了深远的影响,也为后来的虚拟化技术提供了理论基础。
1、虚拟机GuestOS中的所有非敏感指令都会“穿透”虚拟机监视器,直接运行在CPU上。
2、虚拟机GuestOS中的敏感指令,理想的状态是通过陷阱机制被虚拟机监视器所捕获,然后虚拟机监视器通过不同的模拟或虚拟化技术实现在虚拟机上的模拟。
波佩克与戈德堡描述了一台物理机为了能够运行具备以上性质之VMM,其指令集架构(Instruction Set Architecture,ISA)必须满足的特征。尽管这些分析使用所谓“第三代架构模型”(如IBM 360和DEC公司的PDP-10)得出相关特征,它们对于现在的计算机也是足够适用的。这个模型包括一个运行于系统或用户模式的CPU,并可以访问线形、统一化可编址内存。它还假设,指令集有一个子集只能运行于系统模式(内核态);内存通过一个重定位寄存器进行寻址。输入/输出和中断未被考虑。
波佩克与戈德堡的分析结果主要归纳如下:
定理1:对于任何传统的第三代计算机,只要其敏感指令是优先级指令的一个子集,就可以为其创建VMM。
直观地说,这条定理指出,欲构造一个VMM,其充分条件是所有可能影响VMM正常工作的指令(即敏感指令)能够自陷并将控制权移交给VMM。这就保证了资源控制;非特权指令则必须被本地(物理机)执行——也就是更有效率地执行。等价性也得到满足。
一个关联问题是递归虚拟化的ISA需求,即探讨在什么样的条件下可以创建一个能运行于自身拷贝上的VMM。波佩克与戈德堡指出,
定理2:一台传统第三代计算机是递归虚拟的,当它是可虚拟的;可以为它创建一台不加任何时间依赖性的VMM。
Popek&Coldberg原理的前提是,敏感指令必须都是特权指令,即敏感指令集是特权指令集的子集。只有这样,虚拟机监视器才能通过选用特权指令集的陷阱捕获方式进行虚拟化。
定理1所给出的条件可以通过牺牲第三条性质、效率性来放宽。因此,许多按波佩克与戈德堡之定义应归类为非可虚拟的ISA也有VMM。但是,虚拟这种体系结构意味着对一些关键指令,即敏感且非特权指令,必须作出正确处理。动态重编译中常用的补丁方法在这里得到运用:在运行时发现这样的指令,并以自陷到VMM来替换。
但是在x86处理器中,只能保证绝大多数的敏感指令是特权指令,还有约17个敏感指令不是特权指令,也就是说,敏感指令的范围更大。然而,当特权指令集是敏感指令集的真子集时,一部分敏感指令无法被虚拟机监视器捕获,也就是说虚拟机监视器无法完全控制这些指令的执行。这种情况被称为“虚拟化漏洞”,因为虚拟机监视器无法完全替代或者控制这些敏感指令的执行,可能会导致安全性问题。
监视器对敏感指令的处理过程
如果敏感指令都是特权指令,当在虚拟机中执行内核态的特权指令时,则会通过陷阱机制被下层的虚拟机监视器捕获。虚拟机监视器可以对捕获的特权指令进行替换操作,从而完整地模拟出某个虚拟机监视器下的特权操作。“陷阱+模拟”机制从本质上保证了可影响虚拟机监视器正常运行的指令由虚拟机监视器模拟执行,而大部分非敏感指令还是照常运行在物理CPU上。
虚拟化类型
虚拟化的类型总的来说,从实现的方式可以分为两个类型,分别为硬件虚拟化和软件虚拟化。从虚拟化的程度,可以分为完全虚拟化和准虚拟化,准虚拟化也称为半虚拟化。下面将针对每一种方式做一个简单的介绍:
硬件虚拟化和软件虚拟化
硬件虚拟化
概念上,虚拟机上的程序执行控制敏感指令影响物理机的行为,虚拟机上的程序执行行为敏感指令表现为在虚拟机上执行的效果,和它们在物理机上执行产生不同的效果。如果一个程序试图执行这些指令而不被阻止,将会给hypervisor和客户机系统带来严重的问题。因此,有必要让CPU在检测到一个敏感指令的开始执行并把它转向到 hypervisor,让hypervisor替代应用程序去执行这个敏感指令。然而,x86 CPU在设计之初并没有考虑到虚拟化的需求,所以有一些敏感指令试图在客户机系统执行时无法被CPU检测到,结果导致了hypervisor无法代替客户机系统去执行那些指令。
物理平台本身提供了对特殊指令的截获和重定向的硬件支持。虚拟化对用户隐藏了真实的计算机硬件,表现出另一个抽象计算平台。目前主要有两种:intel VT和AMD-V。
intel VT:英特尔虚拟化技术(IVT,Intel Virtualization Technology),由英特尔开发的一种虚拟化技术,它给处理器添加了新的执行模式,在CPU检测到这些敏感指令时进行模式切换,这样hypervisor就可以代替初始的那个程序去执行敏感指令。
具体来说,Intel VT-x添加了两个执行模式:VMX根操作和VMX非根操作模式,VMX代表了“virtual machine extension”。VMX非根模式是客户机系统的执行模式。如果在这个模式下试图执行敏感指令,CPU发现并切换到VMX根操作模式,即切换到hypervisor所处的执行模式。这个转换叫“VM Exit”,表示控制权转移到了hypervisor,使其能够代替客户机系统去执行敏感指令。
Intel VT-x引入了两条新的指令,VMLAUNCH和VMRESUME,使得可以切换到VMX非根操作模式,叫“VM Entry”。KVM的主要角色就是处理VM退出和执行VM Entry指令。KVM在Linux内核中以一个模块的形式实现。
AMD-V:AMD虚拟化(AMD Virtualization),AMD公司推出了支持虚拟化的硬件辅助技术,用于帮助VMM进行虚拟化,从而有效降低了虚拟化的开销,提高性能。
软件虚拟化
就是用纯软件的方法在现有的物理平台上(往往并不支持硬件虚拟化)实现对物理平台访问的截获和模拟。
完全虚拟化和半虚拟化
完全虚拟化
全虚拟化为客户机提供了完整的虚拟X86 平台,包括处理器、内存和外设,支持运行任何理论上可在真实物理平台上运行的操作系统,为虚拟机的配置提供了最大程度的灵活性。
半虚拟化
改动客户操作系统,使它以为自己运行在虚拟环境下,能够与虚拟机监控机协同工作。这种方法就叫准虚拟化(para-virtualization),也叫半虚拟化。
区别点:全虚拟化对主机性能影响较,不需要对客户机操作系统做任何修改即可正常运行任何非虚拟化环境中已存在基于X86 平台的操作系统和软件,是全虚拟化无可比拟的优势。半虚拟化对主机性能影响较小。
Type1和Type2虚拟化
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化分为Type1和Type2。
Type1 Hypervisor也叫native或bare-metal Hypervisor。这类虚拟化层直接运行在硬件之上,没有所谓的宿主操作系统。他们直接空值硬件资源以及客户机。Xen和VMware ESX是代表。
Type2 Hypervisor运行在一个宿主机操作系统之上(VMware workstation)或系统里(kvm)。这类Hypervisor通常就是宿主机操作系统的一个应用程序。客户机是在宿主机操作系统上的一个抽象,通常抽象为进程。
虚拟化解决方案
虚拟化的解决方案有很多种,Xen和KVM,是开源免费的虚拟化件;WMware是付费的虚拟化软件;Hyper-V微软的收费虚拟化解决方案;Docker是一种容器技术,属于一种轻量级虚拟化解决方案。下面简单介绍一下主流的KVM和Xen。
KVM:基于内核的虚拟机(英语:Kernel-based Virtual Machine,缩写为 KVM),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
Xen是一个开放源代码虚拟机监视器,由XenProject开发。Xen 在系统硬件与虚拟机之间插入一个虚拟化层,将系统硬件转换为一个逻辑计算资源池,Xen 可将其中的资源动态地分配给任何操作系统或应用程序。在虚拟机中运行的操作系统能够与虚拟资源交互,就好像它们是物理资源一样。
Xen的实现方法是运行支持Xen功能的kernel,这个kernel是工作在Xen的控制之下,叫做Domain0,使用这个kernel启动机器后,你可以在这个机器上使用qemu软件,虚拟出多个系统。Xen的缺点是如果你需要更新Xen的版本,你需要重新编译整个内核,而且,稍有设置不慎,系统就无法启动。
相比较,KVM就简化的多了。它不需要重新编译内核,也不需要对当前kernel做任何修改,它只是几个可以动态加载的.ko模块。它结构更加精简、代码量更小。所以,出错的可能性更小。并且在某些方面,性能比Xen更胜一筹。
Xen的半虚拟化:Xen通过半虚拟化的技术获得高效能的表现(较少的效能损失,典型的情况下大约损失2%,在最糟的情况下会有8%的效能耗损),但是这要求虚拟机使用经过修改的客户端操作系统。
Xen的完全虚拟化:Intel为Xen贡献了补丁以支持其VT-X架构扩展,而AMD则进行修改以支持其AMD-V架构扩展。如果系统处理器支持虚拟硬件扩展(Intel和AMD对本地支持虚拟化的扩展),这项技术将允许未经修改的操作系统运行在Xen虚拟机中。
虚拟化技术
cpu虚拟化
在没有CPU硬件虚拟化技术之前,通常使用指令的二进制翻译来实现虚拟机中CPU指令的执行。后来,Intel和AMD这些cpu厂商提供了硬件级的虚拟化支持,这为KVM的出现创造了必要条件。
内存虚拟化
内存虚拟化本质上是需要达成以下两个目的:
- 提供一个在 Guest 感知中的从零开始的连续物理内存空间。
- 在各个 VM 之间进行有效的隔离、调度、共享内存资源。
四个概念:
- 客户机虚拟地址,GVA(Guest Virtual Address)
- 客户机物理地址,GPA(GuestPhysical Address)
- 宿主机虚拟地址,HVA(Host Virtual Address)
- 宿主机物理地址,HPA(Host Physical Address)
内存虚拟化就是要将客户机虚拟地址(GVA)转化为最终能够访问的宿主机上的物理地址(HPA)。对于客户机操作系统而言,它不感知内存虚拟化的存在。
虚拟化管理程序就需要维护从客户机虚拟地址到宿主机物理地址之间的一个映射关系,在没有硬件提供的内存虚拟化之前,这个维护映射关系的页表叫作影子页表(Shadow Page Table)。在硬件提供内存虚拟化之后,可以通过硬件实现客户机虚拟地址到宿主机物理地址的转换。
中断虚拟化
I/O虚拟化
在虚拟化的架构下,虚拟机监控器必须支持来自客户机的I/O请求。通常情况下有以下4种I/O虚拟化方式。
- 设备模拟:在虚拟机监控器中模拟一个传统的I/O设备的特性,比如在QEMU中模拟一个Intel的千兆网卡或者一个IDE硬盘驱动器,在客户机中就暴露为对应的硬件设备。客户机中的I/O请求都由虚拟机监控器捕获并模拟执行后返回给客户机。
- 前后端驱动接口:在虚拟机监控器与客户机之间定义一种全新的适合于虚拟化环境的交互接口,比如常见的virtio协议就是在客户机中暴露为virtio-net、virtio-blk等网络和磁盘设备,在QEMU中实现相应的virtio后端驱动。
- 设备直接分配:将一个物理设备,如一个网卡或硬盘驱动器直接分配给客户机使用,这种情况下I/O请求的链路中很少需要或基本不需要虚拟机监控器的参与,所以性能很好。
- 设备共享分配:其实是设备直接分配方式的一个扩展。在这种模式下,一个(具有特定特性的)物理设备可以支持多个虚拟机功能接口,可以将虚拟功能接口独立地分配给不同的客户机使用。如SR-IOV就是这种方式的一个标准协议。
优点 | 缺点 | |
---|---|---|
设备模拟 | 兼容性好,不需要额外驱动 | 1. 性能较差;2. 模拟设备的功能特性支持不够多 |
前后端接口 | 性能有所提升 | 1. 兼容性差一些,依赖客户机中安装特定驱动;2. I/O压力大时,后端驱动的CPU资源占用较高 |
设备直接分配 | 性能非常好 | 1. 需要硬件设备的特性支持;2. 单个设备只能分配一个客户机;3. 很难支持动态迁移 |
设备共享分配 | 1. 性能非常好;2. 单个设备可以共享 | 1. 需要设备硬件的特性支持;2. 很难支持动态迁移 |
KVM与QEMU
Kernel-based Virtual Machine,是采用硬件虚拟化技术的全虚拟化解决方案。
KVM虚拟化的核心主要由以下两个模块组成:
1)KVM内核模块,它属于标准Linux内核的一部分,是一个专门提供虚拟化功能的模块,主要负责CPU和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU执行模式的切换、vCPU寄存器的访问、vCPU的执行。
2)QEMU用户态工具,它是一个普通的Linux进程,为客户机提供设备模拟的功能,包括模拟BIOS、PCI/PCIE总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。同时它通过ioctl系统调用与内核态的KVM模块进行交互。
KVM是在硬件虚拟化支持下的完全虚拟化技术,所以它能支持在相应硬件上能运行的几乎所有的操作系统,如:Linux、Windows、FreeBSD、MacOS等。KVM的基础架构如下图所示。
在KVM虚拟化架构下,每个客户机就是一个QEMU进程,在一个宿主机上有多少个虚拟机就会有多少个QEMU进程;客户机中的每一个虚拟CPU对应QEMU进程中的一个执行线程;一个宿主机中只有一个KVM内核模块,所有客户机都与这个内核模块进行交互。
KVM模块是KVM虚拟化的核心模块,它在内核中由两部分组成:一个是处理器架构无关的部分,用lsmod命令中可以看到,叫作kvm模块;另一个是处理器架构相关的部分,在Intel平台上就是kvm_intel这个内核模块。KVM的主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
KVM仅支持硬件辅助的虚拟化,所以打开并初始化系统硬件以支持虚拟机的运行,是KVM模块的职责所在。以KVM在Intel公司的CPU上运行为例,在被内核加载的时候,KVM模块会先初始化内部的数据结构;做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统(包括KVM模块本身)置于CPU执行模式的虚拟化模式中的根模式;最后,KVM模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的命令。接下来,虚拟机的创建和运行将是一个用户空间的应用程序(QEMU)和KVM模块相互配合的过程。
/dev/kvm 这个设备可以被当作一个标准的字符设备,KVM模块与用户空间QEMU的通信接口主要是一系列针对这个特殊设备文件的loctl调用。当然,每个虚拟客户机针对/dev/kvm文件的最重要的loctl调用就是“创建虚拟机”。在这里,“创建虚拟机”可以理解成KVM为了某个特定的虚拟客户机(用户空间程序创建并初始化)创建对应的内核数据结构。同时,KVM还会返回一个文件句柄来代表所创建的虚拟机。针对该文件句柄的loctl调用可以对虚拟机做相应的管理,比如创建用户空间虚拟地址和客户机物理地址及真实内存物理地址的映射关系,再比如创建多个可供运行的虚拟处理器(vCPU)。同样,KVM模块会为每一个创建出来的虚拟处理器生成对应的文件句柄,对虚拟处理器相应的文件句柄进行相应的loctl调用,就可以对虚拟处理器进行管理。
针对虚拟处理器的最重要的loctl调用就是“执行虚拟处理器”。通过它,用户空间准备好的虚拟机在KVM模块的支持下,被置于虚拟化模式中的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都会被处理器捕捉到,处理器在保存现场之后自动切换到根模式,由KVM决定如何进一步处理(要么由KVM模块直接处理,要么返回用户空间交由用户空间程序处理)。
除了处理器的虚拟化,内存虚拟化也是由KVM模块实现的,包括前面提到的使用硬件提供的EPT特性,通过两级转换实现客户机虚拟地址到宿主机物理地址之间的转换。
处理器对设备的访问主要是通过I/O指令和MMIO,其中I/O指令会被处理器直接截获,MMIO会通过配置内存虚拟化来捕捉。但是,外设的模拟一般不由KVM模块负责。一般来说,只有对性能要求比较高的虚拟设备才会由KVM内核模块来直接负责,比如虚拟中断控制器和虚拟时钟,这样可以大量减少处理器模式切换的开销。而大部分的输入输出设备交给下一节将要介绍的用户态程序QEMU来负责。
QEMU/KVM实现了一个相对简单的结构
-
KVM内核模块的实现将Linux内核变成一个hypervisor。
-
每个客户机系统有一个QEMU进程。有多少个客户机系统在运行,就相应的有多少个QEMU进程在运行。
-
QEMU是一个多线程程序,客户机系统的每个虚拟CPU(vCPU)对应一个QEMU线程。
-
从Linux内核来看,QEMU线程就和普通的用户进程一样。对应于客户机虚拟CPU的线程接受Linux内核调度器的管理,这和其它进程的线程无异。
虚拟化管理工具
libvirt
libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口,一些常用的虚拟机管理工具(virsh、virt-manager等)和云计算框架平台(openstack、zstack等)都在底层使用libvirt的应用程序接口。
virsh
virsh是一个常用的管理KVM虚拟化的命令行工具,对于系统管理员在单个宿主机上进行运维操作,virsh命令行可能是最佳选择。virsh是用C语言编写的一个使用libvirt API 的虚拟化管理工具,其源代码也是在libvirt这个开源项目中的。
virt-manager
virt-manager是专门针对虚拟机的图形化管理软件,底层与虚拟化交互的部分仍然是调用libvirt API来操作的。virt-manager除了提供虚拟机生命周期(包括:创建、启动、停止、打快照、动态迁移等)管理的基本功能,还提供性能和资源使用率的监控,同时内置了VNC和SPICE客户端,方便图形化连接到虚拟客户机中。virt-manager在RHEL、CentOS、Fedora等操作系统上是非常流行的虚拟化管理软件,在管理的机器数量规模较小时,virt-manager是很好的选择。因其图形化操作的易用性,成为新手入门学习虚拟化操作的首选管理软件。
libguestfs
libguestfs是用于访问和修改虚拟机的磁盘镜像的一组工具集合。libguestfs提供了访问和编辑客户机中的文件、脚本化修改客户机中的信息、监控磁盘使用和空闲的统计信息、P2V、V2V、创建客户机、克隆客户机、备份磁盘内容、格式化磁盘、调整磁盘大小等非常丰富的功能。libguestfs还提供了共享库,可以在C/C++、Python等编程语言中对其进行调用。libguestfs不需要启动KVM客户机就可以对磁盘镜像进行管理,功能强大且非常灵活,是管理KVM磁盘镜像的首选工具。
openstack
OpenStack是一个开源的基础架构即服务(IaaS)云计算管理平台,可用于构建共有云和私有云服务的基础设施。OpenStack是目前业界使用最广泛的功能最强大的云管理平台,它不仅提供了管理虚拟机的丰富功能,还有非常多其他重要管理功能,如:对象存储、块存储、网络、镜像、身份验证、编排服务、控制面板等。OpenStack仍然使用libvirt API来完成对底层虚拟化的管理。
参考
Kernel-based Virtual Machine
libvirt
Manage virtual machines with virt-manager
libguestfs tools for accessing and modifying virtual machine disk images
OpenStack
Intel 虚拟化技术(Intel® VT):CPU 虚拟化与内存虚拟化
Hardware and Software Support for Virtualization
虚拟机虚拟化原理
[译] [论文] 可虚拟化第三代(计算机)架构的规范化条件(ACM, 1974)
《Formal Requirements for Virtualizable Third Generation Architectures》
Intel Virtualization Technology
Enabling Intel® Virtualization Technology Features and Benefits
Introduction to Virtualization Technology
Intel® 64 and IA-32 Architectures Software Developer Manuals
Overview of the Intel VT Virtualization Features
Virtualization: Implications and Opportunities for Performance Analysis