前言
云计算1.0时代以计算虚拟化技术为主,因此虚拟化技术也成为云计算的入门知识。
学习云计算有两个必不可少的学习内容:虚拟化、Linux
虚拟化简介
定义:
是一种可以将一台计算机虚拟成多台逻辑计算机的技术。在一台计算机上同时运行多台逻辑计算机,每个逻辑计算机可运行不用的操作系统,并且各自的应用程序都可以在互相独立的空间内运行而不受影响,从而显著挺高计算机的工作效率。
说白了就是把物理的设备进行逻辑化。以前的用的物理服务器、电脑都是可以看的见的。现在把物理的设备转成一个逻辑的文件夹。文件夹中一部分记录硬件信息,一部分记录用户数据。
文件夹可以同时保存在一个物理机上。所以一个物理机上可以同时运行多台虚拟机。每个虚拟机都都可以独立运行一个操作系统。所以提高资源利用率。
相信很多朋友都在自己的电脑上装过虚拟机,如用VMware Workstation来装Linux等操作系统,细心的朋友一定会发现创建出来的虚拟机是文件的形式存在的。
计算机虚拟化发展史
1964年IBM开始尝试在大型机上实现虚拟化,1972年IBM成功推出了在大型机上的虚拟化。1978 年 6 月 8 日,英特尔(Intel)发布了新款的 16 位微处理器 8086,自此开创了一个新的时代,属于 x86 架构的时代,直至今天。在隔了二十多年的时间之后,1999年,个人电脑需求火热的时代,VMware推出了x86架构的虚拟化产品,从此虚拟化技术终于走下了大型机的神坛。 2002年英国剑桥大学的以为讲师发布了开源虚拟化项目Xen1.0,往后,基于 Xen 虚拟化解决方案陆续被 Redhat、Novell 和 Sun 等的 Linux 发行版集成,作为默认的虚拟化解决方案。后来Xen被思捷收购,Linux转投KVM。10年Xen彻底被Linux抛弃。2006年以色列公司Qumranet宣布推出KVM虚拟化技术,并在2008年被Red Hat收购,红帽开始使用KVM替换在Linux中使用的Xen。同年微软在windows Server 2008 R2中加入了Hyper-v技术。2011年IBM、红帽、惠普、英特尔成立开放虚拟化联盟,加速KVM推广与发展。2013年虚拟化容器技术Docker被推出,6 月,Docker 发布了第一个正式版本 v1.0。同年,Redhat 和 AWS 就宣布了为 Docker 提供官方支持。容器技术开始成为虚拟化热门技术。2014年Rocket被推出。
看完了这段历史之后,很多朋友可能对Xen、KVM、Docker等概念云里雾里,别着急我会一个一个具体介绍。
虚拟化中的重要概念
物理服务器
也就是我们个人电脑的架构
最底层是硬件,然后是操作系统(Host OS)然后最上层是应用和用户交互,操作系统和硬件之间通过Bios相连
Host Machine:
物理最底层的硬件:CPU、内存、硬盘等
Host OS:
在物理机上安装的操作系统
虚拟机
相比物理服务器,有些不同:多出了操作系统(Guest OS)、虚拟机、虚拟机监视器。
Hypervisor:
虚拟机监视器/虚拟化软件层。又叫VMM:虚拟机监控机
- 前面提到的KVM、XEN都是Hypervisor
- 有了Hypervisor才有虚拟化,它是虚拟化的核心
- 负责监控虚拟机的状态,给虚拟机分配CPU、内存、甚至是I/O的虚拟化。
Guest Machine:
虚拟机
Guest OS:
安装在虚拟机上的操作系统
- Guest OS通过Hypervisor/VMM来访问实际的物理资源
举例:平常用VMware安装虚拟机。Windows就是Host OS。VMware软件就有Hypervisor的功能,然后创建之间要建虚拟机,然后再在虚拟机上安装Linux或者其他操作系统:Guset OS。
计算机虚拟化的分类
根据Host OS和Hypervisor/VMM的关系分:
(也可以说是根据Hypervisor/VMM的位置)
类型 | 名称 |
---|---|
Ⅰ型 | 裸金属型虚拟化 |
Ⅱ型 | 宿主型虚拟化 |
裸金属虚拟化(Ⅰ型)
Hypervisor直接可以掌握调动硬件资源,不需要经过Host OS(没有Host OS)
或者说:在Ⅰ型虚拟化中,Hypervisor就是Host OS,定制的Host OS
优点:
- 不依赖操作系统
- 虚拟机支持多种操作系统以及多种应用
缺点:
- 内核开发难度大
- 负载重
产品
- 华为的Fusion Compute
- Xen Server
- VMware Esxi
- Hyper-v
- 等
宿主型虚拟化(Ⅱ型)
物理资源由Host OS来管理,实际的虚拟化功能由VMM提供。
VMM是Host OS上的一个普通的应用程序。
通过VMM在创建相应的虚拟机,和Host OS共享底层的硬件资源。VMM通过调用Host OS的服务来调用资源。VMM创建的虚拟机通常是作为Host OS中的一个进程在运行。
优点:
- 简单、易实现
缺点
- 占用资源多,性能损耗大
产品
- VMAware Workstation
- VirtualBox(Oracle:甲骨文公司)
- KVM
- 等
Ⅰ型虚拟化和Ⅱ型虚拟化没有孰优孰劣之分。
虚拟化的特点
无论是Ⅰ型虚拟化还是Ⅱ型虚拟化都具备了以下四个特点
特点 | 解释 |
---|---|
分区 | 传统的物理机,不会装很多应用,因为应用之间可能会有冲突。 将单个物理服务器上可以同时安装多个虚拟机,将物理资源分别分区给虚拟机,虚拟机认为自己是运行在专属的服务器上。 |
隔离 | 虚拟机间互不干扰 一个Guest OS遭到病毒攻击,不是对其他造成影响 |
封装 | 虚拟机封装成文件,且可以通过移动复制文件的方式来移动复制虚拟机。 将安装好的虚拟机拷贝到另一台物理机上也是可以运行的(VMware中的文件,直接复制到另一台电脑可以直接运行) |
独立 | 相对于硬件独立,一个硬件中可以装不同的虚拟机 无需修改就可以在任何服务器上运行虚拟机 |
计算虚拟化一共分为三个领域。分别是CPU虚拟化、内存虚拟化、I/O虚拟化。
cpu虚拟化
CPU虚拟化分为
分类 |
---|
全虚拟化 |
半虚拟化 |
CPU的分级保护域
Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,RING0,RING1,RING2,RING3。Windows只使用其中的两个级别RING0和RING3。RING0层拥有最高的权限,RING3层拥有最低的权限。
按照Intel原有的构想,应用程序工作在RING3层,只能访问RING3层的数据,操作系统工作在RING0层,可以访问所有层的数据,而其他驱动程序位于RING1、RING2层,每一层只能访问本层以及权限更低层的数据。Guest os在Ring1
如果普通应用程序企图执行RING0指令,则会显示“非法指令”错误信息。
原因:
保护计算机安全。威胁到计算机的指令只能由操作系统来执行,防止恶意的软件随时调用硬件资源
举例:
某个应用需要开启摄像头,需要向Ring 0的驱动程序请求开关,否则会被拒绝此类操作。
在虚拟化中带来一个问题:
Guest OS是一个操作系统,Hypervisor也是一个操作系统。原先OS在Ring 0上,做虚拟化之后,Guest OS运行在Ring 1层。Host OS或者Hypervisor在Ring 0层。但是两个操作系统都应该有Ring 0的权限,底层硬件就不知道听谁的了。
这时候就引入一个新的方法:敏感指令
只有在虚拟化才有
解决方案有两个:全虚拟化、半虚拟化
全虚拟化
Guest OS执行敏感指令的时候,Hypervisor也会截获这个指令,并翻译指令,然后再传给硬件资源,调用硬件,再把返回的结果传给Guest OS
过程中:Guest OS不知道自己是一个虚拟机,它认为自己完全执行了这个敏感指令。
由于在执行的过程中,敏感指令被执行了两次,还要被Hypervisor翻译,所以效率低。
半虚拟化
半虚拟化中Guest OS知道自己是虚拟机,当它发现要执行敏感指令时,就会直接给Hypervisor发送Hypercall指令,然后Hypervisor再去调用硬件资源,再把结果返回给Guest OS
优点:
- 性能几乎等于物理机
缺点:
- 必须修改Guest OS的内核、开源的操作系统支持半虚拟化,有些闭源的操作系统不支持半虚拟化:windows
硬件辅助虚拟化
经过了时代的发展,推出了硬件辅助虚拟化。将所有的工作都交给CPU去处理。
在硬件辅助虚拟化中CPU保护域不再只是分为Ring 0到Ring 3,而是分为ROOT模式和非ROOT模式,每个模式下面再分分保护域。(两套特权级,两个Ring 0),Guest OS在非ROOT模式下的Ring 0上,Hypervisor或者Host OS就运行在ROOT模式的Ring 0上。执行指令时,Guest OS先将指令发给Hypervisor,Hypervisor再发给硬件资源。
需要硬件(CPU)支持:
Inter vp-x、AMD -V
优点:
- 效率高,性能提高
目前全虚拟化、半虚拟化一般都有硬件辅助虚拟化加持
内存虚拟化
一台物理机一般只有一条内存条。但是一台物理机可能运行了多台虚拟机。那就遇到一个问题:如何分配内存空间
因为通常情况下使用内存空间有两个要求:
- 地址空间连续的
- 内存空间要从0开始
解决办法:通过逻辑的地址映射
VMM将物理内存映射给虚拟机,让虚拟机觉得自己在使用一个真实的、连续的内存。但是其实在真实内存中,他是不连续的。
I/O虚拟化
技术 | 解释 |
---|---|
模拟(完全虚拟) | 完全使用软件来模拟真实硬件,模拟通常硬件,例如键盘鼠标,通过焦点捕获,焦点被哪个主机捕获就被哪个主机使用,性能很差。 |
半虚拟化 | 对硬件驱动由前端(IO frontend)直接转到后端(IO backend)调用,通常仅适用于硬盘和网卡,性能高。 |
IO-through:IO透传 | 直接分配给虚拟机物理设备,例如直接分配一个硬盘或网卡给虚拟机,需要硬件具备IO透传技术,在Xen下由Dom0分配,但是访问使用直接使用,不经过Dom0,需要硬件支持。 性能最高 硬件设备不经过Hypervisor,相当于把物理设备直接做虚拟化,给虚拟机使用。 |
虚拟化和云计算的对比
虚拟化
为了提高硬件的利用率,把物理主机虚拟成多台逻辑主机。每一台主机上都可以运行不同的操作系统。
云计算
在云计算中我们主要用虚拟化来实现基础的Iaas云服务。但是云计算中不单单是Iaas
- 虚拟化是一种技术
- 云计算是一种模式
- 没有虚拟化我们也能实现云计算,但是又虚拟化我们能更好的实现云计算。
主流的计算机虚拟化技术
开源虚拟化技术
-
KVM
-
Xen
开源的优劣势
- 技术免费
- 使用要求高,学习成本高,出问题只能自己解决
- 技术更新快(因为开源)
闭源
-
HUAWEI FusionSphere
-
Hyper-v
-
VMware ESXi
闭源优劣势
- 收费
- 学习成本低
- 厂商服务支持
XEN与KVM
主流的Hypervisor架构:XEN、KVM
可以说是Hypervisor的分类
Xen :
轻量级Hypervisor
Xen是第一类运行在裸机上的虚拟化管理程序(Hypervisor)。它支持全虚拟化和半虚拟化,属于裸金属架构。Xen支持hypervisor和虚拟机互相通讯。Xen最重要的优势在于半虚拟化,此外未经修改的操作系统也可以直接在xen上运行,能让虚拟机有效运行而不需要仿真,因此虚拟机能感知到hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。
Xen中的虚拟机分为两类
Dom0:特权用户(相当于管理员,老大)
- 管理普通用户的生命周期
- 直接命令底层硬件
- 启动DomU之前,只要启动DomU
DomU:普通用户
不能直接访问硬件资源
所有操作都需要前后端驱动的方式,转给Dom0,再由Dom0完成具体的操作之后再返回给DomU
KVM
KVM是在Host os(必须linux)上镶嵌一个KVM模块,使内核成为Hypervisor。Host kernel与VM对于共享区域的访问和映射 无需经过Hypervisor的授权,故尔访问路径较短。kvm采用全虚拟化技术(不修改Guest kernel),搭配硬件辅助虚拟化(支持intel-VT/AMD-V). 混合虚拟化架构。
KVM是集成到linux内核的系统虚拟化模块,是Linux中的一个进程,使用linux自身调度器进行管理,工作在X86架构且需支持硬件辅助虚拟化技术(Intel VT和AMD-V)。使用全虚拟化技术,采用混合虚拟化架构。
只支持全虚拟化技术
KVM简介
KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:
单独KVM:
- Linux中的内核模块(程序),使Linux变成Hypervisor。
- KVM内核模块本身只能提供CPU和内存的虚拟化,不能提供其他的虚拟化(如I/O)
QEMU-KVM:
- 提供CPU、内存的虚拟化。拦截客户机的I/O。Guest OS的I/O被KVM拦截之后,交给QEMU处理。
QEMU:
-
原生的QEMU:
-
- Qemu 是纯软件设计的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和虚拟机打交道,但其实是和Qemu模拟出来的硬件打交道,Qemu 将这些真正的指令转译给真正的硬件
-
QEMU-KVM(构成一套完整的虚拟化解决方案)
- 正因为Qemu是纯软件实现的,所有的指令都要经过qemu过一手,性能非常低,所以在生产环境中,Qemu配合KVM来完成虚拟化工作,因为kvm是硬件辅助的虚拟化技术,主要负责比较繁琐的cpu虚拟化和内存虚拟化,而QEMU则负责IO设备虚拟化,两者合作发挥自身的优势,相得益彰,提高性能。
运行模式
安装了KVM就相当于安装KVM的LINUX内核模块,会产生三个模式(guest mode; 用户 mode;内核 mode)
-
Guest Mode(客户模式)
只要指的是虚拟机,以及虚拟机模拟的CPU、磁盘,等设备。受限的CPU模式
-
用户 Mode(用户模式)
主要运行QEMU,主要是为虚拟机模拟执行I/O操作请求。
只拥有部分的控制权限,绝大多数的应用程序都运行在这个模式。该模式出现状态异常,仅导致该应用程序崩溃。 -
Kernel Mode(内核模式)
进行真正的硬件操作。
代码具有对硬件所有的控制权限。可以执行所有CPU的指令。该模式下出现 状态异常,将导致整个机器崩溃。
Guest OS需要调用硬件硬件的时候,需要先发送请求到用户模式,再到内核模式,才能调用硬件。
KVM体系架构
管理工具
管理工具 | 作用 |
---|---|
Virsh | 命令行 基于 libvirt 的 命令行工具 (CLI) |
Virt-manager | 图形化界面 基于 libvirt 的 GUI 工具 |
Virt-viewer | 图形化界面 连接到虚机屏幕的工具 |
Virt-install | 命令行 创建KVM虚机的命令行工具 |
Others | Virt-clone(虚机克隆工具) virt-top sVirt:安全工具 virt-v2v:虚机格式迁移工具 |
Libvirt
操作和管理KVM虚机的虚拟化 API。是一个开源项目,非常强大的管理工具。被管理的虚拟化平台可以是:XEN、KVM、Hyper-V、VMware等等
上面的管理工具被打包成一个API库包括在Libvirt
libvirt包括一个API库,一个守护进程(Libvirtd),和一个命令行实用程序(virsh)
Libvirt直接可以管理KVM,而且向上还提供各个语言的接口。许多公司会基于KVM来做定制的开发,开发适用于自己产品的管理工具,管理工具可能使用JAVA、Python、PHP等不同的语言开发,Libvirt能够完美的兼容各种语言开发的管理工具。
KVM+QEMU
这两个组件就能组成一个完整的虚拟化解决方案。(QEMU-KVM)
KVM内核模块本身只能提供CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完成的虚拟化技术,这就是QEMU-KVM。
再加上管理工具、Libvirt就是一套更完整的解决方案。
一般的体系架构都是这样的。所以可以通过这个体系架构去了解其他的架构。
KVM I/O操作流程
可以对应先前讲的 I/O的模拟和半虚拟化
默认操作流程(全虚拟化I/O)
默认的情况下,KVM的I/O操作流程,使用模拟的流程。
模拟的方式要经过十个步骤:所以性能差
流程
1:虚拟机发起I/O的操作请求,把请求发给虚拟的设备驱动
2:KVM中模块中的I/O Trap Code会捕获这个请求
3:然后将请求发送到I/O共享页中 同时告诉QEMU这里有个请求,你来解决一下:Notification
4:QEMU到共享页中拿这个请求
5:查看请求是什么要调用什么设备?然后根据I/O请求去给真实的设备驱动发送请求
6:设备驱动调用真实设备
7:处理完成之后,QEMU将处理完成的信息放到共享页当中 并通知KVM模块,我已经处理完成了
8:然后KVM模块中的I/O Trap Code将信息从I/O共享页中拿出来
9、10:再返回给Guset OS
无论是Guest OS发出请求,还是QEMU处理完请求之后返回的信息,都经过了KVM模块,但是KVM并没有做实质性的处理。这让性能降低。
所以有没有一种方法,让Guest OS请求方,QEMU处理方,直接让他们交流,不经过KVM模块。
Virtio (半虚拟化I/O)
在Virtio中,无论是Guest OS的请求消息,还是QEMU返回的消息都不经过KVM模块。只是通过KVM来发一个通知。
请求和返回的结果全部放在一个中间的vring的一个空间中。少了KVM模块经手的手续。从而提高I/O虚拟化的性能
具体性能提升举例:
网卡速率:模拟出来的网卡速率一般只有百兆,然后用Virtio之后,网卡速率可以达到万兆。
华为FusionCompute简介
架构
华为Fusion Compute的架构和KVM体系架构差不多,也是包括:管理工具、虚拟化的产品。
Fusion Compute管理工具:
VRM(Virtual Resource Manager,虚拟资源管理器)。
VRM给管理员、用户提供一个Web的图形化界面了,界面中可以看到虚拟机的状态、底层硬件资源池的状态(剩多少内存、硬盘、有多少CPU)、虚拟机的信息等等
集群:
向上提供了计算、存储、网络资源
Fusion Computer的优势:
- 虚拟化和物理资源统一管理
- 快速发放虚拟机(最大可50台)
组件作用
FusionCompute由两部分组成:
- CNA(Computing Node Agent,计算节点代理)
- VRM(Virtual Resource Manager,虚拟资源管理器)
其中VRM相当于KVM中的管理工具,管理员和用户可以通过图形化的Portal对FusionCompute进行管理和使用。它是基于Linux操作系统的,所以我们登录VRM后,很多Linux命令都可以使用。
CNA相当于KVM中QEMU+KVM模块,主要提供虚拟化功能,通常是以集群的方式部署,将集群内的计算、存储和网络资源虚拟化成资源池供用户使用。同样,CNA也是基于Linux操作系统的。
组件 | 主要作用 |
---|---|
CNA | 提供虚拟计算功能。 管理计算节点上的虚拟机。 管理计算节点上的计算、存储、网络资源。 |
VRM | 管理集群内的块存储资源。 管理集群内的网络资源(IP/VLAN),为虚拟机分配IP地址。 管理集群内虚拟机的生命周期以及虚拟机在计算节点上的分布和迁移。 管理集群内资源的动态调整。 通过对虚拟资源、用户数据的统一管理,对外提供弹性计算、存储、IP等服务。 通过提供统一的操作维护管理接口,操作维护人员通过WebUI远程访问FusionCompute对整个系统进行操作维护,包含资源管理、资源监控、资源报表等 |
注意CNA和VRM的区别
VRM和CNA都有管理的作用,CNA管理的是本节点上的虚拟机和资源,而VRM是从集群或者整个资源池的层面进行管理。如果VRM对某个虚拟机进行修改或者其它生命周期的操作时,需要将命令下发给CNA节点,再由CAN去执行。操作完成后,CNA再把结果返回给VRM,由VRM记录到数据库中。所以尽量不要到CNA上执行虚拟机或其它资源的修改操作,以避免造成VRM数据库中的记录与实际不匹配的情况。