一、虚拟化技术简介
虚拟化(Virtualization)
的含义很广泛。将任何一种形式的资源抽象成另一种形式的技术都是虚拟化,是资源的一种逻辑表示。解除了物理硬件和操作系统之间的紧耦合关系。
- 虚拟化是云计算的基础。简单地说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的CPU、内存、IO硬件资源,但逻辑上虚拟机之间是相互隔离的。
- 在计算机方面,虚拟化一般指通过对计算机物理资源的抽象,提供一个或多个操作环境,实现资源的模拟、隔离或共享等。
- 本质上,虚拟化就是对硬件资源的一种抽象与模拟。通过空间上的分割、时间上的分时以及模拟,虚拟化可将一份资源抽象成多份,亦可将多份资源抽象成一份。
1、虚拟化中的重要概念
Guest OS(虚拟机操作系统)
:运行在虚拟化环境中的操作系统。
Guest Machine(虚拟机)
:通常称为虚拟机(Virtual Machine, VM),是指在一个物理计算机上通过虚拟化技术创建的虚拟计算环境。每个虚拟机都可以运行自己的操作系统(称为Guest OS)和应用程序,就像在独立的物理机器上运行一样。
Hypervisor(虚拟化软件层/虚拟机监控机,Virtual Machine Monitor,VMM)
:位于操作系统和底层硬件之间的薄层软件,它允许多个操作系统(称为Guest OS)在同一物理主机上同时运行。Hypervisor主要负责管理和分配宿主机的资源给各个虚拟机,并确保这些虚拟机之间以及它们与宿主机之间的隔离性。
Host OS(宿主操作系统)
:直接安装在物理计算机硬件上的操作系统。
Host Machine(物理机)
:实际的硬件设备,它直接承载操作系统(可以是宿主操作系统Host OS或Hypervisor)并提供计算资源如CPU、内存、存储和网络接口等。物理机是虚拟化技术的基础,因为它提供了运行一个或多个虚拟机所需的全部物理资源。
2、虚拟化发展史
1993年,IBM推出可升级的POWER并行系统
,这是第一款采用RS/6000技术,基于微处理器的超级计算机。
1998年,著名的x86仿真模拟器Bochs
发布。
1998年,VMware成立,1999年推出了可以流畅运行的商业虚拟化软件VMware Workstation
。从此虚拟化技术终于走下了大型机的神坛。
1999年,IBM在AS/400上第一次提出了LPAR(Logical Partition,逻辑分区)虚拟化技术。
2000年,Citrix(思杰)桌面虚拟化产品发布。
2004年,IBM发布了虚拟化解决方案APV(Advanced Power Virtualization)
,支持资源共享。该方案在2008年改名为PowerVM。
2005年,Xen 3.0.0
发布,该版本可以在32位服务器上运行,是第一个支持Intel VT-x的虚拟机监控程序。
2006年,以色列的创业公司Qumranet在完成了虚拟化Hypervisor基本功能、动态迁移以及主要的性能优化之后,正式对外宣布了KVM(Kernel-based Virtual Machine,基于内核的虚拟机
)的诞生。
2006-至今,云计算与大数据时代。
2007年,德国InnoTek公司开发了VirtualBox虚拟化软件。
2008年,Linux Container(LXC)发布0.1.0版本,可以提供轻量级的虚拟化。
2010年,红帽发布RHEL 6.0,这个版本将默认安装的Xen虚拟化机制彻底去除,仅提供KVM虚拟化机制。
2015年,Kubernetes v1.0
发布,进入云原生时代。
3、虚拟化的类型
全虚拟化:虚拟化管理器将资源全部虚拟化,虚拟机看到的资源都是经过完全虚拟化的,虚拟机无法感知主机所使用的是物理资源还是逻辑资源。
半虚拟化:虚拟化管理器针对计算资源(CPU、内存)做虚拟化,网络资源和存储资源直接由底层 Guest OS(修改底层代码)处理。
硬件辅助虚拟化:使用相关硬件来负责CPU实现虚拟化。CPU开销低,保证了性能。
分类 | 说明 | 特性 |
---|---|---|
全虚拟化 | 使用VMM实现CPU、内存、设备I/O的虚拟化,而Guest OS和计算机系统硬件都不需要进行修改。 | 该方式兼容性好,但会给处理器带来额外开销。 |
半虚拟化 | 使用VMM实现CPU和内存虚拟化,设备I/O虚拟化由Guest OS实现。需要修改Guest OS,使其能够与VMM协同工作。 | 该方式兼容性差,但性能较好。因为Guest OS知道它们正在被虚拟化并且主动合作以优化性能。可以减少虚拟化带来的性能开销。 |
硬件辅助虚拟化 | 借助硬件(主要是处理器)的支持,依赖于CPU提供的特殊指令集扩展(如Intel VT-x或AMD-V)来实现高效的全虚拟化。该方式不需要修改Guest OS,兼容性好。该技术将逐渐消除软件虚拟化技术之间的差别,成为未来的发展趋势。 | 允许Hypervisor更高效地管理资源分配和隔离,同时减少了传统虚拟化技术中由于二进制翻译带来的性能损耗。 |
4、虚拟化的特点
- 分区:分区意味着虚拟化层为多个虚拟机划分服务器资源的能力;每个虚拟机可以同时运行一个单独的操作系统(相同或不同的操作系统),使您能够在一台服务器上运行多个应用程序;每个操作系统只能看到虚拟化层为其提供的“虚拟硬件”(虚拟网卡、CPU、内存等),以使它认为运行在自己的专用服务器上。
- 隔离:虚拟机是互相隔离的
- 一个虚拟机的崩溃或故障(例如,操作系统故障、应用程序崩溃、驱动程序故障,等等)不会影响同一服务器上的其它虚拟机。
- 一个虚拟机中的病毒、蠕虫等与其它虚拟机相隔离,就像每个虚拟机都位于单独的物理机器上一样。
- 可以进行资源控制以提供性能隔离:您可以为每个虚拟机指定最小和最大资源使用量,以确保某个虚拟机不会占用所有的资源而使得同一系统中的其它虚拟机无资源可用。
- 可以在单一机器上同时运行多个负载/应用程序/操作系统,而不会出现我们刚才讨论传统x86服务器体系结构的局限性时所提到的那些问题(应用程序冲突、DLL冲突等)。
- 封装:封装意味着将整个虚拟机(硬件配置、BIOS配置、内存状态、磁盘状态、CPU 状态)储存在独立于物理硬件的一小组文件中。这样,您只需复制几个文件就可以随时随地根据需要复制、保存和移动虚拟机。
- 相对于硬件独立:因为虚拟机运行于虚拟化层之上,所以只能看到虚拟化层提供的虚拟硬件;此虚拟硬件也同样不必考虑物理服务器的情况;这样,虚拟机就可以在任何x86服务器(IBM、Dell、HP等)上运行而无需进行任何修改。这打破了操作系统和硬件以及应用程序和操作系统/硬件之间的约束。
5、虚拟化的优势
下面是虚拟化服务器与传统物理服务器对比的优劣,以Markdown表格形式呈现:
对比维度 | 虚拟化服务器 | 传统物理服务器 |
---|---|---|
资源利用率 | 高效利用硬件资源,通过在同一物理机上运行多个虚拟机实现资源的最大化使用。 | 每台服务器通常只运行单一应用或服务,资源利用率相对较低。 |
成本效益 | 减少硬件采购成本、能源消耗和数据中心空间需求,从而降低总体拥有成本(TCO)。 | 硬件、电力及维护成本较高,需要更多的物理空间来安置服务器。 |
可管理性 | 提高了管理效率,便于快速部署、复制和迁移虚拟机。 | 管理多台物理服务器较为复杂,部署新服务器耗时较长。 |
弹性扩展 | 可根据负载动态调整资源分配,具有较高的灵活性和伸缩性。 | 扩展能力受限于物理硬件,增加服务器容量需额外购买硬件设备。 |
容错性和可用性 | 支持快照、备份和恢复功能,提高系统的容错能力和数据安全性。 | 容错性和可用性依赖于硬件冗余和传统的备份策略,操作复杂度高。 |
性能 | 在某些情况下可能引入轻微的性能开销,但现代技术已经大大减少了这种影响。 | 直接运行在硬件之上,理论上提供最佳性能。 |
能耗 | 由于提高了资源利用率和减少物理机器数量,有助于降低能耗,更加环保。 | 较高的能耗和散热需求对环境造成更大压力。 |
二、CPU 虚拟化
x86操作系统传统上是设计成直接运行在 裸硬件(bare metal)
上的,并且它们默认认为自己完全占有计算机的所有硬件资源。
x86架构提供了一种称为“保护环”(Protection Rings)
的安全机制,用于管理操作系统和应用程序如何访问硬件和其他关键系统资源。
这些保护环总共分为四个级别,从 Ring 0
到 Ring 3
:
Ring 0
:这是最高特权级别,拥有对物理硬件的完全访问权限,包括CPU和内存管理等核心功能。通常,操作系统内核运行在此级别,因为它需要直接与硬件交互。Ring 1
和Ring 2
:这两个特权级别较少使用。理论上,它们可以用来运行一些特定类型的设备驱动程序或系统服务,这些程序和服务需要比普通应用程序更高的权限但又不需要完全控制硬件。Ring 3
:这是最低的特权级别,普通应用程序在此级别运行。它仅能执行非特权指令,并通过系统调用接口请求操作系统执行需要更高权限的操作。
虚拟化在这里就遇到了一个难题,因为宿主操作系统是工作在Ring 0 的,客户操作系统就不能也在Ring 0 了,但是它不知道这一点,以前执行什么指令,现在还是执行什么指令,但是没有执行权限是会出错的。所以这时候虚拟机管理程序(VMM)需要避免这件事情发生。
1、三种VM通过VMM实现Guest CPU对硬件访问实现技术
虚拟机监控器(VMM)
,也称为 Hypervisor
,用于管理和分配物理硬件资源给多个虚拟机(VM)
。为了让Guest OS
中的应用程序能够访问底层硬件,VMM采用了不同的技术来实现这种访问。
- 全虚拟化(Full Virtualization)
- 在全虚拟化中,VMM模拟了完整的计算机系统,包括CPU、内存、I/O设备等。Guest OS无需修改即可运行在其上,因为它“认为”自己直接运行在裸硬件之上。
- 对于CPU指令集的处理,当Guest OS尝试执行特权指令时,这些指令会被VMM捕获并模拟执行,因为Guest OS实际上没有权限直接访问物理CPU。这种方式通常通过二进制翻译技术实现,即实时地将不兼容的指令转换为可以安全执行的形式。
- 代表产品:VMware Workstation, QEMU。
- 半虚拟化(Para-Virtualization)
- 半虚拟化要求对Guest OS进行修改,使其知道自身正在被虚拟化,并通过优化后的接口直接与VMM通信,而不是试图执行那些无法在虚拟环境中正确工作的特权操作。
- 这种方法避免了全虚拟化中的二进制翻译开销,从而提高了性能。但是,它需要Guest OS的支持和修改,这意味着不是所有的操作系统都适用于半虚拟化。
- 代表产品:Xen。Xen支持未修改的操作系统作为“硬件虚拟机”(HVM)运行,但性能更优的方式是使用经过修改以支持半虚拟化的操作系统。
- 硬件辅助虚拟化(Hardware-Assisted Virtualization)
- 现代CPU提供了特殊的指令集扩展(如Intel VT-x或AMD-V),使得VMM可以直接利用硬件功能来管理虚拟机,而不需要完全依赖软件层面的模拟或二进制翻译。
- 这种方式允许Guest OS几乎像在非虚拟化环境中一样直接运行在Ring 0级别,同时保持每个虚拟机之间的隔离性。硬件辅助虚拟化极大地减少了虚拟化的性能损耗,并且不需要对Guest OS进行任何修改。
- 代表产品:VMware ESXi, KVM(Kernel-based Virtual Machine)。KVM是一个很好的例子,它利用Linux内核作为一个hypervisor,并借助硬件辅助虚拟化特性提供高效能的虚拟化解决方案。
2、硬件辅助技术
Intel的VT-x和AMD的AMD-V是两种旨在增强虚拟化性能的技术,它们通过引入新的指令集和运行模式来改进传统虚拟化方法中存在的性能瓶颈。
Intel的VT-x和AMD的AMD-V这两种硬件辅助虚拟化技术的核心思想是通过引入新的指令集和运行模式,使得VMM(虚拟机监控器)和Guest OS(客户操作系统)能够在不同的特权级别下运行,从而提高虚拟化的效率和性能。
以Intel VT技术为例,
- 增加了两种运行模式:
VMX root模式
和VMX nonroot模式
。- 通常来讲,主机操作系统和VMM运行在VMX root模式中,客户机操作系统及其应用运行在VMX nonroot模式中。
- 因为两个模式都支持所有的Ring,因此,客户机可以运行在它所需要的Ring中(OS运行在Ring 0中,应用运行在Ring 3中),VMM也运行在其需要的Ring中(对KVM来说,QEMU运行在Ring 3,KVM运行在Ring 0)。
- CPU 在两种模式之间的切换称为
VMX切换
。- 从root mode进入nonroot mode,称为
VM-Entry
; - 从nonroot mode进入root mode,称为
VM-Exit
。 - CPU受控制地在两种模式之间切换,轮流执行VMM代码和Guest OS代码。
- 从root mode进入nonroot mode,称为
2、CPU和vCPU的对应关系
vCPU数量和物理CPU对应关系如图所示。
PHY Kernel:物理CPU,即物理服务器上的实际CPU核心数。
超线程(Super Thread/Hyper-Threading):这是Intel的一项技术,它允许每个物理核心作为两个逻辑处理器出现,以提高多任务处理能力。这意味着如果一个物理CPU有4个核心,并且支持超线程,则操作系统可以看到8个逻辑处理器。
vCPU(虚拟CPU):是分配给虚拟机的虚拟处理器。尽管vCPU是从物理CPU资源中抽象出来的,但它们并不直接对应到特定的物理核心或逻辑处理器。相反,虚拟化软件(如KVM、Xen或VMware ESXi)会根据需要动态地将vCPU映射到物理核心上。
二、内存虚拟化
把物理机的真实物理内存统一管理,包装成多份虚拟的内存动态分配给若干虚拟机使用。
KVM通过内存虚拟化共享物理系统内存,动态分配给虚拟机。
KVM中,虚机的物理内存即为qemu-kvm进程所占用的内存空间。KVM使用CPU辅助的内存虚拟化方式。
内存虚拟化 - 影子页表:
- 由于宿主机MMU不能直接装载客户机的页表来进行内存访问,所以当客户机访问宿主机物理内存时,需要经过多次地址转换。即首先根据客户机页表把客户机虚拟地址(GVA)转换成客户机物理地址(GPA),然后再通过客户机物理地址(GPA)到宿主机虚拟地址(HVA)之间的映射转换成宿主机虚拟地址,最后再根据宿主机页表把宿主机虚拟地址(HVA)转换成宿主机物理地址(HPA)。而通过影子页表,则可以实现客户机虚拟地址到宿主机物理地址的直接转换。
- Intel的CPU提供了EPT(Extended Page Tables,扩展页表)技术,直接在硬件上支持GVA->GPA->HPA的地址转换,从而降低内存虚拟化实现的复杂度,也进一步提升内存虚拟化性能。
KVM为了在一台机器上运行多个虚拟机,需要增加一个新的内存虚拟化层(客户机物理地址空间),这个地址空间不是真正意义上的物理地址空间,它们之间还有一层转换。客户机虚拟地址(GVA)到客户机物理地址(GPA)的转换。
但是客户操作系统不能直接访问实际机器内存,因此VMM需要负责映射客户物理内存到实际机器内存(GPA ->HPA)。
Host Pysical Address: 宿主机物理地址,即实际机器内存地址。
Guest Physical Address: 客户机物理地址,客户机操作系统认为的物理地址。
Guest Virtual Address: 客户机虚拟地址,客户机操作系统认为的虚拟地址。
三、I/O虚拟化
I/O虚拟化可以被看作是位于服务器组件的系统和各种可用I/O处理单元之间的硬件中间件层,使得多个guest可以复用有限的外设资源。
设备虚拟化(I/O虚拟化)的过程,就是模拟设备的这些寄存器和内存,截获Guest OS对IO端口和寄存器的访问,通过软件的方式来模拟设备行为。
在QEMU/KVM中,客户机可以使用的设备大致可分为三类:
- 模拟设备:完全由QEMU纯软件模拟的设备
- Virtio设备:实现VIRTIO API的半虚拟化设备
- PCI设备直接分配(PCI device assignment)
I/O虚拟化需要解决两个问题:
- 设备发现:
- 需要控制各虚拟机能够访问的设备;
- 访问截获:
- 通过I/O端口或者MMIO对设备的访问;
- 设备通过DMA与内存进行数据交换。
1、全模拟
模拟I/O设备方式的优点是对硬件平台依赖性较低、可以方便模拟一些流行的和较老久的设备、不需要宿主机和客户机的额外支持,因此兼容性高;而其缺点是I/O路径较长、VM-Exit次数很多,因此性能较差。
一般适用于对I/O性能要求不高的场景,或者模拟一些老旧遗留(legacy)设备(如RTL8139的网卡)。
- 用软件完全模拟一个特定的设备
- 保持一样的软件接口,如:PIO、MMIO、DMA、中断等
- 可以模拟出跟系统中的物理设备不一样的虚拟设备
- 每次I/O操作需要多次上下文切换
- VM <-> Hypervisor
- QEMU <-> Hypervisor
- 软件模拟的设备不影响虚拟机中的软件栈
- 原生驱动
2、Virtio半虚拟化
Virtio半虚拟化设备方式的优点是实现了VIRTIO API,减少了VM-Exit次数,提高了客户机I/O执行效率,比普通模拟I/O的效率高很多;而其缺点是需要客户机中与Virtio相关驱动的支持(较老的系统默认没有自带这些驱动,Windows系统中需要额外安装Virtio驱动),因此兼容性较差,而且I/O频繁时的CPU使用率较高。
- 虚拟出特殊的设备
- 特殊的设备驱动,包括VM中的Front-end驱动和主机上的Back-end驱动
- Front-end和Back-end驱动之间的高效通信
- 减少VM和主机的数据传输开销
- 共享内存
- Batched I/O
- 异步事件通知Eventfd轻量级进程间“等待/通知”机制
四、主流虚拟化技术介绍
1、Xen虚拟化
Xen的Hypervisor是服务器经过BIOS启动之后载入的首个程序,然后启动一个具有特定权限的虚拟机,称之为Domain 0(简称Dom0)
。
Dom0的操作系统可以是Linux或Unix,Domain 0实现对Hypervisor控制和管理功能。
在所承载的虚拟机中,Dom0是唯一可以直接访问物理硬件(如存储和网卡)的虚拟机,它通过本身加载的物理驱动,为其它虚拟机(Domain U,简称DomU)提供访问存储和网卡的桥梁。
Xen最初是剑桥大学Xensource的一个开源研究项目,2003年9月发布了首个版本Xen 1.0,2007年Xensource被Citrix公司收购,开源Xen转由www.xen.org继续推进,该组织成员包括个人和公司(如 Citrix、Oracle等)。该组织在2011年3月发布了版本Xen 4.1。
相对于ESX和Hyper-V来说,Xen支持更广泛的CPU架构,前两者只支持CISC的x86/x86_64 CPU架构,Xen除此之外还支持RISC CPU架构,如IA64、ARM等。
Xen支持两种类型的虚拟机,一类是半虚拟化(PV,Paravirtualization),另一类是全虚拟化(Xen称其为HVM,Hardware Virtual Machine)。
- 半虚拟化需要特定内核的操作系统,如基于Linux paravirt_ops(Linux内核的一套编译选项)框架的Linux内核,而Windows操作系统由于其封闭性则不能被Xen的半虚拟化所支持,Xen的半虚拟化有个特别之处就是不要求CPU具备硬件辅助虚拟化,这非常适用于2007年之前的旧服务器虚拟化改造。
- 全虚拟化支持原生的操作系统,特别是针对Windows这类操作系统,Xen的全虚拟化要求CPU具备硬件辅助虚拟化,它修改的QEMU仿真所有硬件,包括:BIOS、IDE控制器、VGA显示卡、USB控制器和网卡等。为了提升I/O性能,全虚拟化特别针对磁盘和网卡采用半虚拟化设备来代替仿真设备,这些设备驱动称之为PV on HVM,为了使PV on HVM有最佳性能,CPU应具备MMU硬件辅助虚拟化。
Xen的Hypervisor层非常薄,少于15万行的代码量,不包含任何物理设备驱动,这一点与Hyper-V是非常类似的,物理设备的驱动均是驻留在Dom0中,可以重用现有的Linux设备驱动程序。因此,Xen对硬件兼容性也是非常广泛的,Linux支持的,它就支持。
2、KVM虚拟化
KVM(Kernel-based Virtual Machine)
字面意思是基于内核的虚拟机。其最初是由Qumranet公司开发的一个开源项目。2008年,Qumranet被RedHat所收购,但KVM本身仍是一个开源项目,由RedHat、IBM等厂商支持。
- KVM本质是Linux内核中的虚拟化功能模块kvm.ko,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。
- KVM是开源软件,于2007年2月被集成到Linux 2.6.20内核中。
- KVM中,虚拟机其实就是一个Linux进程,由CPU进行调度运行。
- KVM运行在内核空间,提供CPU、内存的虚拟化,它本身不执行任何模拟。运行在用户空间的QEMU提供硬件I/O的虚拟化模拟。
(1)Hypervisor
KVM之所以叫做基于内核的虚拟机,是因为KVM本身是一个Linux内核模块,当安装有Linux系统的物理机安装了这个模块后,就变成了Hypervisor
,而且还不会影响原先在该Linux上运行的其它应用程序。
与Xen类似,KVM支持广泛的CPU架构,除了x86/x86_64 CPU架构之外,还将会支持大型机(S/390)、小型机(PowerPC、IA64)及ARM等。
KVM充分利用了CPU的硬件辅助虚拟化能力,并重用了Linux内核的诸多功能,使得KVM本身是非常瘦小的,KVM的创始者Avi Kivity声称KVM模块仅有约10000行代码,但我们不能认为KVM的Hypervisor就是这个代码量,因为从严格意义来说,KVM本身并不是Hypervisor,它仅是Linux内核中的一个可装载模块,其功能是将Linux内核转换成一个Hypervisor。
通过KVM模块的加载将Linux内核转变成Hypervisor,Linux本身运行于内核模式,主机进程运行于用户模式,虚拟机则运行于客户模式,使得转变后的Linux内核可以将主机进程和虚拟机进行统一的管理和调度,这也是KVM名称的由来。
(2)KVM历史
2006年10月,以色列公司Qumranet发布KVM;
2006年12月,KVM合入内核(Linux 2.6.20rc);
2007年2月,Linux 2.6.20正式版发布;
2008年9月,Redhat以1.07亿美元收购Qumranet;
2009年9月,RHEL 5.4开始支持KVM(同时支持Xen);
2010年11月,RHEL 6.0之后仅支持KVM。
(3)KVM与QEMU
在KVM虚拟化方案中,KVM
主要用于管理CPU和内存的虚拟化,IO设备的虚拟化则由QEMU
来完成。
QEMU是一个纯软件实现的开源(模拟)软件,它能够模拟整套虚拟机的实现,包括CPU、内存、IO设备、USB、网卡等。
KVM用来模拟CPU的运行,但缺少了对Network和I/O的支持。QEMU-KVM是一个完整的模拟器,它基于KVM上,提供了完整的I/O模拟支持。其中OpenStack为了跨VM性,所以不会直接控制QEMU-KVM,而是通过Libvirt的库去间接控制QEMU-KVM。
KVM离不开QEMU。KVM实现初期,为了简化开发和代码重用,在QEMU基础上进行了修改,主要是将比较消耗CPU性能的CPU虚拟化和内存虚拟化部分移交到了内核中实现,保留IO虚拟化模块在用户空间实现。避免了用户态和内核态的频繁切换,优化使用性能。
QEMU离不开KVM。之前我们提到,QEMU是一个纯软件的实现,运行在用户空间,性能非常低下,所以从QEMU的角度可以说是QEMU使用了KVM的虚拟化功能,为自身虚拟机提供资源与加速。
/dev/kvm接口
是QEMU和KVM交互的“桥梁”。/dev/kvm本身是一个设备文件,我们可以通过ioctl函数来对该文件进行控制和管理,从而完成用户空间与内核空间的数据交互。KVM与QEMU的通信过程主要就是一系列针对该设备文件的ioctl系统调用。
(4) KVM的工作原理
KVM是Linux Kernel的一个模块, 运行在内核空间。
QEMU运行在用户空间,提供硬件I/O设备的虚拟化模拟。
Linux系统安装KVM模块后,会有如下三种运行模式:客户模式、用户模式、内核模式。
KVM基本结构如上图。KVM已经是内核模块,被看作是一个标准Linux字符集设备(/dev/kvm)。QEMU通过Libkvm应用程序接口,用fd(文件描述符)通过ioctl向设备驱动来发送创建、运行虚拟机命令。设备驱动KVM会解析命令。
KVM模块让Linux主机成为了一个虚拟机监视器(VMM)
,在原有执行模式基础上,增加了客户模式。在虚拟机运行时,三种模式的工作为:
- 客户模式:执行非I/O的客户代码,虚拟机运行在这个模式下。
- 用户模式:代表用户执行I/O指令,QEMU运行在这个模式下,它用来为虚拟机模拟执行I/O类的操作请求。
- 内核模式:实现客户模式切换,处理因I/O或者其他指令引起的从客户模式退出动作(VM-Exit)。KVM模块工作在这个模式下。此模式下可以真正操作硬件,当Guest OS执行I/O类操作或特权指令操作时,需要向用户模式提交请求,然后由用户模式再次发起硬件操作请求给内核模式,从而真正操作硬件。
3、虚拟化平台管理工具 - Libvirt
Libvirt是一套由C语言开发的API,主要目标是提供一种通用并且稳定的软件层,来管理物理主机上多种不同的虚拟化方式和虚拟主机,并支持远程管理。
Libvirt是Linux上的虚拟化库,Libvirt也是一个开源项目,它是一个非常强大的虚拟化平台管理工具,被管理的虚拟化平台可以是KVM,也可以是Xen、VMware以及Hyper-V等。
(1)Libvirt的用途
虚拟化领域针对不同的场景提出了很多虚拟化解决方案(KVM、Xen等),为了支持更多厂商以及更多领域,很多IaaS解决方案需要融合多种虚拟化技术,在这个需求背景下,Libvirt就为用户提供了一个平台类的管理工具 ,同时支持多种虚拟化方案。
Libvirt是为了更方便地管理平台虚拟化技术而设计的开放源代码的应用程序接口、守护进程和管理工具,它不仅提供了对虚拟化客户机的管理,也提供了对虚拟化网络和存储的管理。
Libvirt对多种不同的Hypervisor的支持是通过一种基于驱动程序的架构来实现的。Libvirt对不同的Hypervisor提供了不同的驱动:对Xen有Xen的驱动,对QEMU/KVM有QEMU驱动。
Libvirt作为中间适配层,让底层Hypervisor对上层用户空间的管理工具做到完全透明,因为Libvirt屏蔽了底层各种Hypervisor的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。
4、Xen与KVM的对比
Xen平台架构侧重安全性:为保证安全性,各Domain对共享区域的访问和映射必须通过Hypervisor授权。
KVM平台架构侧重性能:VM之间以及与Host Kernel之间对共享区域的访问和映射无需Hypervisor进行授权,故整个访问路径较短。使用Linux Baremetal内核,无PVOPS性能损耗。
KVM:全称基于内核的虚拟机,是一个轻量级的虚拟化管理程序模块,集成在内核中,利用硬件虚拟化技术(如Intel VT 或 AMD-V)来实现虚拟化,侧重于性能。
XEN:采用的是半虚拟化技术,需要有一台特定权限的 Domain0 来管理整个虚拟化平台,因此 Xen 的性能比 KVM 差一些。侧重于安全性。
Libvirt虚拟化工具管理平台:是Linux上的虚拟化库,管理物理主机上多种不同的虚拟化技术,支持远程管理。