虚拟化与云计算中提到云计算最重要的就是服务器虚拟化和调度(Scheduler),本文将简单介绍服务器虚拟化原理。
服务器虚拟化是指将一台计算机(称为物理机、物理服务器)通过hypervisor虚拟为多台逻辑计算机的技术,这些逻辑计算机又被称为虚拟机(VM,Virtual Machine),每台虚拟机都拥有独立的“硬件”。虽然你可以在虚拟机的操作系统中看到这些“硬件”,不过它们并不是真实存在的,而是通过hypervisor将物理机的硬件虚拟而来。虚拟机运行时,虚拟机硬件的工作实际是由物理机的硬件完成的。
hypervisor又被称为虚拟机监视器(VMM,Virtual Machine Monitor),是实现物理机虚拟为虚拟机的操作系统或者软件,它为虚拟机提供虚拟的硬件资源,负责管理和分配这些资源,并确保上层虚拟机之间的相互隔离。hypervisor有两种类型:一种是操作系统,直接安装在物理机上;另一种是应用程序,需要先在物理机上安装操作系统,再在操作系统中安装hypervisor。
服务器虚拟化的分类
服务器虚拟化的有多种划分方式,可以根据虚拟化架构划分为裸金属/寄居,根据虚拟化层次硬件辅助虚拟化/软件辅助虚拟化,根据虚拟化平台划分为全虚拟化/半虚拟化。
裸金属/寄居
未虚拟化的x86服务器架构,自下而上是物理硬件(Hardware)、操作系统(OS),应用程序(APP)。这和我们个人计算机一样,就是在计算机上装操作系统,再在操作系统里面安装应用程序。
未虚拟化的x86服务器
裸金属
裸金属(bare-metal)架构也叫bare-metal hypervisor、Ⅰ型,最有代表性就是VMware ESX(i)。
VMware ESXi
ESXi是VMware的企业级服务器虚拟化技术,本身是一个操作系统,直接安装的物理服务器上。使用ESXi需要先在物理服务器上安装ESXi,然后在ESXi中创建各种虚拟硬件(相应虚拟硬件的集合,不包括操作系统,也可以称为虚拟机),再在虚拟机上安装操作系统,最后才能在这些操作系统中安装应用程序。
Tips:早期VMware的企业级服务器虚拟化版本称为ESX,后来升级版本称为ESXi。
寄居
寄居(hosted)架构也叫hosted hypervisors、Ⅱ型,代表产品VMware workstation和VirtualBox。
Windows中使用VMware workstation实现服务器虚拟化
VMware workstation和VirtualBox通常用作个人学习、测试,与寄居架构的VMware ESXi最明显的区别在于,ESXi是操作系统,直接安装在物理硬件之上,而VMware workstation则是软件,需要安装在操作系统(一般是Windows,也支持Linux)中。
以Windows中安装VMware workstation为例,先在计算机上安装Windows,再在Windows上安装workstations,再在workstations中创建虚拟机,最后在虚拟机中安装操作系统,在操作系统中安装软件。
判断虚拟化类型是裸金属还是寄居架构,取决于虚拟化层,也就是hypervisor所处的位置。寄居架构将虚拟化层(hypervisor)以一个应用程序的方式安装运行于操作系统之上,支持最为广泛的各种硬件配置(只要HOST OS支持该硬件即可)。裸金属架构将虚拟化层(hypervisor)直接安装到干净的x86服务器上,裸金属架构相对于寄居架构效率更高(少了Host OS这一层),且具有更好的可扩展性、健壮性和性能。
企业级服务器虚拟化都是裸金属架构(效率更高),像主流的企业级服务器虚拟化ESXi、KVM、Xen、Hyper-v都是裸金属架构。
*有点特殊的裸金属KVM
KVM关于裸金属/寄居的划分有点模糊。
KVM
部署KVM,首先需要在物理服务器上安装Linux系统,再在Linux中“安装KVM”。通常所说的KVM实际上是KVM和qemu两种技术的结合,qemu本身是一种完整的寄居架构软件,采用二进制翻译的方式虚拟化CPU,KVM则采用效率更高的硬件辅助虚拟化CPU。由于KVM只能虚拟化CPU、内存,其它硬件(网卡、硬盘)的虚拟化则是由qemu来负责。
qemu是寄居架构,通俗来讲就是qemu是个工作在Linux上的软件。而KVM则相当于“给Linux内核打了一个补丁”,将Linux部分内核转换为hypervisor,Linux内核自然属于操作系统,这样看来KVM的hypervisor既有寄居(qemu)又有裸金属(kvm),是一种比较特殊的裸金属。
Tips:以CentOS系统部署KVM为例,仅简单体验KVM可以通过yum安装。因为我们习惯了yum安装各种软件,这样看起来KVM是yum安装的“软件”,应该属于寄居架构,实际上多把KVM划为裸金属架构。因为像升级操作系统,可以通过yum(yum install kernel),但升级操作系统不能认为是通过yum安装kernel这个软件,同理也不应该认为部署KVM是在操作系统中安装了KVM这个软件。
参考文章:https://www.cnblogs.com/echo1937/p/7138294.html
部署KVM:https://www.cnblogs.com/yogurtwu/p/9799526.html
*有点特殊的裸金属的Hyper-v和Xen
把他们放在一起是因为他们都有一个非常相似的概念,Hyper-v叫做父分区、Xen叫做Domain 0 。Hyper-v是Windows Server的一个功能,Xen则是在原Linux上安装新的Linux内核。没有开启Hyper-v的Windows Server和没有部署Xen的Linux,就是普通的x86服务器结构。
部署虚拟化之后,两者非常相似。同样是物理硬件位于最底层,hypervisor则分别是Xen和Hyper-v。对于Xen来说原来的Linux将以新的Linux内核运行在Domain 0,对于Hyper-v来说,Windows Server运行在父分区,他们都相当各自的于第一台虚拟机。
部署Hyper-v:https://www.cnblogs.com/yogurtwu/p/9791845.html
部署Xen:https://www.cnblogs.com/yogurtwu/p/10255530.html
hypervisor为虚拟机提供虚拟的硬件资源,负责管理和分配这些资源,但是并不一定能够直接控制物理硬件。例如Xen和hyper-v,一般结构图将hypervisor位于最底层,但是最终直接控制物理硬件的驱动程序还是安装在Domain 0、父分区中的操作系统上。
Tips:KVM虽然和Xen一样是安装在Linux中,但是KVM没有Domain 0的概念,在Linux部署KVM后,其hypervisor相当于Linux的一部分,可以说hypervisor和Linux是在同一层,而Xen则是hypervisor位于最底层,原来的Linux相当于一台虚拟机,原来的Linux(Domain0)和其它虚拟化(Domain U)位于同一层。
Xen原理:http://www.cnblogs.com/sddai/p/5931201.html
硬件辅助虚拟化/软件辅助虚拟化
通常根据CPU虚拟化的方式将服务器虚拟化技术划分为硬件辅助虚拟化和软件辅助虚拟化,软件辅助虚拟化是通过hypervisor实现CPU虚拟化,硬件辅助虚拟化则是借助硬件(需要CPU、芯片组、BIOS、hypervisor都支持)实现CPU虚拟化。常见的硬件辅助虚拟化技术:intel vt-x、AMD-v,它们和各自生产的CPU绑定,intel CPU只能用intel vt-x,AMD CPU只能用AMD-v。
因为硬件辅助虚拟化效率更高,现在主流的企业级服务器虚拟化都是采用硬件辅助虚拟化技术(intel vt-x或AMD-v),KVM和Hyper-v仅支持硬件辅助虚拟化(不支持软件辅助虚拟化),ESXi、Xen和VMware workstation是两者都支持。
Tips:现在不单是CPU有硬件辅助虚拟化,网卡和芯片组也有硬件辅助虚拟化。比如以Intel VT虚拟化技术就包括分别针对处理器、芯片组、网络的IntelVT-x、IntelVT-d和IntelVT-c技术,以及显卡虚拟化GVT,不过服务器虚拟化划分标准还是根据CPU虚拟化的方式决定的。
全虚拟化/半(准)虚拟化
全虚拟化和半虚拟化,直观的体现就是半虚拟化使用定制的Gust OS,全虚拟化则不必,使用普通适用于x86的的操作系统即可,具体原因见下文。
Tips:在主流的4种服务器虚拟化技术中,Xen全半虚拟化都支持。半虚拟化使用定制的Gust OS,这给维护带来极大不便,但是性能比较好。全虚拟化,最开始是使用软件辅助虚拟化,虚拟化的损耗较大,性能较低。随着技术发展,通过硬件辅助虚拟化实现的全虚拟化性能已经极佳了。
虚拟化原理简介
用户/内核空间
Windows和Linux都将内存分为内核空间和用户空间,操作系统内核代码运行在内核空间,应用程序代码运行在用户空间。
特权级
Tips:CPU清除内存数据、设置时钟等指令是非常危险的,如果用错了会导致系统崩溃。通过特权级这一机制,区分内核代码和应用程序代码权限,保证操作系统正常运行。
指令类型
未虚拟化时,可以将CPU的指令分为特权指令和非特权指令。
特权指令
虚拟化后,CPU的指令分为特权指令,敏感指令,普通指令。
Tips:敏感指令=特权指令+部分非特权指令,也就是说特权指令一定是敏感指令。
敏感指令
1.企图访问或修改虚拟机模式或机器状态的指令。
2.企图访问或修改敏感寄存器或存储单元,如时钟寄存器、中断寄存器等的指令。
3.企图访问存储保护系统或内存、地址分配系统的指令。
4.所有I/O指令。
服务器虚拟化的关键技术
优先级压缩
x86服务器虚拟化借鉴了其他平台的虚拟化技术,将hypervisor(也叫做VMM)运行在ring0,Gust OS运行在ring1(也有的运行在ring3),应用程序运行在ring3。
陷入和仿真 (trap-and-emulate)
由于Gust OS运行在ring1,不能执行特权指令,当执行特权指令的时候会产生异常,将异常自动交给hypervisor(ring 0)来处理,此时hypervisor会将这些特权指令模拟运行后,返回Gust OS。
Tips:但是x86服务器比较特殊,部分敏感指令是非特权指令,在ring 1运行不会产生异常,便不会被hypervisor捕获。有两种处理方案,二进制翻译和hypercall,也是现在主流的软件辅助虚拟化技术。
*二进制翻译
属于非特权指令的敏感指令也需要在ring 0运行,但是Gust OS运行在ring1,这部分指令就无法通过陷入和仿真实现,VMware后来提供了一种二进制翻译技术来解决这个问题。
二进制翻译(Binary Translation)是一种直接翻译可执行二进制程序的技术,能够把一种处理器上的二进制程序翻译到另外一种处理器上执行。具体在服务器虚拟化中就是将需要运用非特权指令的敏感指令的二进制程序代码翻译成“虚拟特权指令”的二进制代码或者是翻译成运行在核心态(ring 0)中的特权指令二进制代码,从而强制触发异常。
*hypercall
对于这部分需要ring0运行的非特权指令,还有一种处理方式就是使用hypercall(超级调用)。通过修改Gust OS内核,将Gust OS内核中需要使用敏感指令的代码修改为主动调用hypervisor模拟执行,然后hypervisor将运行结果返回Gust OS。
这种方式比陷入模拟+二进制翻译效率高,但是由于需要修改Gust OS内核,所以一般都是使用定制的Gust OS,维护不太方便。
Tips:陷入和模拟,二进制翻译这种不需要修改Gust OS的方式,称为全虚拟化,hypercall需要修改Gust OS(或使用定制的OS),称为半虚拟化。主流服务器虚拟化中,Xen两种都支持,kvm、hyper-v、esxi均为全虚拟化。
硬件辅助虚拟化
二进制翻译、hypercall处理敏感指令的方式都是依靠软件来实现(所以叫做软件虚拟化),各有局限性,intel在2005年开始提供硬件辅助虚拟化(intel VT-x)解决敏感指令虚拟化这一难题。
intel VT-x提供了2 个运行环境:根(Root)环境和非根(Non-root)环境。根环境专门为VMM准备,很像原来没有VT-x 的x86,只是多了对VT-x 支持的几条指令。非根环境作为一个受限环境用来运行多个虚拟机。
如上图所示,根操作模式与非根操作模式都有相应的ring 0至ring 3。VMM运行在根模式的ring 0,GuestOS的内核运行在非根模式的ring 0,GuestOS的应用程序运行在非根模式的ring 3。运行环境之间相互转化,从根环境到非根环境叫VMEntry;从非根环境到根环境叫VMExit。VT-x定义了VMEntry操作,使CPU由根模式切换到非根模式,运行客户机操作系统指令。若在非根模式执行了敏感指令或发生了中断等,会执行VMExit操作,切换回根模式运行VMM。
根模式与非根模式之问的相互转换是通过VMX操作实现的。VMM 可以通过VMXON 和VMXOFF打开或关闭VT-x。如下图所示:
VMX操作模式流程:
1)、VMM执行VMXON指令进入VMX操作模式。
2)、VMM可执行VMLAUNCH指令或VMRESUME指令产生VM Entry操作,进入到Guest OS,此时CPU处于非根模式。
3)、Guest OS执行特权指令等情况导致VMExit的发生,此时将陷入VMM,CPU切换为根模式。VMM根据VMExit的原因作出相应处理,处理完成后将转到2),继续运行GuestOS。
4)、VMM可决定是否退出VMX操作模式,通过执行VMXOFF指令来完成。
硬件辅助虚拟化部分节选自:https://www.cnblogs.com/echo1937/p/7218201.html
软件辅助虚拟化参考文章:https://www.cnblogs.com/echo1937/p/7222606.html,https://www.cnblogs.com/echo1937/p/7227385.html
硬件服务虚拟化参考文章:https://www.cnblogs.com/echo1937/p/7218201.html,
参考文章: https://baijiahao.baidu.com/s?id=1588195141957451187&wfr=spider&for=pc
内存、I/O、网络虚拟化
参考:https://blog.csdn.net/sdulibh/article/details/38397377,涉及EPT、IOMMU等技术。
小结
当前(2018)服务器虚拟化类型的概念已经很淡了,主流的企业级服务器虚拟化技术(ESXi、KVM、Hyper-v、Xen)都是裸金属架构,虽然Xen和ESXi支持软件辅助虚拟化,但一般情况下都会使用硬件虚拟化,至于KVM和Hyper-v更是只支持硬件虚拟化。仅有Xen还支持半虚拟化,但是Xen是使用率现在已经很低了。
各厂商服务器虚拟化类型已经趋于一致(裸金属、硬件辅助、全虚拟化),所以在类型方面也不必过多纠结,所以在选择服务器虚拟化技术的时候应该更多关注各种服务器虚拟化技术的性能、稳定性、成熟性等等。
附一张2017年5月企业级服务器虚拟化市场占有率的图片,VMware使用的肯定是ESXi,微软则是Hyper-v,华为、新华三都是基于开源的KVM二次开发的产品。
参考文章:http://virtual.51cto.com/art/201803/569228.htm
参考文章:https://blog.csdn.net/flyforfreedom2008/article/details/45113635
参考文章:http://www.ctiforum.com/forum/2012/02/forum12_0228.htm?2