1. 各种概念
1.1. 云计算
云计算(cloud computing)是基于互联网的相关服务的增加,使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源.
1.1.1. 云计算的三层网络架构
- SaaS:软件即服务,比如购物网站,博客网站,微博网站等.
- PaaS:平台及服务,虚拟机搭建的开发平台,比如配置好的Apache,MySql或者PHP环境
- IaaS:基础设施即服务,物理机的管理,虚拟机的管理,存储资源的管理.(OpenStack所在的层)
1.2. KVM
KVM-基于内核的虚拟机(Kernel-Based Virtual Machine),将Linux内核变成Hypervisor的一种虚拟化技术,属于硬件级虚拟化类型的全虚拟化的解决方案.是Linux的内核特性,KVM需要两个条件:
- 硬件支持全虚拟化
- 操作系统是Linux.
1.2.1. KVM架构
- KVM作为Hypervisor运行在宿主机内核(Host OS Kernel)(即属于内核态)
- 支持对CPU,内存,I/O的模拟
- 对虚拟机的监控
- 并为Qemu提供实体支撑.
- Qemu作为进程运行在宿主机的用户态,它基于KVM及内核的特性
- 为Guest OS模拟出CPU,内存,I/O等硬件,支撑Guest OS在进程中运行.
- 虚拟化管理服务有多种,大部分都基于libvirt实现,libvirt 库是一种实现 Linux 虚拟化功能的 Linux API,它支持各种虚拟机监控程序
1.3. 内核态和用户态
1.3.1. 内核态和用户态概念
- 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态).
- 此时处理器处于特权级最高的(0级)内核代码中执行.
- 当进程处于内核态时,执行的内核代码会使用当前进程的内核栈.
- 每个进程都有自己的内核栈.
- 当进程在执行用户自己的代码时,则称其处于用户运行态(用户态).
- 即此时处理器在特权级最低的(3级)用户代码中运行.
- 当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态.
- 因为中断处理程序将使用当前进程的内核栈.这与处于内核态的进程的状态有些类似.
- 比如说,启动迅雷===>用户态,下载东西写入硬盘===>象征性内核态
https://www.cnblogs.com/KevinGeorge/p/8381149.html
内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, intel cpu提供Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低.
- Linux使用了Ring3级别运行用户态,Ring0作为内核态,Ring1和Ring2是驱动用的.
- Ring3状态不能访问Ring0的地址空间,包括代码和数据.
- Linux进程的4GB地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据.
- 用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态.这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用.
1.3.2. 用户态和内核态之间切换
用户态切换到内核态的三种方式:
-
系统调用,也即是应用程序使用OS提供的接口调用内核功能.而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现.
- 例如x86平台的int 80h和powerrpc的sc等.
- fork(),创建新的进程(系统调用).
-
异常,这是一种被动切换到内核态的方法,当程序在用户态执行时,遇到了未知异常,例如缺页异常.
-
外部中断,也是一种被动切换到内核态的方法,当外设完成用户请求的操作后会发出中断信号,CPU会停止当前进程的调度,转而处理中断处理函数所定义的操作.例如硬盘读写完成===>切换到读写的中断处理,或者网络IO,此时也会切换进入内核态.
- 软中断或硬中断.
当应用程序进程创建并开始运行时,都处于用户态.当需要用到磁盘.网络读写等操作时候调用操作系统提供接口(系统调用)来进入内核态(方法如上).然后执行完毕后返回用户态,在这里,一般的应用程序不能随意操作内核态数据,具有一定的保护作用.
从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,关于它们的具体区别这里不再赘述.关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态的步骤主要包括:
- 从当前进程的描述符中提取其内核栈的ss0及esp0信息.
- 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令.(保护现场)
- 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了.
- 中断执行完成后,切换回用户态并把上面的信息从内核态中弹出(恢复现场),并继续执行原程序调度
1.4. 几个虚拟化软件相关
1.4.1. QEMU
Qemu是一个独立的虚拟化解决方案,运行在用户态,通过intel-VT 或AMD SVM实现全虚拟化,安装qemu的系统,可以直接模拟出另一个完全不同的系统环境,虚拟机的创建通过qemu-image既可完成.QEMU本身可以不依赖于KVM,但是如果有KVM的存在并且硬件(处理器)支持比如Intel VT功能,那么QEMU在对处理器虚拟化这一块可以利用KVM提供的功能来提升性能.
1.4.2. KVM
KVM是集成到Linux内核的Hypervisor是X86架构且硬件支持虚拟化技术(IntelVT或AMD-V)的Linux的全虚拟化解决方案.运行在内核态.它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度,内存管理与硬件设备交互等.准确来说,KVM是Linux kernel的一个模块.可以用命令modprobe去加载KVM模块.加载了模块后,才能进一步通过其他工具创建虚拟机.
但仅有KVM模块是远远不够的,因为用户无法直接控制内核模块去作事情,你还必须有一个运行在用户空间的工具才行.这个用户空间的工具,kvm开发者选择了已经成型的开源虚拟化软件QEMU.
说起来QEMU也是一个虚拟化软件.它的特点是可虚拟不同的CPU.比如说在x86的CPU上可虚拟一个Power的CPU,并可利用它编译出可运行在Power上的程序.KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了.所以你会看到,官方提供的KVM下载有两大部分(qemu和kvm)三个文件(KVM模块,QEMU工具以及二者的合集).也就是说,你可以只升级KVM模块,也可以只升级QEMU工具.这就是KVM和QEMU的关系.
KVM内核模块本身只能提供CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完成的虚拟化技术,这就是下面要说的qemu-kvm.
1.4.3. KVM-QEMU
Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做.kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备.qemu模拟IO设备(网卡,磁盘等),kvm加上qemu之后就能实现真正意义上服务器虚拟化.因为用到了上面两个东西,所以称之为qemu-kvm.
Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能.
- KVM:CPU和内存
- QEMU:网卡,硬盘等其他硬件
- 其他半虚拟化设备
1.4.4. LIBVIRT
1.4.4.1. 缘由
虚拟云实现的三部曲:
虚拟化技术实现–>虚拟机管理–>集群资源管理(云管理).
各种不同的虚拟化技术都提供了基本的管理工具.比如,启动,停用,配置,连接控制台等.
这样在构建云管理的时候就存在两个问题:
- 如果采用混合虚拟技术,上层就需要对不同的虚拟化技术调用不同管理工具,很是麻烦.
- 虚拟化技术发展很迅速,系统虚拟化和容器虚拟化均在发展和演化中.可能有新的虚拟化技术更加符合现在的应用场景,需要迁移过去.这样管理平台就需要大幅改动.
为了适应变化,我们惯用的手段是分层,使之相互透明,在虚拟机和云管理中设置一个抽象管理层.libvirt就是扮演的这个角色.libvirt提供各种API,供上层来管理不同的虚拟机.
1.4.4.2. 具体概念
Libvirt是管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合.
- 它包括一个API库
- 一个守护程序(libvirtd)
- 一个命令行工具(virsh)
libvirt本身构建于一种抽象的概念之上.它为受支持的虚拟机监控程序实现的常用功能提供通用的API.
1.4.4.3. 功能
libvirt的主要目标是为各种虚拟化工具提供一套方便,可靠的编程接口,用一种单一的方式管理多种不同的虚拟化提供方式.其提供以下功能:
- 虚拟机管理:包括不同的领域生命周期操作,比如:启动,停止,暂停,保存,恢复和迁移.支持多种设备类型的热插拔操作,包括:磁盘,网卡,内存和CPU.
- 远程机器支持:只要机器上运行了libvirt daemon,包括远程机器,所有的libvirt功能就都可以访问和使用.支持多种网络远程传输,使用最简单的SSH,不需要额外配置工作.
- 存储管理:任何运行了libvirt daemon的主机都可以用来管理不同类型的存储:创建不同格式的文件镜像(qcow2,vmdk,raw等),挂接NFS共享,列出现有的LVM卷组,创建新的LVM卷组和逻辑卷,对未处理过的磁盘设备分区,挂接iSCSI共享,等等等等.因为libvirt可以远程工作,所有这些都可以通过远程主机使用.
- 网络接口管理:任何运行了libvirt daemon的主机都可以用来管理物理和逻辑的网络接口.
- 虚拟NAT和基于路由的网络:任何运行了libvirt daemon的主机都可以用来管理和创建虚拟网络.
1.4.4.4. 具体结构
无libvert:
有libvert API与相关驱动程序的结构:
为支持各种虚拟机监控程序的可扩展性,libvirt实施一种基于驱动程序的架构,该架构允许一种通用的API以通用方式为大量潜在的虚拟机监控程序提供服务.
libvirt有两种控制方式:
-
管理应用程序和域位于同一节点上.管理应用程序通过libvirt工作,以控制本地域.
-
管理应用程序和域位于不同节点上.该模式使用一种运行于远程节点上,名为libvirtd的特殊守护进程.当在新节点上安装libvirt时该程序会自动启动,且可自动确定本地虚拟机监控程序并为其安装驱动程序.该管理应用程序通过一种通用协议从本地libvirt连接到远程libvirtd.
1.4.5. openstack_kvm_ qemu-kvm及libvirt之间的关系
- KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直接用它的.
- QEMU-KVM就是一个完整的模拟器,它是构建基于KVM上面的,它提供了完整的网络和I/O支持.
- Openstack不会直接控制qemu-kvm,它会用一个叫libvirt的库去间接控制qemu-kvm.
- libvirt提供了跨VM平台的功能,它可以控制除了QEMU之外的模拟器,包括vmware, virtualbox, xen等等.所以为了openstack的跨VM性,所以openstack只会用libvirt而不直接用qemu-kvm.libvirt还提供了一些高级的功能,例如pool/vol管理.
1.5. OpenStack
OpenStack是由美国国家宇航局(NASA)和RackSpace合作开发的旨在为共有云和私有云提供软件的开源项目,其目的在于提供可靠的云部署方案及良好的可扩展性.简单的说OpenStack就是云操作系统,或者说是云管理平平台,自身并不提供云服务,只是提供部署和管理平平台.
1.5.1. OpenStack架构
服务 | 项目名称 | 描述 |
---|---|---|
Identity service | Keystone | 为其他OpenStack服务提供认证和授权服务,为所有的OpenStack服务提供一个端点目录. |
Image service | Glance | 存储和检索虚拟机磁盘镜像,OpenStack计算会在实例部署时使用此服务. |
Compute | Nova | 在OpenStack环境中计算实例的生命周期管理.按需响应包括生成,调度,回收虚拟机等操作. |
Networking | Neutron | 确保为其它OpenStack服务提供网络连接即服务(上面的Nova),比如OpenStack计算.为用户提供API定义网络和使用.基于插件的架构其支持众多的网络提供商和技术. |
Block Storage | Cinder | 为运行实例而提供的持久性块存储.它的可插拔驱动架构的功能有助于创建和管理块存储设备. |
Object Storage | Swift | 通过一个 RESTful,基于HTTP的应用程序接口存储和任意检索的非结构化数据对象.它拥有高容错机制,基于数据复制和可扩展架构.它的实现并像是一个文件服务器需要挂载目录.在此种方式下,它写入对象和文件到多个硬盘中,以确保数据是在集群内跨服务器的多份复制. |
Telemetry | Ceilometer | 为OpenStack云的计费,基准,扩展性以及统计等目的提供监测和计量. |
高层次服务 | ||
Orchestration | Heat | Orchestration服务支持多样化的综合的云应用,通过调用OpenStack-native REST API和CloudFormation-compatible Query API,支持:term:HOT <Heat Orchestration Template (HOT)> 格式模板或者AWS CloudFormation格式模板 |
Dashboard | Horizon | 提供了一个基于web的自服务门户,与OpenStack底层服务交互,诸如启动一个实例,分配IP地址以及配置访问控制. |
在VM基础上的3个核心是
- Nova:计算服务
- Ciinder:云存储
- Neutron:云网络
1.5.2. 块存储_对象存储和文件存储
- 块存储,典型代表–SAN.对于用户来说,SAN好比是一块大磁盘,上面无文件系统,用户可以根据需要随意将SAN格式化成想要的文件系统来使用.SAN在网络中通过iSCSI(IPSAN)协议连接,属block及存储,但可扩展性较差.
- 文件存储,典型代表–NAS.对于用户来说,NAS好比是一个共享文件夹,文件系统已经存在,用户可以直接将自己的数据存放在NAS上.NAS以文件为传输协议,开销很大,不利于在高性能集群中使用.
- 对象存储,就是每个数据对应着一个唯一的id,在面向对象存储中,不再有类似文件系统的目录层级结构,完全扁平化存储,即可以根据对象的id直接定位到数据的位置,这一点类似SAN,而每个数据对象即包含元数据又包括存储数据,含有文件的概念,这一点类似NAS.
- 除此之外,用户不必关系数据对象的安全性,数据恢复,自动负载平衡等等问题,这些均由对象存储系统自身完成.而且,面向对象存储还解决了SAN面临的有限扩充和NAS传输性能开销大问题,能够实现海量数据存储.