背景:通过本文可以了解云计算基础技术。


一、虚拟化

虚拟化是一种具体技术,指是一种资源管理技术,是将计算机的各种实体资源,如CPU、网络、内存及存储等予以抽象、转换后呈现出来,打破实体结构件的不可分割障碍,使用户可以比原来的组态更好的方式来应用这些资源。

(1) CPU 特权级

​ 特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很多支持,就Intel x86架构的CPU来说一共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于 Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。

(2) 内核态和用户态

  • ring 0 被叫做内核态,完全在操作系统内核中运行
  • ring 3 被叫做用户态,在应用程序中运行

​ 从上图我们可以看出来通过系统调用将 Linux 整个体系分为用户态和内核态,为了使应用程序访问到内核的资源,如 CPU、内存、I/O,内核必须提供一组通用的访问接口,这些接口就叫系统调用。

​ 库函数就是屏蔽这些复杂的底层实现细节,减轻程序员的负担,从而更加关注上层的逻辑实现,它对系统调用进行封装,提供简单的基本接口给程序员。

​ Shell 顾名思义,就是外壳的意思,就好像把内核包裹起来的外壳,它是一种特殊的应用程序,俗称命令行。Shell 也是可编程的,它有标准的 Shell 语法,符合其语法的文本叫 Shell 脚本,很多人都会用 Shell 脚本实现一些常用的功能,可以提高工作效率。

​ 最后来说说,什么情况会导致用户态到内核态切换

  • 系统调用:用户态进程主动切换到内核态的方式,用户态进程通过系统调用向操作系统申请资源完成工作,例如 fork()就是一个创建新进程的系统调用,系统调用的机制核心使用了操作系统为用户特别开放的一个中断来实现,如 Linux 的 int 80h 中断,也可以称为软中断。

  • 异常:当 CPU 在执行用户态的进程时,发生了一些没有预知的异常,这时当前运行进程会切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常。

  • 外围设备中断:当 CPU 在执行用户态的进程时,外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令,转到与中断信号对应的处理程序去执行,也就是切换到了内核态。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。

(3) Hypervisor(VMM)

虚拟化管理程序

​ 一种运行在基础物理服务器和操作系统之间的中间软件层(可以是软件程序,也可以是固件程序),它允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统;它可以协调访问服务器上的所有物理设备和虚拟机,当服务器启动并执行Hypervisor时它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统,它能够使得这些虚拟机可高效地去分享物理服务器的硬件资源。也叫虚拟机监视器VMM(Virtual Machine Monitor);
Hypervisor是所有虚拟化技术的核心,非中断地支持多工作负载迁移的能力是Hypervisor的基本功能;
Hypervisor 翻译过来就是超级监督者,被引申为超级管理程序、超多功能管理器、虚拟机管理器、VMM;

(4) Hypervisor类型

TYPE 1 全虚拟化

​ 客户操作系统可以直接使用 Ring 0 而无需修改,就可以运行在这样的VMM中。在全虚拟化的虚拟平台中,GuestOS并不知道自己是一台虚拟机,它会认为自己就是运行在计算机物理硬件设备上的HostOS。因为全虚拟化的VMM会将一个OS所能够操作的CPU、内存、外设等物理设备逻辑抽象成为虚拟CPU、虚拟内存、虚拟外设等虚拟设备后,再交由GuestOS来操作使用。这样的GuestOS会将底层硬件平台视为自己所有的,但是实际上,这些都是VMM为GuestOS制造了这种假象。

a. 软件辅助全虚拟化

​ 在Intel等CPU厂商还没有发布x86 CPU虚拟化技术之前,完全虚拟化都是通过软件辅助的方式来实现的。而软件辅助的全虚拟化主要是应用了两种机制:特权解除和陷入模拟(二进制翻译)。

​ 软件辅助虚拟化能够成功的将所有在GuestOS中执行的系统内核特权指令进行捕获、翻译,使之成为只能对GuestOS生效的虚拟特权指令。但是退一步来说,之所以需要这么做的前提是因为CPU并不能准确的去判断一个特权指令到底是由GuestOS发出的还是由HostOS发出的,这样也就无法针对一个正确的OS去将这一个特权指令执行。直到后来CPU厂商们发布了能够判断特权指令归属的标准x86 CPU之后,迎来了硬件辅助全虚拟化。

b. 硬件辅助全虚拟化

前提条件:CPU 支持 Intel VT 和 AMD-v技术

​ 硬件辅助全虚拟化主要使用了支持虚拟化功能的CPU进行支撑,CPU可以明确的分辨出来自GuestOS的特权指令,并针对GuestOS进行特权操作,而不会影响到HostOS。

TYPE 2 半虚拟化

​ 对客户操作系统(VM)的内核进行修改,将运行在Ring 0上的指令转为调用hypervisor,半虚拟化技术通过在GuestOS的源代码级别上修改特权指令来实现虚拟化。修改内核后的GuestOS也知道自己就是一台虚拟机。所以能够很好的对核心态指令和敏感指令进行识别和处理,但缺点在于对不开源的的镜像文件无法修改内核文件,所以无法对不开源的操作系统进行虚拟化。

(5) 容器技术

​ 还有一种虚拟化技术属于操作系统虚拟化的范畴,也就是在由操作系统提供虚拟化的支持,操作系统提供接口,能够让应用程序间可以互不干扰的独立运行,并且能够对其在运行中所使用的资源进行管理。由于应用程序的运行被隔离在了一个独立的运行环境之中,这个独立的运行环境就像一个容器,包含住应用程序。实现方式基于 Linux 内核中的 namespace 、 chroot 、 cgroup 来实现。

​ 容器技术和主机虚拟化技术架构如下图所示:

(6) QEMU

​ QEMU:是一套由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性,但由于其所有指令都需要经过QEMU来翻译因而性能会比较差(存软件模拟)。QEMU有两种工作模式:系统模式,可以模拟出整个电脑系统,另一种是用户模式,可以运行不同与当前硬件平台的其他平台上的程序(比如在x86平台上运行跑在ARM平台上的程序)。

(7) KVM

​ Kernel-Based Virtual Machine 基于内核的虚拟机,是Linux内核的一个可加载模块,通过调用Linux本身内核功能,实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,需要x86架构的,支持虚拟化功能的硬件支持(比如Intel-VT,AMD-V),是一种全虚拟化架构。KVM在2007年2月被导入Linux 2.6.20内核中。从存在形式来看,它包括两个内核模块:kvm.ko 和 kvm_intel.ko(或kvm_amd.ko),本质上,KVM是管理虚拟硬件设备的驱动,该驱动使用字符设备/dev/kvm(由KVM本身创建)作为管理接口,主要负责vCPU的创建,虚拟内存的分配,vCPU寄存器的读写以及vCPU的运行。

​ KVM是linux内核的模块,它需要CPU的支持,采用硬件辅助虚拟化技术Intel-VT,AMD-V,内存的相关如Intel的EPT和AMD的RVI技术,Guest OS的CPU指令不用再经过Qemu转译,直接运行,大大提高了速度,KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问这个接口。

(8) QEMU-KVM

​ 从前面对KVM内核模块的介绍知道,它只负责CPU和内存的虚拟化,加载了它以后,用户就可以进一步通过工具创建虚拟机(KVM提供接口),但仅有KVM还是不够的,用户无法直接控制内核去做事情(KVM只提供接口,怎么创建虚拟机,分配vCPU等并不在它上面进行),还必须有个运行在用户空间的工具才行,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,并对其进行了修改,最后形成了QEMU-KVM。

​ 在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件,QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。当然,由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备。

综上所述,QEMU-KVM具有两大作用:
1.提供对cpu,内存(KVM负责),IO设备(QEMU负责)的虚拟
2.对各种虚拟设备的创建,调用进行管理(QEMU负责)

(9) Libvirt

​ 一个针对各种虚拟化平台的虚拟机管理的API库,一些常用的虚拟机管理工具如virsh(类似vim编辑器),virt-install,virt-manager等和云计算框架平台(如OpenStack,OpenNebula,Eucalyptus等)都在底层使用libvirt提供的应用程序接口。libvirt主要由三个部分组成:API库,一个守护进程 libvirtd 和一个默认命令行管理工具 virsh。

二、云计算

​ “云”实质上就是一个网络,狭义上讲,云计算就是一种提供资源的网络,使用者可以随时获取“云”上的资源,按需求量使用,并且可以看成是无限扩展的,只要按使用量付费就可以。

​ 云计算是一种按使用量付费的服务模式,这是一种能够提供可用的、便捷的、按需求的网络访问模式,计算共享池能够快速的为用户提供网络、服务器、存储、应用软件及其他服务,并且只需要花费很少的管理时间。

1. 云计算类型

小故事

  1. 张三自己在家做饭吃,这是私有云,厨房就是自建机房。
  2. 李四天天在饭店吃,这是公有云,饭店就是云数据中心。
  3. 然后王五比较牛叉,在饭店有个固定包间,不对外开放,这是托管型私有云(有的厂商将其定义为专有云)。包间就好比云数据中心的托管服务器。
  4. 某一天张三家来了十来个客人,这是业务突增,家里没法坐下那么多人,要去饭店,这是私有云转公有云
  5. 然后张三爸妈为了省点钱决定留在家里吃,张三带着客人去饭店吃,这就是混合云

(1)私有云(Private Cloud)

​ 私有云可广义地定义为专为单个最终用户或群组而创建,而且通常在该用户或群组的防火墙内运行的云环境。如果底层 IT 基础架构归某个拥有完全独立访问权限的客户专有,那这种云就是私有云。

​ 但是,如今的私有云不再必须从内部 IT 基础架构来搭建。现在,许多企业已开始在租赁的、供应商所有的外部数据中心内构建私有云,所以位置和所有权都早已不是界定标准。同时,这也让私有云形成了许多子分类,包括:

  • 托管私有云

客户可以创建并使用由第三方供应商部署、配置和管理的私有云。适合 IT 团队人手不足或技能欠缺的企业,能为用户提供更为出色的私有云服务和基础架构。

  • 专用云

它就像是云中的云。您可以在公共云或私有云上部署专用云。例如,会计部门可以在企业的私有云中部署自己的专用云。

(2)公有云(Public Cloud)

​ 公有云通常由非最终用户所有的 IT 基础架构构建而成。以下是一些规模最大的公共云提供商:阿里云、Amazon Web Services(AWS)、Google 云、IBM Cloud 及 Microsoft Azure。

​ 以前的公共云基本都在组织外部运行,但如今的公共云提供商已逐渐开始在客户的内部数据中心提供云服务。所以用位置和所有权来区分已经不再适用。

只要环境进行了分区,并重新分配给多个租户,那这种云就是公共云。计费结构不再是公共云的必要特征,因为有些云提供商(比如 Massachusettes Open Cloud)允许租户免费使用其云服务。公共云提供商所使用的裸机 IT 基础架构也可以抽象并作为 IaaS 出售,或开发成一种作为 PaaS 出售的平台。

(3)混合云(Hybrid Cloud)

混合云是从局域网(LAN)、广域网(WAN)、虚拟专用网(VPN)和/或 API 连接的多个环境创建而成的 IT 环境,但看起来只是单一的一个环境。

混合云的特性较为复杂,不同的人对它的要求和理解都各不相同。例如,混合云可能需要包含:

  • 至少 1 个私有云与至少 1 个公共云
  • 2 个或多个相互连接的私有云
  • 2 个或多个公共云
  • 连接至少一个公共云或私有云的裸机或虚拟环境

​ 不过,如果应用可以轻松地移入或移出多个独立但相互连接的环境,每个 IT 系统就相当于成了一个混合云。这些环境中至少有一部分必须来自可按需扩展的整合 IT 资源,而您需要使用集成化管理和编排平台,把所有这些环境视为单个环境进行管理。

(4)多云 (Multicloud)

​ 多云是一种云架构,由多个云供应商提供的多个云服务组合而成,既可以是公共云,也可以是私有云。所有混合云都是多云,但并非所有多云都是混合云。当通过某种形式的集成或编排将多个云连接在一起时,多云就变成了混合云。

​ 多云环境可能是有意为之(更好地控制敏感数据,或作为冗余存储空间以提高灾难恢复能力),也可能是偶然形成的(通常是影子 IT 的结果)。无论哪种,都表明有越来越多的企业选择了多云,以期通过扩展更多环境来改进安全与性能。

2. 云计算业务模式

(1)Iaas

Iaas:提供给用户的是云计算基础设施,包括CPU、内存、存储、网络等其他的资源服务,用户不需要控制存储与网络等基础设施。

(2)Paas

Paas:提供给用户的是云计算中的开发和分发应用的解决方案,用户能够部署应用程序,也可以控制相关的托管环境,比如云服务器及操作系统,但用户不需要接触到云计算中的基础设施。

(3)Saas

Saas:提供给用户的是云计算基础设施上的应用程序,用户只需要在客户端界面访问即可使用到所需资源,而接触不到云计算的基础设施。

三、参考文章

感谢以下各位大佬的帮助!!!

云服务器和虚拟化服务器,哪个适合你

云计算服务类型有哪些

第22章 使用openstack部署云计算服务环境。

从根上理解用户态与内核态

全/半虚拟化、硬件/软件辅助的全虚拟化之间的区别与联系