服务器虚拟化技术是指通过运用虚拟化的技术充分发挥服务器的硬件性能,能够在确保企业投入成本的同时,提高运营效率,节约能源降低经济成本和空间浪费,对于发展迅速,成长规模大的用户来说,可以通过服务器虚拟化技术带来更多的经济效益。
如果你曾经将硬盘划分为不同分区,那么可能会对虚拟化的概念有所理解。分区是硬盘驱动器的逻辑划分,实际上相当于创建了两个独立的逻辑硬盘。本质上有两种主要的方法构建Hyper-visor解决方案:微内核和宏内核。微内核方法使用非常薄的一层专用代码作为Hyper-visor,只执行确保分区隔离和内存管理的核心任务。这一层并不包括I/O软件栈或设备驱动。这是Hyper-V所用的方法。在这种架构下,虚拟化软件栈和特定于硬件的驱动程序位于一个专用的分区中,称之为父分区。
为向访客操作系统提供一些额外的特性,Hyper-V提供了集成组件。通过使用Hyper-V,大大提高了虚拟化平台的可伸缩性、可用性、可管理性和性能。使用终端服务(Terminal Service)提供的显示虚拟化(presentation virtualization),可以避免分布式应用程序的部署问题。终端服务可以帮助监控网关连接状态、事件和健康状况。
Hyper-V在其虚拟机中支持两类设备:合成设备和模拟设备。合成设备本质上就是把虚拟机设备发出的设备请求打包,然后转发给新的VMBus,这是一个内存中的流水线,VMBus再将设备请求转发给物理设备。而在另一方面,模拟设备则使用宿主操作系统的软件来模拟使用了额外的宿主操作系统处理功能的设备。Hyper-V的软件设备模拟由vmwp.exe程序进行。
Hyper-V从最初设计实现时,就在一台计算机上运行的各个操作系统实例之间建立了强有力的边界。为使访客操作系统与宿主操作系统之间能够交互,并向所支持的访客操作系统提供一些额外的功能。Hper-V提供了集成组件(Integration Components)来支持以下特性:时间同步、心跳功能、访客操作系统关闭、操作系统识别。
终端服务能使用户创建一个集成化的系统,允许用户从任何有网络连接的地点快捷而安全地提供访问基于Windows的应用程序的入口。
Windows和Linux都将内存分为内核空间和用户空间,操作系统内核代码运行在内核空间,应用程序代码运行在用户空间。
特权级是一种用来保护数据和阻止恶意行为的机制,x86计算机的CPU提供4个特权级:ring0~3,ring0权限最高,ring3权限最低。
ring0提供给操作系统内核(内核空间代码)使用,可以使用所有CPU指令,可以直接操作硬件(如CPU、内存)。
ring3提供给应用程序(用户空间代码)使用的,只可以调用基本的CPU指令。
ring1、ring2被设计为运行驱动程序,但Windows、Linux将驱动程序运行在ring0,未使用这两个特权级。
Tips:CPU清除内存数据、设置时钟等指令是非常危险的,如果用错了会导致系统崩溃。通过特权级这一机制,区分内核代码和应用程序代码权限,保证操作系统正常运行。
在多用户、多任务的计算机系统中特权指令必不可少,它主要用于系统资源的分配和管理,包括改变系统工作方式,检测用户的访问权限,修改虚拟存储器管理的段表、页表,完成任务的创建和切换等。
常见的特权指令有以下几种:
非特权指令有的需要以ring0运行,有的可以任意ring运行。操作系统内核以ring0运行,可以使用所有指令;应用程序以ring3运行,所以不能使用特权指令和部分非特权指令。
Tips:特权指令必须以ring0运行,否则会产生异常,将控制权交还ring0,非特权指令有的需要以ring0运行,有的不需要。
Tips:敏感指令=特权指令+部分非特权指令,也就是说特权指令一定是敏感指令。
敏感指令是指操作特权资源的指令。
1.企图访问或修改虚拟机模式或机器状态的指令。
2.企图访问或修改敏感寄存器或存储单元,如时钟寄存器、中断寄存器等的指令。
3.企图访问存储保护系统或内存、地址分配系统的指令。
4.所有I/O指令。
Tips:特权指令只有ring0才能执行,当非ring0执行时会产生异常,非特权指令有的也需要ring0才能运行,但是它们非ring0运行不会产生异常。
服务器虚拟化的有多种划分方式,可以根据虚拟化架构划分为裸金属/寄居,根据虚拟化层次硬件辅助虚拟化/软件辅助虚拟化,根据虚拟化平台划分为全虚拟化/半虚拟化。
未虚拟化的x86服务器架构,自下而上是物理硬件(Hardware)、操作系统(OS),应用程序(APP)。这和我们个人计算机一样,就是在计算机上装操作系统,再在操作系统里面安装应用程序。
未虚拟化的x86服务器
裸金属(bare-metal)架构也叫bare-metal hypervisor、Ⅰ型,最有代表性就是VMware ESX(i)。
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,首先需要在物理服务器上安装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这个软件。
把他们放在一起是因为他们都有一个非常相似的概念,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运行在父分区,他们都相当各自的于第一台虚拟机。
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)位于同一层。
通常根据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,这给维护带来极大不便,但是性能比较好。全虚拟化,最开始是使用软件辅助虚拟化,虚拟化的损耗较大,性能较低。随着技术发展,通过硬件辅助虚拟化实现的全虚拟化性能已经极佳了。
官网
这款虚拟机软件兼容性不错,VMware Tools也很强大,快照功能很快捷,方便,允许你在任意开机时刻创建系统快照和恢复,主要用于调试极易产生蓝屏的软件和工具,十分实用。有点不好的地方在于它安装时会虚拟两块网卡,还可以在设置中虚拟更多的虚拟网卡,一般来说使用桥接Bridge的方法就可以让虚拟机上网,基本没有用过NAT方式。VMware和VirtualBox一样都是会修改电脑本身的网卡设置的。
VMware创造性的提出了一个二进制翻译技术。VMM在虚拟机操作系统和宿主计算机之间扮演一个桥梁的角色,将虚拟机中的要执行的指令“翻译”成恰当的指令在宿主物理计算机上执行,以此来模拟执行虚拟机中的程序。你可以简单理解成Java虚拟机执行Java字节码的过程,不同的是Java虚拟机执行的是字节码,而VMM模拟执行的就是CPU指令。
另外值得一提的是,为了提高性能,也并非所有的指令都是模拟执行的,VMware在这里做了不少的优化,对一些“安全”的指令,就让它直接执行也未尝不可。所以VMware的二进制翻译技术也融合了部分的直接执行。
对于虚拟机中的操作系统,VMM需要完整模拟底层的硬件设备,包括处理器、内存、时钟、I/O设备、中断等等,换句话说,VMM用纯软件的形式“模拟”出一台计算机供虚拟机中的操作系统使用。
这种完全模拟一台计算机的技术也称为全虚拟化,这样做的好处显而易见,虚拟机中的操作系统感知不到自己是在虚拟机中,代码无需任何改动,直接可以安装。而缺点也是可以想象:完全用软件模拟,转换翻译执行,性能堪忧!
而QEMU则是完全软件层面的“模拟”,乍一看和VMware好像差不多,不过实际本质是完全不同的。VMware是将原始CPU指令序列翻译成经过处理后的CPU指令序列来执行。而QEMU则是完全模拟执行整个CPU指令集,更像是“解释执行”,两者的性能不可同日而语。
官网
Sun公司的产品,属于轻量级的虚拟机平台,而且是开源的,完整安装包很小,不像VMware有几百兆,功能相对也很精简,快照功能这里叫备份和快速修复,在不同的快照间跳转用起来感觉不是很方便,也不能实现文件拖拽的功能。文件共享方面,叫做“数据空间”,在关机的状态下,先在设置中选择主机的一个目录来加入到固定分配栏中。然后在虚拟机中右键单击我的电脑选择“映射网络驱动器”,在文件夹浏览中整个网络里的”VirtualBox Shared Foders”选择刚才共享的那个文件夹,确定后就可以将其映射为我的电脑中的一个盘符使用了。
官网
KVM (全称是 Kernel-based Virtual Machine) 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案,包含一个可加载的内核模块 kvm.ko,提供和虚拟化核心架构和处理器规范模块。使用 KVM 可允许多个包括 Linux 和 Windows 每个虚拟机有私有的硬件,包括网卡、磁盘以及图形适配卡等。
那 IO 的虚拟化,比如存储和网络设备则是由 Linux 内核与Qemu来实现。
作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。
大家在网上看 KVM 相关文章的时候肯定经常会看到 Libvirt 这个东西。
Libvirt 就是 KVM 的管理工具。
其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。
Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh
官网
既然有全虚拟化,那与之相对的也就有半虚拟化,前面说了,由于敏感指令的关系,全虚拟化的VMM需要捕获到这些指令并完整模拟执行这个过程,实现既满足虚拟机操作系统的需要,又不至于影响到物理计算机。
但说来简单,这个模拟过程实际上相当的复杂,涉及到大量底层技术,并且如此模拟费时费力。
而试想一下,如果把操作系统中所有执行敏感指令的地方都改掉,改成一个接口调用(HyperCall),接口的提供方VMM实现对应处理,省去了捕获和模拟硬件流程等一大段工作,性能将获得大幅度提升。
这就是半虚拟化,这项技术的代表就是Xen,一个诞生于2003年的开源项目。
这项技术一个最大的问题是:需要修改操作系统源码,做相应的适配工作。这对于像Linux这样的开源软件还能接受,充其量多了些工作量罢了。但对于Windows这样闭源的商业操作系统,修改它的代码,无异于痴人说梦。
Xen对虚拟机的虚拟化分为两大类,半虚拟化(Para virtualization)和完全虚拟化(Hardware VirtualMachine)。
半虚拟化(PV)
1、半虚拟化
2、完全虚拟化(HVM)
官网
Hyper-V是微软的一款虚拟化产品,大部分国内的VPS服务商使用这个架构,主要是因为其转为Windows定制,管理起来较为方便。目前的Hyper-V也支持Linux,只不过性能损失比较严重。
Hyper-V完美支持Windows系统,包括32位和64位。如果大家选购Hyper-V架构的VPS,强烈建议使用Windows。
Hyper-V目前不能超售内存,但可超售硬盘,硬盘是根据客户使用情况扣除。一般来说,服务器的硬盘不会100%用完,这点不用担心。
Hyper-V适用人群:Windows系统爱好者
Hyper-V注意事项:Linux操作系统性能较低
Hyper-V可用系统:Windows、Linux
官网
OpenVZ(简 称OVZ)采用SWsoft的Virutozzo虚拟化服务器软件产品的内核,是基于Linux平台的操作系统级服务器虚拟化架构。这个架构直接调用母服务器(母机)中的内核,模拟生成出子服务器(VPS,小机),所以,它经过虚拟化后相对于母服务器,性能损失大概只有的1-3%。
当然 OpenVZ可以超售,意思味着一台服务器总共16G内存,他可以开出配置为1G内存×17台以上的子服务器。因为他的虚拟架构关系属于:客户用多少,就扣除母服务器多少,所以OpenVZ架构的VPS较为便宜。但由于存在超售因素,如果服务商毫无休止的超售会导致服务器的性能急剧下降。
OpenVZ另一个特点是,它是直接调用母服务器的内核,所以会导致部分软件无法使用,以及部分内核文件是无法修改。
OpenVZ适用人群:新手、低预算客户
OpenVZ注意事项:资源不是自己独有的,安装VPN服务需要注意检测虚拟网卡支持。
OpenVZ可用系统:Linux(不支持Windows)
如果以上产品我们不打算买厂商支持,其中vmware和hyper-v,是不建议使用的,主要是授权问题。
这时就剩下kvm和xen了,如果虚拟windows,建议使用 kvm,我们可以从 redhat那里免费拿到针对 windows 优化过的磁盘和网络的驱动 程序,可以达到较高的性能(几乎与hyper-v性能持平)。