虚拟化
引言——美国环境保护署 (EPA) 报告的一组有趣的统计数据发现,实际上服务器只有5%的时间是在工作的。在其他时间,服务器都处于“休眠”状态。
1、虚拟化概念
虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
虚拟化前:
每台主机一个操作系统
软件硬件紧密地结合
在同一主机上运行多个应用程序通常会遭遇沖突
系统的资源利用率低
硬件成本高昂而且不够灵活
虚拟化后:
打破了操作系统和硬件的互相倚賴
通过封装到虚拟机的技术,管理操作系统和应用程序为单一的个体
強大的安全和故障隔离
虚拟机是独立于硬件的,它们能在任何硬件上运行
虚拟化对象:
CPU、内存、各种IO设备
资源管理软件层:把所有硬件资源的使用虚拟化成OS:system call(系统调用),每一个应用程序运行时,需要和硬件打交道,只需要向内核发起系统调用即可
OS: Process monitor(进程监控器),OS负责协调每一个运行在其上进程对于资源的申请
例:
1> 线性地址 → 物理地址(mmu)
2> 每一个IO设备都会注册一个端口(相当于唯一ID);注册使用中断号
IO端口是让CPU实现数据交换的设备;中断是让IO设备通知CPU,它有一个紧急事件需要处理
CPU利用可编程中断控制器,让每一个IO设备注册使用一个中断线上的中断设备号
当IO设备有信号接入时,必须向中断控制器发起一个中断请求(中断控制器上有针脚,电压感应),CPU就马上能意识到,并通知内核有中断产生,这时候内核必须完成模式切换,内核指挥CPU将信号读入内存缓冲区
2、虚拟化分类
如果把X86平台的CPU、内存和外设作为资源,那对应的虚拟化技术就是平台虚拟化(Platform Virtualization),在同一个X86平台上面,可以虚拟多个X86平台,每个平台可以运行自己独立完整的操作系统。
QEMU,KVM,XEN Server,ESXI,Hyper-V ......
如果把操作系统及其提供的系统调用作为资源,那虚拟化就表现为操作系统虚拟化,例如Linux容器虚拟化技术,就是在同一个Linux操作系统之上,虚拟出多个同样的操作系统,每个应用程序认为自己运行在一个独立的OS。
LXC、Docker ......
X86平台指令集权限划分:
Ring 0: 操作系统使用
Ring 1-2:驱动程序使用
Ring 3:应用程序使用
3、虚拟化管理程序 Hypervison(VMM)
1> 定义:一种运行在物理机和虚拟机操作系统之间的中间软件层,可以容许多个操作系统和应用共享硬件,也称为VMM(Virtual Machine Monitor),即虚拟机监视器。
2> Hypervisor类型1:半虚拟化(para virualization)
对操作系统(VM)的内核进行修改,将运行在Ring0上的指令转为调用Hypervison。GuestOS的内核了解自己工作在虚拟(hypercall)之上
3> Hypervisor类型2:全虚拟化/辅助虚拟化技术(Full virtualization)
对CPU指令集进行改造,Inter VT-x/AMD-V,客户操作系统可以直接使用Ring 0 而无需修改
CPU不支持硬件虚拟化技术,模拟特权指令:模拟
CPU支持硬件虚拟化技术,VMM运行 Ring 1,而GuestOS运行在 Ring 0
4> Hypervisor类型3:软件全虚拟化
模拟CPU让VM使用,即软件全虚拟化 QEMU,效率最低
5> 操作系统虚拟化(轻量级)
允许操作系统内核拥有彼此隔离和分割的多用户空间实例instance,这些实例也称之为容器。基于Linux内核中的namespace、cgroup实现,例如 LXC、Docker。
6> Hypervisor 比较
QEMU:
软件模拟虚拟化、可以模拟多种硬件,包括X86架构处理器、AMD64架构处理器、ARM、SPARC 与 PowerPC 架构等。效率低,一般用于研究测试场景。
KVM:
KVM(kernel-based virtual machine)是x86架构下硬件辅助的全虚拟化的首选解决方案。KVM需要经过修改的QEMU软件(qemu-kvm)来实现虚拟机的管理KVM就是内核的一个模块,用户空间通过QEMU模拟硬件提供给虚拟机使用,一台虚拟机就是一个普通的Linux进程,虚拟机中的VCPU就是该进程中的线程。
Libvirt:
libvirt是一套免费、开源的支持Linux下主流虚拟化管理程序的C函数库,其旨在为包括KVM在内的各种虚拟化管理程序提供一套方便、可靠的编程接口。当前主流Linux平台上默认的虚拟化管理工具virt-manager,virsh等都是基于libvirt开发。
4、虚拟化原理
1> CPU虚拟化
利用了和原始操作系统类似的机制——定时中断,在中断触发时陷入VMM,从而根据调度机制进行调度。分配全量的CPU时间片。
以x86架构为例:
X86的ICA中有19条敏感指令不是特权指令,因此X86无法使用经典的虚拟化技术完虚拟化。
于是乎:
(1)半虚拟化:修改guest的OM使其运行于Ring0上。问题:对闭源系统是一种阻碍。
(2)全虚拟化:修改VMM,使得不敏感指令同样可以中断陷入VMM。
(3)硬件辅助虚拟化:对CPU微指令集的修改,使非root Ring0-3同样可使用CPU,而VMM只起监控作用。
2> 内存虚拟化
问题1:内存空间地址不唯一
问题2:内存连续性
解决:内存映射表
内存虚拟化:把物理机的真实内存统一管理,包装成多份虚拟的内存给若干虚拟机使用
3> I/O虚拟化
问题:多个客户机如何实现使用有限的外设资源?
VMM必须通过I/O虚拟化的方式来复用有限的外设资源。
现实中外设资源是有限的,为了满足多个客户机操作的需求,VMM必须通过I/O虚拟化的形式来复用有限的外设资源。
VMM截获客户操作系统对设备的访问请求,然后通过软件的方式来模拟真实设备的效果:
两个阶段:发现,使用
前端设备驱动将数据通过VMM提供的接口转发到后端驱动;
后端驱动对VM的数据进行分时分通道处理
4> 存储虚拟化
存储虚拟化是在存储设备上加了一个逻辑卷,通过逻辑层访问存储资源。对管理员来说,可以方便的调整资源,提高存储利用率;对终端用户来说,集中的存储设备可提供更好的性能和易用性。
存储虚拟化的实现方式:
(1)裸金属+逻辑卷
(2)存储设备虚拟化
(3)主机存储虚拟化+文件系统
5> 网络虚拟化:
问题1:一个服务器一个网络端口对应多个虚拟机的多个服务
问题2:虚拟机动态迁移时网络端口随之迁移
大二层网络请求、IO透传技术
服务器虚拟化: