在上一期中,我们讲到华为的虚拟化Fusioncompute,它包含两个部分CNA和VRM。而虚拟化开发的难点在CNA上,因为所有计算、存储、网络的虚拟化是在CNA上实现完成的。其实华为的虚拟化也不是它自己一层层开发写出来的,而是基于开源的虚拟化,进行二次开发而来的,以前是基于XEN 现在是基于KVM。
计算虚拟化的重要概念
虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
这也是我们学习虚拟化最初的概念,在传统物理机场景里:底层是硬件Host Machine、中间是操作系统Host OS、最上层是应用程序;而在虚拟化场景里,是在底层硬件之上多加了一个虚拟化层,也是虚拟化最核心的Hypervisor,在Hypervisor之上运行虚拟机,在虚拟机里安装操作系统,最终运行应用程序。
说明一下,如果大家以后看到VM是代表虚拟机(Virtual Machine),VMM是代表虚拟机监视器(Virtual Machine Monitor),它是虚拟化开发最重点也是难度最大的地方。那它为什么有难度呢?因为它要做很多事情。比如说,一台机器有128G内存,它要虚拟出164G内存来;还有底层是一个intel的网卡,它还能虚拟出多个网卡,分配给多个多个虚拟机等等,这些都是需要Hypervisor来实现。
计算虚拟化的类型
在CPU的架构里,这里先要了解一下CPU特权环这个概念,是指在CPU里面存在4个逻辑的环,分别是ring0、ring1、ring2、ring3。在原来物理机的世界里,以前做CPU的厂商也没有意识到未来会有虚拟化的存在,所以当时CPU被分为4个逻辑环,只有ring0可以与操作系统内核交互,ring3运行应用程序。但是在虚拟化的里,又是另外一种世界了,虚拟机运行在ring3这一层,而虚拟机也有内核,在ring3这一层无法和虚拟机的内核交互,只有ring0这层才可以和内核交互,所以这个时候会产生19条敏感指令集的问题,也就是说ring3这层没有办法把这19条指令进行翻译和转换,因为ring3没法和虚拟机的内核进行交互,就会导致虚拟机无法运行,也就意味着装不了虚拟机。
| 特权环与虚拟机 |
那么,现在为什么又能安装虚拟机了呢?
其实在原来就出现了两种技术,一种是全虚拟化,另一种是半虚拟化,就是为了解决那19条敏感指令集的问题。
这怎么说呢?
只有虚拟化世界的老大,VMware在这一点上做的最好。它在当时90年代,2000年的时候就可以装windows的操作系统了,而半虚拟化是装不了windows的,只能安装Linux的操作系统。这是为什么呢?
这是因为当时CPU的指令集不支持转换敏感指令集,所以需要在操作系统内核中写入一个系统调用程序Hypercall进行拦截和转换 ,因为Windows不开源,所以无法写入Hypercall,而Linux开源,支持写入Hypercall,所以半虚拟化只支持Linux系统。
那是怎么做到的呢?
其实是ring3拦截后,把指令给了ring0,对于虚拟机而言,它以为它直接进行交换了,其实是ring3在中间做了转换,模拟欺骗它说可以执行指令,但是这样的话开销特别大。但是vmware老强大了,自己可以拦截的,叫全虚拟化。只是这样来做转换,性能特别低下。所以,后来在CPU里加了一个特殊的指令集VT-X(VT-X是不是大家就熟悉一些啦)。
拿到一台机器,可以用lscpu这个命令来进行查询,如果有VT-X,说明CPU是支持虚拟化的。
还可以用这个命令cat /proc/cpuinfo来查询,flags这栏就是指令集,如果里面有vmx(代表intel的)、svm(代表AMD的),就说明支持硬件虚拟化。因为在一些就版本没有lscpu这个命令,所以可以用这条命令来查询。
现在这样是通过CPU自身来拦截处理和转换,提升了效率,不用Hypervisor来拦截和转换。
这种方式就是硬件辅助虚拟化。
XEN和KVM
在今天虚拟化的种类很多,商业化的虚拟化有VMware的,还有微软的Hype-V,但是这些都不开源。云时代不用昂贵的虚拟化,用开源的虚拟化。开源可以做二次开发,对于厂商而言,可以不用给虚拟化厂商付钱。
现在主流的开源的虚拟化主要有2种,分别是Xen和KVM。
从Xen开始说起,在2002年,Xen正式被开源,它是英国剑桥大学开发的。因为Xen开源,所以在各个系统中都可以使用,华为在Fusioncompute 6.1之前的版本,它用的虚拟化就是Xen,Fusioncompute 6.1之后的版本就改为KVM了。
而在2007年,红帽发布了第一个企业版的虚拟化,叫RHEL5.0(红帽企业版Linux5.0)。但是在2008年,Xen被思杰citrix收购了,就是大家现在看到的Xen server。按理来说Xen是开源的,谁都可以用,但是被Xen收购后,再继续使用就需要付费给思杰citrix。红帽表示不想给思杰付钱,后来红帽就不用XEN了,反而用KVM,在2008年红帽收购了KVM。因为在继续用Xen是帮别人做嫁衣,不是红帽自己的。
当时2008亚马逊做云最好的,它的底层就是Xen,而后来阿里在2008年成立云计算的底层也是Xen,但是在2017年,亚马逊把虚拟化迁到KVM,阿里云也一样,华为是2018年把虚拟化迁到KVM上的。所以今天Xen的身影看到的就比较少了。
这些就是历史故事了,下面再来讲继续技术。在rhel5.8里可以看到安装的时候有两种选择,Xen和KVM。
这里也有一个故事
红帽5.0用Xen,直到5.4支持KVM,但是红帽的技术支持是7年,有些客户刚买Xen的系统,又不愿意改到KVM,就出现红帽继续支持Xen,直到7年有效期结束,所以当时红帽支持两种虚拟化Xen和KVM。如果客户买5.4的,就推荐KVM,5.4之前的用xen,直到2014年,红帽就再也不用支持xen了,之后红帽发布的RHEL6.0就只有kvm了。但是Xen和KVM都只能在Linux上运行,还有现在云的世界底层也是Linux、不是windows,除了微软。
那么Xen和KVM有什么区别呢?
第一点:先说Xen有什么特点,在Linux系统中有两个内核,一个是是标准内核,一个是Xen内核。运行业务用标准内核,运行虚拟化用xen内核。因为安装一套内核,必须要维护一套全新的内核,标准内核的一些驱动,在Xen内核是用不了。而且内核版本一定要在同版本内编译,才能使用,操作特别麻烦。
第二点:Domain 0。它也是和KVM最大的区别。在Xen内核,Hypervisor它在安装是时候需要安装Domain 0 ,需要预留CPU和内存。一个指令数据包请求先到物理机,再到Domain 0,由Domain 0在给到指定的VM,所以Domain 0的开销特别大,也存在性能瓶颈。如果给Domain 0预留的资源不足,无法维持VM正常运行;如果分配过多,又存在资源浪费。
只要安装xen虚拟化,就出现一个特殊的虚拟机Domain 0。
而KVM不一样,它不需要升级内核,而是直接用标准内核。
每一个虚拟化在内核中是一个进程。一旦进程启动,标准内核有的,进程都可以使用。不需要由Domain 0来处理,相对于来说更轻量一些,这就是KVM和Xen最大的区别。
总结:
Xen有两个不好的地方,升级内核,要有Domain 0,而KVK直接用标准内核实现的,不用Domain 0。后来,KVM吐槽Xen,我们多轻量,Xen太重了;而Xen吐槽KVM就是,那家伙是个小毛孩子太年轻了,发展起来才几年,我们Xen已经特别成熟了。
这些年KVM也逐渐成熟发展起来,弥补了缺点,成为行业的标准,像华为云、阿里云等都是用KVM了。所以,现在不用学Xen,只用学KVM了,但是这段历史还是要知道的。
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/170620.html