第一章和第二章
第一章 虚拟化和云计算
Saas(软件即服务):将已经部署好的软件作为一种服务来提供,比如:Google Docs, Google Apps
Paas(平台即服务):将开发环境作为一种服务来提供。
Iaas(基础设施即服务):将多台服务器组成的“云端”基础设施作为计量服务提供给客户。
软件虚拟化:
利用纯软件的方法在现有的物理平台上(往往并不支持硬件虚拟化)实现对物理平台访问的截获和模拟。
常见的软件虚拟机如QEMU,它是通过纯软件来仿真x86平台处理器的取指、解码和执行,客户机的指令并不在物理 平台上直接执行。
由于所有指令都是软件模拟的,因此性能往往比较差,但是可以在同一平台上模拟不同架构平台的虚拟机。
VMware的软件虚拟化使用了动态二进制翻译技术。虚拟机监控机(VMM)在可控制的范围内,允许客户机的指令在物理平台上直接运行。但是,客户机指令在运行前会被虚拟机监控机扫描,其中突破虚拟机监控机限制的指令会被动态替换为可以在物理平台上直接运行的安全指令,或者替换为对虚拟机监控机的软件调用。优点是比纯软件模拟性能有大幅提升,缺点是失去了跨平台虚拟化的能力。
硬件虚拟化:
物理平台本身提供对特殊指令的截获和重定向的支持;甚至新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化,从而提升性能。
以x86平台的虚拟化为例,支持虚拟技术的x86 CPU 带有特别优化过的指令集来控制虚拟过程,通过这些指令集,VMM很容易将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给VMM处理。VMM可以将客户机在受限模式下对一些特殊资源的访问完全由硬件重定向到VMM指定的虚拟资源。整个过程不需要暂停客户机的运行和VMM软件的参与。
由于虚拟化硬件可提供全新的架构,支持操作系统直接在其上运行,无需进行二进制转码,减少了相关的性能开销,极大简化了VMM的设计,进而使得VMM能够按照通用标准进行编写,性能更加强大。
准虚拟化:
改动客户机操作系统,使它以为自己运行在虚拟环境下,能够同虚拟机监控机协同工作。所以,准虚拟化需要修改客户机的操作系统的源代码来实现主动通知。
Xen是准虚拟化的一个例子,它适用于Linux这样的开源操作系统,而不适合于Windows这样的闭源操作系统。
全虚拟化:
支持运行任何理论上可在真实物理平台上运行的操作系统。不需要对客户机操作系统进行任何修改。
KVM
KVM的开发人员并不是从底层开始新写一个Hypervisor,而是选择了基于Linux Kernel,通过加载新的模块而使Linux Kernel变身成为一个Hypervisor.
KVM目前设计为通过可加载的内核模块,支持广泛的客户机操作系统,包括Windows.
在KVM架构中,虚拟机实现为常规的Linux进程,由标准Linux调度程序进行调度。事实上,每个虚拟CPU实现为一个常规的Linux进程。这使得KVM可以享受Linux内核的所有功能。
KVM本身不执行任何模拟,需要用户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。这个应用程序(注:上述的“用户空间程序”)就是大名鼎鼎的QEMU.
REHL6.x系统中的一个KVM客户机可以支持160个虚拟CPU和多达2TB的内存,KVM宿主机支持4096个CPU核心和多达64TB的内存。
第二章 KVM原理简介
操作系统内核设计分为:微内核和单内核。
单内核指的是整个内核从整体上作为一个单独的大过程来实现,并且同时运行在一个单独的地址空间内。所有的内核服务都在这样一个大的内核空间运行,内核之间的通信可以简单地实现为函数调用。
对于微内核来说,内核的功能被划分为多个独立的过程,每一个过程叫做一个服务器。多个服务器都运行在自己的地址空间,只有少量核心的服务器运行在特权模式下,服务器之间的通信采用了进程间通信机制。独立的服务器进程提高系统的健壮性,但是进程间通信由于涉及内核空间和用户空间的上下文切换,其开销比函数调用大得多。
Linux采用实用主义的设计:Linux内核被设计成单内核以满足性能要求;但同时,Linux内核还具有模块化设计和动态装载内核模块的能力。除了诸如进程切换、内存管理等核心内核功能,将大部分内核功能作为单独的内核模块设计并实现。这些内核模块编译好后以单独的二进制文件的形式存在,内核在运行过程中,按照需求,动态地加载并链接进入内核空间运行。不使用的模块还可以在运行过程中动态卸载。这样的设计,既保证了内核的性能,也改进了传统单内核设计的灵活性。
KVM就是以内核模块的形式存在,为Linux内核增加了虚拟化的功能。
从虚拟机的基本架构来区分,分为2种:类型一和类型二。
类型一:
系统上电之后首先加载运行虚拟机监控程序,而传统的操作系统则是运行在其创建的虚拟机中。
类型一的虚拟机监控程序,可以视为一个特别为虚拟机而优化裁剪的操作系统内核。
著名的开源虚拟化软件Xen、商业软件VMware ESX/ESXi 和微软的Hyper-V就是类型一的代表。
类型二:
在系统上电之后仍然运行一般意义的操作系统(也就是俗称的宿主机操作系统),虚拟机监控程序作为特殊的应用程序,可以是为操作系统功能的扩展。
对于类型二虚拟机来说,最大的优势在于可以充分利用现有的操作系统;但也会受到宿主机操作系统的一些限制。
KVM、VMware Workstation、VirtualBox就是属于类型二虚拟机。
KVM模块
P38-39
KVM模块的主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
KVM仅支持硬件虚拟化。
以KVM在Intel公司的CPU上运行为例:
1. 在内核被加载的时候,KVM模块会先初始化内部的数据结构;
2. 做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关;
3. 通过执行VMXON指令将宿主操作系统(包括KVM模块本身)置于虚拟化模式的根模式;
4. 最后,KVM模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的命令;
5. 接下来,虚拟机的创建和运行将是一个用户空间应用程序(QEMU)和KVM模块相互配合的过程。
KVM模块和用户空间QEMU的通信接口主要是一系列针对特殊设备文件的IOCTL调用。
KVM模块加载之初,只存在 /dev/kvm 文件,而针对该文件的最重要的IOCTL调用就是“创建虚拟机”,其可以被理解为KVM为了某个特定的虚拟客户机(用户空间程序创建并初始化)创建对应的内核数据结构。同时,KVM还会返回一个文件句柄来代表所创建的虚拟机。
针对虚拟处理器最重要的IOCTL调用就是“执行虚拟处理器”。通过它,用户空间准备好的虚拟机在KVM模块的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都会被处理器捕捉到,处理器在保存现场之后,自动切换到根模式,由KVM决定如何进一步处理(要么由KVM模块直接处理,要么返回用户空间交由用户空间程序处理)。
除了处理器的虚拟化,内存虚拟化也是由KVM模块实现的。实际上,这一部分是一个虚拟机实现代码中代码量最大、实现最复杂的部分(至少在硬件支持二维地址翻译之前是这样的)。
处理器对设备的访问主要是通过IO指令和MMIO,其中IO指令会被处理器直接截获,MMIO会通过配置内存虚拟化来捕捉。但是,外设的模拟一般并不由KVM模块负责。一般来说,只有对性能要求比较高的虚拟设备才会由KVM内核模块来直接负责,比如虚拟中断控制器和虚拟时钟。大部分输入输出设备还是会交给用户态程序QEMU负责。
QEMU设备模型
QEMU本身并不是KVM的一部分,其自身就是一个著名的开源虚拟机软件。它是一个纯软件的实现,所以性能低下。
为了简化开发和代码重用,KVM在QEMU的基础上进行了修改。在虚拟机运行期间,QEMU会通过KVM模块提供的系统调用计入内核,由KVM模块负责将虚拟机置于处理器的特殊模式运行。遇到虚拟机进行输入输出操作,KVM模块会从上次的系统调用出口处返回QEMU,有QEMU来负责解析和模拟这些设备。
http://blog.csdn.net/nirendao/article/details/52853103