一、什么是虚拟化?
- 虚拟化是允许更有效地利用物理计算机硬件的过程,并且是云计算的基础。 --IBM
- 虚拟化使用软件在计算机硬件上创建抽象层,该抽象层允许将单台计算机的硬件元素(处理器,内存,存储设备等)划分为多个虚拟计算机,通常称为虚拟机(VM)。 每个VM都运行自己的操作系统(OS),并且行为类似于独立的计算机,即使它仅在实际基础计算机硬件的一部分上运行。 --IBM
- 为什么要用虚拟化(传统的物理设备不够灵活)
- 时间灵活性: 想什么时候要就什么时候要,需要的时候一点就出来了
- 空间灵活性:想要多少就有多少。需要一个太很小的电脑,可以满足;需要一个特别大的空间例如云盘,云盘给每个人分配的空间动不动就很大很大,随时上传随时有空间,永远用不完,也是可以满足的
- 这两个灵活性也就是后面我们要讲的云计算的弹性
- 虚拟化实现依赖的技术(物理机也就是宿主机host如何将自己的资源虚拟化并提供给Guest呢?)
- VMM(Virtual Machine Monitor)/Hypervisor
- Hypervisor:根据RedHat的定义
- Hypervisor是创建并运行虚拟机(VM)的软件,虚拟机监控程序也叫虚拟机监视器(VMM),将虚拟机监控程序操作系统和资源与虚拟机隔离开来,并能够创建和管理这些VM。
- 用作Hypervisor的物理硬件称为主机,而使用其资源的许多VM都是来宾。Hypervisor将诸如CPU,内存和存储之类的硬件资源看作一种可以动态分配的资源池。可以灵活的给虚拟机分配
- Hypervisor提供了虚拟化一个主要优势:多个不同的Guest OS可以独立运行,并与Hypervisor共享相同的虚拟化硬件资源。这是虚拟化的主要优势。没有虚拟化,您只能在硬件上运行1个操作系统
二、VMM Types
- 分为1型虚拟化、2型虚拟化
- 1型虚拟化Hypervisor既是操作系统,又是虚拟化软件,它与操作系统的虚拟化功能集成在一起,为来宾提供虚拟化功能,可以管理所有物理资源,因此具有高效率和安全性的优点。 虚拟机仅依赖于VMM,缺点是管理所有物理资源,意味着VMM承担了大量的开发工作。
- 2型虚拟化也就是主机模型删除了管理功能和虚拟化功能,并且虚拟化功能仅作为内核模块加载。例如,KVM技术是最好的技术之一。 KVM技术可以说是云计算中最核心的技术,将来会经常使用。通常,KVM仅负责CPU和内存的虚拟化,而I/O虚拟化则由另一种技术完成,即QEMU。
- 当前主流X86平台的Hypervisor技术。
- VMware的ESXi
- Linux的KVM + QEMU
- Xen
- 微软的Hyper-V
- Oracle的virtualbox
三、KVM
- 先从由字面意思理解Kernel-Based Virtual Machine就是基于Linux Kernel内核实现
- KVM官方解释:KVM(基于内核的虚拟机)是针对x86硬件上的Linux的完整虚拟化解决方案,包含虚拟化扩展(Intel VT或AMD-V)。它由提供核心虚拟化基础架构的可加载内核模块kvm.ko和处理器特定模块kvm-intel.ko或kvm-amd.ko组成。KVM基于某些Linux内核机制,包括CPU虚拟化,内存虚拟化,外围虚拟化和虚拟机管理以及其他主要功能。它是支持软件仿真硬件并连接各种模式之间的转换的桥梁, KVM自2.6.20版本后已合入主干并发行
- KVM工作原理:KVM包含一个内核模块kvm.ko用来实现核心虚拟化功能,以及一个和处理器强相关的模块如kvm-intel.ko或kvm-amd.ko。KVM本身不实现任何模拟,仅仅是暴露了一个/dev/kvm接口,这个接口可被宿主机用来主要负责vCPU的创建,虚拟内存的地址空间分配,vCPU寄存器的读写以及vCPU的运行。有了KVM以后,guest os的CPU指令不用再经过QEMU来转译便可直接运行,大大提高了运行速度。但KVM的kvm.ko本身只提供了CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完整的虚拟化技术,也就是下面要介绍的技术。
- Libvirt是KVM的管理工具,OpenStack底层也用的Libvirt,Libvrt常用的命令工具virsh
- 举个例子:大家直到nova list {--all-t}可以看vm列表
四、QEMU
- 字面意思Quick Emulator,用C语言编写的一个模拟器,有整套的VM实现,本身并不依赖KVM
- 官方说明:QEMU是一个通用的开源计算机仿真器和虚拟器。
- 现在流行的KVM虚拟化平台,就是在修改了QEMU代码,把他模拟CPU、内存的代码换成KVM,而网卡、显示器等留着,因此QEMU+KVM就成了一个完整的虚拟化平台。由于KVM运行在内核空间,只是内核模块,QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件(磁盘,网卡,显卡等)。从KVM的角度来说,用户没法直接跟内核模块交互,需要借助用户空间的管理工具,因此需要借助QEMU这个运行在用户空间的工具。KVM和QEMU相辅相成,QEMU通过KVM达到了硬件虚拟化的速度,而KVM则通过QEMU来模拟设备并实现和内核空间的KVM的交互,虽然这个交互并不仅仅只有QEMU能够办到。此外,由于QEMU模拟IO设备效率不高的原因,现在常常采用半虚拟化的virtio方式(DPDK场景)来虚拟IO设备:
- 说白了,QEMU干的就是I/O虚拟化的活
五、KVM and QEMU Architecture
KVM作为虚拟机管理程序在主机操作系统内核中运行,支持CPU,内存,I / O的仿真,虚拟机的监视,并为QEMU提供物理支持。
QEMU是一种模拟器,为虚拟机提供运行所需的硬件环境,它是在主机用户模式下运行的进程,基于KVM和内核的特性,可以模拟CPU,内存,I / O等 来宾操作系统的硬件,支持该进程中运行的来宾操作系统。
QEMU和KVM一起使用。 KVM在内核模式下运行以完成CPU和内存模拟,而QEMU在用户模式下运行,负责I / O设备的虚拟化并将模拟的虚拟设备呈现到外部。
六、虚拟化就是云计算么?
- 虚拟化需要手动调度,集群越大,时间和空间灵活性会变差,例如因为虚拟化软件一般创建一台虚拟的电脑,是需要人工指定这台虚拟电脑放在哪台物理机上的。这一过程可能还需要比较复杂的人工配置。所以仅仅凭虚拟化软件所能管理的物理机的集群规模都不是特别大,一般在十几台、几十台、最多百台这么一个规模。
- 这一方面会影响时间灵活性:虽然虚拟出一台电脑的时间很短,但是随着集群规模的扩大,人工配置的过程越来越复杂,越来越耗时。另一方面也影响空间灵活性:当用户数量多时,这点集群规模,还远达不到想要多少要多少的程度,很可能这点资源很快就用完了,还得去采购。
- 人们发明了各种各样的算法来做这个事情,算法的名字叫做调度(Scheduler)。通俗一点说,就是有一个调度中心,几千台机器都在一个池子里面,无论用户需要多少CPU、内存、硬盘的虚拟电脑,调度中心会自动在大池子里面找一个能够满足用户需求的地方,把虚拟电脑启动起来做好配置,用户就直接能用了。这个阶段我们称为池化或者云化。到了这个阶段,才可以称为云计算,在这之前都只能叫虚拟化。
官方文档:https://docs.openstack.org/
深入理解openstack ,推荐书籍:《OpenStack设计与实现》