虚拟化就是由位于下层的软件模块,根据上层的软件模块的期待,抽象(虚拟)出一个虚拟的软件或硬件模块,使上一层软件直接运行在这个与自己期待完全一致的虚拟环境上。从这个意义上来看,虚拟化既可以是软件层的抽象,又可以是硬件层的抽象。
Virtual Machine Monitor VMM,即虚拟机监控系统,也叫 Hypervisor,是虚拟化层的具体实现。主要是以软件的方式实现一套和物理主机环境完全一样的虚拟环境,物理主机有的所有资源,包括 CPU、内存、网络 IO、设备 IO等等,它都有。相当于 VMM 对物理主机的资源进行划分和隔离,使其可以充分利用资源供上层使用。虚拟出的资源以虚拟机的形式提供服务,一个虚拟机本质上和一台物理机没有什么区别,可以跑各种操作系统,在之上再跑各种应用。
虚拟机通常叫做客户机(guest),物理机叫宿主机(host),VMM 处在中间层,既要负责对虚拟资源的管理,包括虚拟环境的调度,虚拟机之间的通信以及虚拟机的管理等,又要负责物理资源的管理,包括处理器、中断、内存、设备等的管理,此外,还要提供一些附加功能,包括定时器、安全机制、电源管理等。
Virtual Machine Monitor VMM根据平台类型和实现结构有两种不同的分类,按平台类型可以分为完全虚拟化和类虚拟化,完全虚拟化就是 VMM 完全模拟出一个跟物理主机完全一样的环境。但是这个是非常困难的,首先,这需要硬件的支持,而硬件在初期设计的时候,没有那么远的前瞻性,可以预想到为虚拟化提供支持,前次,指令的复杂性,即使通过模拟的方式也很难做到全部指令都模拟。所以,就需要借助其他的一些技术来辅助虚拟化。
软件辅助虚拟化通过优先级压缩(Ring Compression,RC)和二进制代码转译(Binary Translation,BT)来完成。RC 基于 CPU 特权级原理,也就是guest、VMM 和 host 分别处于不同的特权级上,guest 要访问 host 属于越级访问就会抛异常,VMM会截获异常,并模拟出其可能的行为,从而进行相应处理。但是由于硬件设计的缺陷,有些指令并不能被截获,从而导致“漏洞”(即指令不能转为支持虚拟化的指令)。BT可以弥补这个缺陷,通过扫描guest的二进制的代码,将难以虚拟化的指令转为支持虚拟化的指令,从而可以配合VMM 完成虚拟化功能。优先级压缩(Ring Compression,RC)和二进制代码转译(Binary Translation,BT)这两种方式都是通过「打补丁」的方式来辅助虚拟化,因此,很难在架构上保证完整性。后期的硬件厂商在硬件上对虚拟化提供了支持,即硬件辅助的虚拟化。通过对硬件本身加入更多的虚拟化功能,就可以截获更多的敏感指令,填补上漏洞。
类虚拟化是外一种通过软件来避免漏洞的方式,通过修改客户机 Guest操作系统内核代码(API级)来避免漏洞,因此,可以自定义内核的执行行为,某种程度上对性能进行优化。
根据Virtual Machine Monitor VMM的实现结构分类,主要分Hypervisor 模型(I 型)和宿主模型(II 型)两类。
Hypervisor 模型(I 型),也称裸机型:
直接安装在硬件计算资源上,操作系统安装并且运行在Hypervisor之上。Hypervisor 模型中 VMM 既是操作系统,又是虚拟化软件,即集成了虚拟化功能的操作系统,对上为 guest 提供虚拟化功能,对下管理着所有物理资源,它的优点是效率高,虚拟机的安全性只依赖于VMM,缺点是管理所有的物理资源,意味着 VMM 要承担很多的开发工作,特别是驱动层面的开发,硬件的 I/O 设备有很多,这些设备都需要有对应的驱动来设配才能为虚拟机提供功能。
宿主模型(II 型):
宿主模型剥离了管理功能和虚拟化功能,虚拟化功能只是作为内核的一个模块来加载,比如 Kernel Virtual Machine KVM 技术,一般 KVM 只负责 CPU 和内存的硬件虚拟化,I/O 的虚拟化则由QEMU技术来完成。2006年10月,KVM模块的源代码被正式接纳进入Linux Kernel,成为内核源代码的一部分。因此,KVM是Linux完全原生的硬件虚拟化解决方案。
KVM架构
上图中,Linux内核运行在物理硬件之上,KVM模块将Linux内核本身变成一个Hypervisor。Hypervisor是位于物理硬件和虚拟硬件之间的一个中间层,可以理解为一个代理,它将虚拟硬件要执行的指令按一定的算法调度给物理硬件去执行。有了虚拟硬件,虚拟机就可以按照正常的流程安装操作系统以及运行APP了。
Hypervisor核心工作就是对多个虚拟硬件要求的资源进行统筹协调,最主要的就是协调CPU资源和内存资源。对于CPU资源,Hypervisor通过选择合适的调度算法,把物理CPU合理的分配给虚拟CPU使用。对于内存资源,Hypervisor需要先将物理硬件的内存地址转化为虚拟硬件的物理地址,虚拟机Operating System OS会把虚拟硬件的物理地址映射为虚拟内存地址,进而提供给APP使用。KVM除了对CPU和内存资源进行管理之外,还能够使用Linux支持的任何存储形式来存储虚拟机系统盘。
Ⅲ 型:
虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),指向底层托管操作系统,即操作系统虚拟化。操作系统虚拟化是在操作系统中模拟出运行应用程序的容器,所有虚拟机共享内核空间,性能最好,耗费资源最少。但是缺点是底层和上层必须使用同一种操作系统,如底层操作系统运行的是Windows系统,则VPS/VE就必须运行Windows。
云计算的本质
云服务器:位于云上的使用虚拟化技术构建出的服务器;
CSP:Cloud Service Provider;
在云计算出现之前,互联网公司是需要购买服务器、存储和网关等基础设施的。在云计算出现之后,互联网公司还是需要购买服务器、存储和网关等基础设施的。因此,互联网的基础设施并没有因为云计算的出现而改变。但是可以发现,在云计算出现以前,企业IT采购基础设施的流程至少几个月。而云计算出现之后,企业IT采购基础设施的流程可以在很短时间内完成。因此,云计算颠覆的是互联网基础设施的交付方式。这种对互联网基础设施交付方式的改变就要求,Cloud Service Provider CSP能够以一种区别于传统硬件的方式提供互联网的基础设施。于是,虚拟化技术就正式进入了历史舞台(虚拟化技术早在云计算出现之前很多年就已经存在,只不过彼时的虚拟化技术使用的场景比较有限,不被大家所关注)。
虚拟化技术(VMware、Xen、KVM等),即能够虚拟计算机硬件的技术。利用虚拟化技术虚拟出计算机必要的各个组件,再将虚拟出的组件组装起来,就得到一台虚拟的计算机(虚拟机),因此可以虚拟出千万台计算机组成云。
计算机由五大部分组成:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器统称为中央处理器(CPU)。存储器分为内存和外存(硬盘)。输入设备和输出设备统称外设(键盘显示器等等)
从Cloud Service Provider CSP的角度来分析其必要性。首先,CSP的客户是通过网络连接到位于云上的虚拟机(虚拟的计算机)的,为此CSP并不需要关心虚拟机外设的实现。CSP需要关心的是如何利用虚拟化技术对虚拟机的CPU、内存及外存进行实现。
把CPU和内存的虚拟化实现统称为虚拟硬件。而外存实际上就是一个特定格式的文件(vid、qcow2等等)。但是单单有外存是没有意义的,还需要给这个外存安装操作系统。把安装了操作系统的外存统称为虚拟系统盘(实际上是一个文件)。CSP要实现一台云服务器,只需要关心两个问题:如何构建虚拟硬件?如何构建虚拟系统盘?
在常见的虚拟化技术中,这两个问题都有完整的解决方案。比如QEMU/KVM能够提供一套完整的虚拟硬件系统环境,而QEMU推荐的qcow2文件可以用来构建虚拟系统盘。
任何一台云服务器都是由虚拟硬件和虚拟系统盘组成的。但是,云上有成千上万台虚拟机,它们背后对应着海量的虚拟硬件和虚拟系统盘,如何组织这些虚拟硬件和虚拟系统盘是一个值得研究和思考的课题。
为什么用docker?
在微服务的大背景下,一台物理机或者云主机可能要运行很多应用。应用必须依赖于开发环境。当我们遇到拓展物理机、云主机、应用迁移等场景,必然要重新搭建开发环境。这时,虚拟化技术就很好地保证环境一致、配置一致,并且让你更高效地迁移应用。
Docker正是应对这种场景的虚拟化技术。例如java,只要机器上安装了JVM,一份代码到处运行。应用好比java,只要机器上安装docker,我们事先保存的镜像可以到处运行。这些镜像可以是nginx、php、mysql、数据仓库等,无论你的主机从ubuntu迁移到centos,还是windows迁移linux,只要主机安装了docker,就能迅速地部署好新环境,并且保持环境、配置一致。
什么是镜像、容器、仓库?
镜像,是特殊的文件系统,他包含程序、配置、资源等;
容器,镜像的实例。就像是类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库,用于保存镜像的服务。