虚拟化技术简述


前言

这周开始研究 Intel 的虚拟化技术了,写写这周学的一些知识吧,算是入门的吧,因为我也是刚学习虚拟化技术,可能描述的不太准备,但是文章还是要写的。

关于虚拟化我们早就接触到了,大家在学习linux时候的开始阶段,通常都会再window平台下安装vmware workstation(或virtualbox),然后在这两个桌面虚拟化软件上面安装linux内核镜像,运行一个完整的Linux内核,这样我们就可以在windows系统上面使用linux系统了,进行学习了。如果没有虚拟化,那我们只能在我们的电脑上安装双系统,每次在开机启动时选择是windows系统还是linux 系统,这非常不方便。
比如大家在vmware workstation上安装linux时,得配置linux的一些硬件资源,这些硬件资源由我们用户自定义,并且还可以随时更改,非常方便,如下图:
在这里插入图片描述
可以看出一个操作系统能正常运行所需要的硬件资源基本都需要,如最重要的处理器,内存,磁盘,网络,OS镜像这些都不可缺少。

一、虚拟化简介

随着计算硬件、网络技术、存储技术的飞速发展,人们发现,每个人独自拥有一台计算机似乎有些浪费,因为它大多数时候是空闲的。那么,如果将计算资源集中起来,大家共享,类似现代操作系统那样分时复用,将是对资源的极大节省和效率的极大提升。

虚拟化是一种资源管理技术,将计算机物理资源(CPU、内存、磁盘、网络等)转化为更通用更强的更容易使用的虚拟形式,多个操作系统共享这些硬件物理资源,提升单机的利用率,最大化的利用物理资源。并且提供与主机操作系统和其他虚拟机的完全隔离,更安全。如果没有虚拟化技术,那么这些硬件资源只能被单个操作系统使用。
虚拟机运行所需要的环境可以说与物理机上毫无差异,可能会由于所分配得到的物理资源大小、竞争、或宿主机的限制而导致运行速度可能低于在真实的物理机上运行的速度。

现在给出虚拟机的一个简单模型:物理硬件资源 + 虚拟机监视器(VMM)+ 客户软件(Guest software)。
Guest software包括:一个完整的逻辑硬件运行环境、OS、应用等,就是一个虚拟机器。
如下图所示:
在这里插入图片描述

Virtual Machine Monitor(VMM,虚拟机监控器,也称为Hypervisor)层,充当主机,完全控制处理器和其他平台硬件,并为客户软件提供虚拟处理器的抽象,并允许它直接在逻辑处理器上执行,VMM能够保留对处理器资源、物理内存、中断管理和I/O的选择性控制。简单点说就是为了达到虚拟化而引入的一个软件层。它向下管理实际的物理资源,向上给虚拟机提供逻辑资源。

二、软件虚拟化和硬件虚拟化

2.1 软件虚拟化技术

软件虚拟化:就是通过软件模拟来实现VMM层,通过纯软件的环境来模拟执行客户机里的指令。
比如QEMU:在没有启用硬件虚拟化辅助的时候,它通过软件的二进制翻译仿真出目标平台呈现给客户机,客户机的每一条目标平台指令都会被QEMU截取,并翻译成宿主机平台的指令,然后交给实际的物理平台执行。
客户机完全不知道自己运行在虚拟化环境中,还以为自己运行在原生环境里。

缺点:每一条目标指令都会被QEMU截取,翻译成宿主机平台的指令,然后交给实际的物理平台执行,其虚拟化性能是比较差的,同时其软件复杂度也大大增加。

优点:可以呈现各种平台给客户机,只要其二进制翻译支持。每个虚拟器都可以仿真一个不同架构的处理器,比如在Intel x86的处理器架构上虚拟化的处理器架构可以是ARM架构的的(即:物理CPU是x86的,而guest是基于ARM的)。

以虚拟化CPU来说:CPU是计算机系统最核心的模块,我们的程序执行到最后都是翻译为机器语言在CPU上执行的。在没有CPU硬件虚拟化技术之前,通常使用指令的二进制翻译(binary translation)来实现虚拟客户机中CPU指令的执行,很早期的VMware就使用这样的方案,其指令执行的翻译比较复杂,效率比较低。所以Intel最早发布的虚拟化技术就是CPU虚拟化方面的。

2.2 硬件虚拟化

硬件虚拟化技术就是指计算机硬件本身提供能力让客户机指令独立执行,不完全需要VMM截获重定向(大部分指令集就可以在自己的逻辑处理器上执行,即在自己的VM上进行处理大部分的指令集,只有少部分特权指令才需要被VMM截获并做相应处理,VMM需要监控这些特权指令)。

这里简单的介绍下Intel的VMX技术:
VMX(virtual-machine extensions):从硬件层面上来为多个软件运行环境提供处理器硬件虚拟化支持:即Intel 的VT-x技术( AMD 相应的虚拟技术称为: AMD-V )。
VT:Virtualization Technology。

VMX主要支持两种类型的软件:
(1)Virtual-machine monitors (VMM):虚拟机监控器。
(2)Guest software(VM):虚拟机。

VMX提供了有两种类型的处理器的操作(VMX operation):
(1)VMX root operation: VMM运行在root mode。
(2)VMX non-root operation:VM运行在 non-root mode。

在这里插入图片描述

VM-Entry :VMM可以使用 VM-entry instructions,进入到VM, 从root mode 切换到 non-root mode, CPU 上运行的是虚拟机。
VM-Exit :当VM执行了某些特权指令后, CPU 从 non-root mode切换到root mode,并退出VM。

VMX提供一个略微受限制的硬件运行环境供客户机运行,在绝大多数情况下,客户机在此受限环境中运行与原生系统在非虚拟化环境中运行没有什么两样,不需要像软件虚拟化那样每条指令都先翻译再执行,而VMM运行在root mode,拥有完整的硬件访问控制权限。仅仅在少数必要的时候,某些客户机指令的运行才需要被VMM截获并做相应处理,之后客户机返回并继续在non-root mode中运行。可以想见,硬件虚拟化技术的性能接近于原生系统,并且,极大地简化了VMM的软件设计架构。

比如 QEMU+ KVM。
kvm:KVM虚拟化全称为kernel-based Virtual Machine,是一个开源的系统虚拟化模块,基于内核的虚拟机 (KVM) 是针对包含虚拟化扩展(Intel VT 或 AMD-V)的 x86 硬件上的 Linux 的完全原生的虚拟化解决方案。KVM已经成为Linux 内核里面的一种加速虚拟机的功能扩展。
KVM 是一个独特的管理程序,通过将 KVM 作为一个内核模块实现,在虚拟环境下 Linux 内核集成管理程序将其作为一个可加载的模块可以简化管理和提升性能。

2.3 QEMU

这里简单的介绍下QEMU:
QEMU(Quick Emulator)最初实现的虚拟机是一个纯软件的实现,通过二进制翻译来实现虚拟化客户机中的CPU指令模拟,所以性能比较低。但是,其优点是跨平台,QEMU支持在Linux、Windows、FreeBSD、Solaris、MacOS等多种操作系统上运行,能支持在QEMU本身编译运行的平台上就实现虚拟机的功能,甚至可以支持客户机与宿主机并不是同一个架构(比如在x86平台上运行ARM客户机)。
QEMU也可以基于硬件虚拟化的KVM结合,为它们提供客户机的设备模拟。通过与KVM结合,让虚拟化的性能提升得非常高,即:QEMU+KVM

总结,它有两种模式:
(1)模拟器:模拟各种硬件,使用的是二进制翻译技术。
(2)虚拟机:通过ioctl与KVM内核模块进行交互,完成虚拟化功能。

三、全虚拟化和半虚拟化

3.1 全虚拟化

全虚拟化(Full Virtualization):客户机完全不知道自己运行在虚拟化环境中,还以为自己运行在原生环境里。

客户机的操作系统完全不需要改动。敏感指令在操作系统和硬件之间被VMM捕捉处理,客户操作系统无须修改,所有软件都能在虚拟机中运行。因此,全虚拟化需要模拟出完整的、和物理平台一模一样的平台给客户机,这在达到了第一个目标的同时也增加了虚拟化层(VMM)的复杂度。

在这里插入图片描述

注意:
CPU厂商没有支持硬件虚拟化前:Guest OS的特权指令无法直接下达到计算机系统硬件执行,需要经过VMM的捕获和模拟执行(部分难以虚拟化的指令需要通过二进制翻译技术进行转换),由于所有的特权指令都会导致 trap,所以在虚拟环境下特权指令的执行开销要远远高于在 原生环境下。
即:guest os特权指令->捕获异常->翻译->模拟
Guest OS 一条简单的特权指令要通过复杂的异常处理过程,性能开销很大。

CPU厂商开始支持硬件虚拟化后::即Intel 的VT-x技术( AMD : AMD-V ),引入了VMX root operation和VMX non-root operation,这样host os 和 guest 都有了ring 0和ring 3,硬件这层做了些区分,这样全虚拟化下,有些guest os的特权指令的“捕获异常-翻译-模拟”实现就不需要了,性能得到很大的提升。

KVM、VMware一直都是全虚拟化技术(目前都是基于硬件辅助的全虚拟化技术)。

3.2 半虚拟化

半虚拟化(Para-Virtualization):客户机意识到自己是运行在虚拟化环境里,并做相应修改以配合VMM。
一方面,可以提升性能和简化VMM软件复杂度;另一方面,也不需要太依赖硬件虚拟化的支持,从而使得其软件设计(至少是VMM这一侧)可以跨平台且是优雅的。
本质上,半虚拟化弱化了对虚拟机特殊指令的被动截获要求,将其转化成客户机操作系统的主动通知。但是,半虚拟化需要修改客户机操作系统的源代码来实现主动通知。

在这里插入图片描述

典型的半虚拟化技术就是virtio,使用virtio需要在宿主机/VMM和客户机里都相应地装上驱动。
XEN是最典型的半虚拟化,不过现在XEN也支持硬件辅助的全虚拟化。

3.3 敏感指令

一般来说敏感指令都是特权指令,但是x86_64系架构下有些敏感指令不是特权指令,有些敏感指令在非特权模式下执行时不会抛出异常,此时VMM无法拦截处理VM的行为。
为了解决这个问题,提出了二进制翻译的方案(软件层面):
(1)静态翻译:运行前扫描可执行的文件,对敏感指令及进行翻译,形成一个新的文件。然而静态翻译必须提前处理,而有些指令只有在运行时才会产生副作用,无法静态处理。
(2)动态翻译:运行时以代码块为单元动态地修改二进制代码。

后来Intel 从硬件层面解决这个问题,引入VMX,也就是VT-x技术。并不是所有的特权指令都需要VMM拦截处理,只处理敏感指令。当guest 内部执行敏感指令时,就会从VMX non-root operation 切换到 VMX root operation,即:VM exit。有的特权指令不需要由VMM介入处理。
在这里插入图片描述

3.4 小结

目前主流的CPU厂商都支持了硬件虚拟化技术,硬件辅助的全虚拟化技术的性能逐渐逼近半虚拟化,甚至超过了半虚拟化,同时全虚拟化不需要修改客户操作系统,目前越来越受欢迎。

以virtio为代表的半虚拟化技术也一直在演进发展,性能上只是略逊于全虚拟化,加之其较少的平台依赖性,依然受到广泛的欢迎。

四、Type1和Type2虚拟化

从软件框架的角度上,根据虚拟化层(VMM)是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为Type1和Type2。

4.1 Type 1

Type1 Hypervisor也叫 bare-metal Hypervisor。这类虚拟化层直接运行在硬件之上,没有所谓的宿主机操作系统。它们直接控制硬件资源以及客户机。如下图所示:
在这里插入图片描述
比较出名的就是VMware ESXi:专门构建的裸机 Hypervisor,主要面向服务器。
VMware ESX是可以直接安装到您的物理服务器的、可靠的裸机 Hypervisor。通过直接访问并控制底层资源,VMware ESXi 可有效地对硬件进行分区,以便整合应用并降低成本。
功能特性(来源于VMware ESX官网介绍):
ESXi 可将多台服务器整合到较少物理设备中,从而减少对空间、电力和 IT 管理的要求,同时提升性能。
(1)占用空间小
尽管 ESXi 占用空间仅为 150 MB,却可实现更多功能,同时还能最大限度地降低 Hypervisor 的安全风险。
(2)可靠的性能
适应任何规模的应用。虚拟机配置最高可达 128 个虚拟 CPU、6 TB 的 RAM 和 120 台设备,以满足您的所有应用需求。咨询各项解决方案限制以确保您不会超过您环境的受支持配置。
(3)增强的安全性
利用强大的加密功能保护敏感的虚拟机数据。基于角色的访问可简化管理,而广泛的日志记录和审核可以更好地落实责任,还可更加轻松地进行取证分析。
(4)卓越的生态系统
获取对由硬件 OEM 供应商、技术服务合作伙伴、应用和客户机操作系统组成的广泛生态系统的支持。
(5)方便用户使用的体验
利用基于 HTML5 标准的内置现代 UI 管理日常行政操作。对于需要实现运维自动化的客户,VMware 提供 vSphere 命令行界面和便于开发人员使用、基于 REST 的 API。

我自己这周也是第一次接触这个VMware ESXi,可以直接安装在Intel x86_64的物理机上,不再依存于宿主操作系统。然后直接通过网页连上ESXi 服务器,通过网页界面来创建VM(虚拟机),界面简单易用,我自己的感觉就是操作十分简单。

4.2 Type 2

Type2 Hypervisor运行在一个宿主机操作系统之上,这类Hypervisor通常就是宿主机操作系统的一个应用程序,像其他应用程序一样受宿主机操作系统的管理。如:
(1)VMwareWorkstation,桌面级虚拟化产品,运行在Windows、Linux和Mac操作系统上。
这也就是我们是经常学习Linux时使用的场景:Intel X86_64物理主机上装的windows操作系统,然后再windows桌面上安装VMwareWorkstation,VMwareWorkstation也就是windows一个普通的应用程序,然后我们再VMwareWorkstation创建虚拟机,安装其他的操作系统,并给其分配硬件资源。
在这里插入图片描述

(2)Linux系统里,如KVM。
KVM在上面已经介绍过一次了,现在梅开二度:
KVM全称是Kernel-based Virtual Machine,即基于内核的虚拟机,是采用硬件虚拟化技术的全虚拟化解决方案。由于KVM是在硬件虚拟化支持下的完全虚拟化技术,所以它能支持在相应硬件上能运行的几乎所有的操作系统,如:Linux、Windows、FreeBSD、MacOS等。
这里以QEMU+Linux举例,如下图所示:
PS:由于我也是这周才开始看虚拟化,描述的可能不太准确,请见谅。

在这里插入图片描述

CPU和内存:
Qemu 将 KVM 整合进来,将有关 CPU 指令的部分交由内核模块来做,就是 qemu-kvm。
Guest QMEU + host Linux kernel KVM内核模块用来实现CPU的虚拟化、内存的虚拟化。
KVM 内核模块通过 /dev/kvm 暴露接口,Guest QMEU 可以通过 ioctl 来访问这个接口。来提升CPU性能。
只有对性能要求很高的虚拟设备才需要由KVM内核模块来负责。

网络和硬盘:
如果采用全虚拟化的方式会影响这些设备的性能。
QMEU 采取半虚拟化的方式,让 Guest OS 加载驱动VirtIO。然后数据会直接发送给半虚拟化设备,经过处理,最终发送给真正的物理硬件。
Guest QMEU中的半虚拟化的驱动程序允许虚拟机使用优化的I/O接口而不使用模拟的设备,从而为网络和块设备提供高性能的I/O。

这部分内容后面还会详细介绍,这篇文章就到这里结束了。

总结

结束了,画图画的好辛苦…

参考资料

Intel官方手册 vol3
KVM实战:原理、进阶与性能调优
深度探索Linux系统虚拟化
极客时间:趣谈操作系统
https://www.cnblogs.com/LoyenWang/p/13510925.html
https://www.vmware.com/cn/products/esxi-and-esx.html
https://zhuanlan.zhihu.com/p/69629212
https://blog.csdn.net/u011389746/article/details/79948514
https://blog.csdn.net/tony_vip/article/details/105890376

猜你喜欢

转载自blog.csdn.net/weixin_45030965/article/details/124177350