服务器虚拟化技术手机app虚拟ip地址


虚拟化与云计算中提到云计算最重要的就是服务器虚拟化和调度(Scheduler),本文将简单介绍服务器虚拟化原理。

服务器虚拟化是指将一台计算机(称为物理机、物理服务器)通过hypervisor虚拟为多台逻辑计算机的技术,这些逻辑计算机又被称为虚拟机(VM,VirtualMachine),每台虚拟机都拥有独立的“硬件”。虽然你可以在虚拟机的操作系统中看到这些“硬件”,不过它们并不是真实存在的,而是通过hypervisor将物理机的硬件虚拟而来。虚拟机运行时,虚拟机硬件的工作实际是由物理机的硬件完成的。

hypervisor又被称为虚拟机监视器(VMM,VirtualMachineMonitor),是实现物理机虚拟为虚拟机的操作系统或者软件,它为虚拟机提供虚拟的硬件资源,负责管理和分配这些资源,并确保上层虚拟机之间的相互隔离。hypervisor有两种类型:一种是操作系统,直接安装在物理机上;另一种是应用程序,需要先在物理机上安装操作系统,再在操作系统中安装hypervisor。

服务器虚拟化的有多种划分方式,可以根据虚拟化架构划分为裸金属/寄居,根据虚拟化层次硬件辅助虚拟化/软件辅助虚拟化,根据虚拟化平台划分为全虚拟化/半虚拟化。

未虚拟化的x86服务器架构,自下而上是物理硬件(Hardware)、操作系统(OS),应用程序(APP)。这和我们个人计算机一样,就是在计算机上装操作系统,再在操作系统里面安装应用程序。

裸金属(bare-metal)架构也叫bare-metalhypervisor、Ⅰ型,最有代表性就是VMwareESX(i)。

ESXi是VMware的企业级服务器虚拟化技术,本身是一个操作系统,直接安装的物理服务器上。使用ESXi需要先在物理服务器上安装ESXi,然后在ESXi中创建各种虚拟硬件(相应虚拟硬件的集合,不包括操作系统,也可以称为虚拟机),再在虚拟机上安装操作系统,最后才能在这些操作系统中安装应用程序。

Tips:早期VMware的企业级服务器虚拟化版本称为ESX,后来升级版本称为ESXi。

寄居(hosted)架构也叫hostedhypervisors、Ⅱ型,代表产品VMwareworkstation和VirtualBox。

VMwareworkstation和VirtualBox通常用作个人学习、测试,与寄居架构的VMwareESXi最明显的区别在于,ESXi是操作系统,直接安装在物理硬件之上,而VMwareworkstation则是软件,需要安装在操作系统(一般是Windows,也支持Linux)中。

以Windows中安装VMwareworkstation为例,先在计算机上安装Windows,再在Windows上安装workstations,再在workstations中创建虚拟机,最后在虚拟机中安装操作系统,在操作系统中安装软件。

判断虚拟化类型是裸金属还是寄居架构,取决于虚拟化层,也就是hypervisor所处的位置。寄居架构将虚拟化层(hypervisor)以一个应用程序的方式安装运行于操作系统之上,支持最为广泛的各种硬件配置(只要HOSTOS支持该硬件即可)。裸金属架构将虚拟化层(hypervisor)直接安装到干净的x86服务器上,裸金属架构相对于寄居架构效率更高(少了HostOS这一层),且具有更好的可扩展性、健壮性和性能。

企业级服务器虚拟化都是裸金属架构(效率更高),像主流的企业级服务器虚拟化ESXi、KVM、Xen、Hyper-v都是裸金属架构。

部署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(yuminstallkernel),但升级操作系统不能认为是通过yum安装kernel这个软件,同理也不应该认为部署KVM是在操作系统中安装了KVM这个软件。

把他们放在一起是因为他们都有一个非常相似的概念,Hyper-v叫做父分区、Xen叫做Domain0。Hyper-v是WindowsServer的一个功能,Xen则是在原Linux上安装新的Linux内核。没有开启Hyper-v的WindowsServer和没有部署Xen的Linux,就是普通的x86服务器结构。

部署虚拟化之后,两者非常相似。同样是物理硬件位于最底层,hypervisor则分别是Xen和Hyper-v。对于Xen来说原来的Linux将以新的Linux内核运行在Domain0,对于Hyper-v来说,WindowsServer运行在父分区,他们都相当各自的于第一台虚拟机。

hypervisor为虚拟机提供虚拟的硬件资源,负责管理和分配这些资源,但是并不一定能够直接控制物理硬件。例如Xen和hyper-v,一般结构图将hypervisor位于最底层,但是最终直接控制物理硬件的驱动程序还是安装在Domain0、父分区中的操作系统上。

Tips:KVM虽然和Xen一样是安装在Linux中,但是KVM没有Domain0的概念,在Linux部署KVM后,其hypervisor相当于Linux的一部分,可以说hypervisor和Linux是在同一层,而Xen则是hypervisor位于最底层,原来的Linux相当于一台虚拟机,原来的Linux(Domain0)和其它虚拟化(DomainU)位于同一层。

通常根据CPU虚拟化的方式将服务器虚拟化技术划分为硬件辅助虚拟化和软件辅助虚拟化,软件辅助虚拟化是通过hypervisor实现CPU虚拟化,硬件辅助虚拟化则是借助硬件(需要CPU、芯片组、BIOS、hypervisor都支持)实现CPU虚拟化。常见的硬件辅助虚拟化技术:intelvt-x、AMD-v,它们和各自生产的CPU绑定,intelCPU只能用intelvt-x,AMDCPU只能用AMD-v。

因为硬件辅助虚拟化效率更高,现在主流的企业级服务器虚拟化都是采用硬件辅助虚拟化技术(intelvt-x或AMD-v),KVM和Hyper-v仅支持硬件辅助虚拟化(不支持软件辅助虚拟化),ESXi、Xen和VMwareworkstation是两者都支持。

Tips:现在不单是CPU有硬件辅助虚拟化,网卡和芯片组也有硬件辅助虚拟化。比如以IntelVT虚拟化技术就包括分别针对处理器、芯片组、网络的IntelVT-x、IntelVT-d和IntelVT-c技术,以及显卡虚拟化GVT,不过服务器虚拟化划分标准还是根据CPU虚拟化的方式决定的。

全虚拟化和半虚拟化,直观的体现就是半虚拟化使用定制的GustOS,全虚拟化则不必,使用普通适用于x86的的操作系统即可,具体原因见下文。

Tips:在主流的4种服务器虚拟化技术中,Xen全半虚拟化都支持。半虚拟化使用定制的GustOS,这给维护带来极大不便,但是性能比较好。全虚拟化,最开始是使用软件辅助虚拟化,虚拟化的损耗较大,性能较低。随着技术发展,通过硬件辅助虚拟化实现的全虚拟化性能已经极佳了。

Windows和Linux都将内存分为内核空间和用户空间,操作系统内核代码运行在内核空间,应用程序代码运行在用户空间。

Tips:CPU清除内存数据、设置时钟等指令是非常危险的,如果用错了会导致系统崩溃。通过特权级这一机制,区分内核代码和应用程序代码权限,保证操作系统正常运行。

x86服务器虚拟化借鉴了其他平台的虚拟化技术,将hypervisor(也叫做VMM)运行在ring0,GustOS运行在ring1(也有的运行在ring3),应用程序运行在ring3。

由于GustOS运行在ring1,不能执行特权指令,当执行特权指令的时候会产生异常,将异常自动交给hypervisor(ring0)来处理,此时hypervisor会将这些特权指令模拟运行后,返回GustOS。

Tips:但是x86服务器比较特殊,部分敏感指令是非特权指令,在ring1运行不会产生异常,便不会被hypervisor捕获。有两种处理方案,二进制翻译和hypercall,也是现在主流的软件辅助虚拟化技术。

属于非特权指令的敏感指令也需要在ring0运行,但是GustOS运行在ring1,这部分指令就无法通过陷入和仿真实现,VMware后来提供了一种二进制翻译技术来解决这个问题。

二进制翻译(BinaryTranslation)是一种直接翻译可执行二进制程序的技术,能够把一种处理器上的二进制程序翻译到另外一种处理器上执行。具体在服务器虚拟化中就是将需要运用非特权指令的敏感指令的二进制程序代码翻译成“虚拟特权指令”的二进制代码或者是翻译成运行在核心态(ring0)中的特权指令二进制代码,从而强制触发异常。

对于这部分需要ring0运行的非特权指令,还有一种处理方式就是使用hypercall(超级调用)。通过修改GustOS内核,将GustOS内核中需要使用敏感指令的代码修改为主动调用hypervisor模拟执行,然后hypervisor将运行结果返回GustOS。

这种方式比陷入模拟 二进制翻译效率高,但是由于需要修改GustOS内核,所以一般都是使用定制的GustOS,维护不太方便。

Tips:陷入和模拟,二进制翻译这种不需要修改GustOS的方式,称为全虚拟化,hypercall需要修改GustOS(或使用定制的OS),称为半虚拟化。主流服务器虚拟化中,Xen两种都支持,kvm、hyper-v、esxi均为全虚拟化。

二进制翻译、hypercall处理敏感指令的方式都是依靠软件来实现(所以叫做软件虚拟化),各有局限性,intel在年开始提供硬件辅助虚拟化(intelVT-x)解决敏感指令虚拟化这一难题。

intelVT-x提供了2个运行环境:根(Root)环境和非根(Non-root)环境。根环境专门为VMM准备,很像原来没有VT-x的x86,只是多了对VT-x支持的几条指令。非根环境作为一个受限环境用来运行多个虚拟机。

如上图所示,根操作模式与非根操作模式都有相应的ring0至ring3。VMM运行在根模式的ring0,GuestOS的内核运行在非根模式的ring0,GuestOS的应用程序运行在非根模式的ring3。运行环境之间相互转化,从根环境到非根环境叫VMEntry;从非根环境到根环境叫VMExit。VT-x定义了VMEntry操作,使CPU由根模式切换到非根模式,运行客户机操作系统指令。若在非根模式执行了敏感指令或发生了中断等,会执行VMExit操作,切换回根模式运行VMM。

根模式与非根模式之问的相互转换是通过VMX操作实现的。VMM可以通过VMXON和VMXOFF打开或关闭VT-x。如下图所示:

2)、VMM可执行VMLAUNCH指令或VMRESUME指令产生VMEntry操作,进入到GuestOS,此时CPU处于非根模式。

3)、GuestOS执行特权指令等情况导致VMExit的发生,此时将陷入VMM,CPU切换为根模式。VMM根据VMExit的原因作出相应处理,处理完成后将转到2),继续运行GuestOS。