In computing,virtualization refers to the act of creating a virtual(rather than actual)version of something,including virtual computer hardwareplatforms,storage devices,and computer network resources。
简单来说就是计算,存储,网络的虚拟化版本。
有了虚拟化技术,一个NC(宿主机)可以被抽象成多个逻辑主机。
VMM(又叫Hypervisor),是用来创建与运行虚拟机(Instance、GuestOS、VM通常认为等价)的软件、固件或硬件。
被 hypervisor 用来运行一个或多个虚拟机的电脑称为宿主机(host machine),这些虚拟机则称为客户机(guest machine)。Hypervisor 提供虚拟的作业平台来运行客操作系统(GuestOS - guest operating systems),负责管理其他客操作系统的运行阶段;这些GuestOS,共同分享虚拟化后的硬件资源。
虚拟化有多种实现方式,下面分别介绍。
01
软件虚拟化和硬件虚拟化
就是通过软件模拟来实现VMM层,通过纯软件的环境来模拟执行客户机里的指令。最纯粹的软件虚拟化实现当属QEMU,KVM。
QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。通过这种模式,guest os可以和主机上的硬盘,网卡,CPU,CD-ROM,音频设备和USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差:
KVM实际是linux内核提供的虚拟化架构,可将内核直接充当hypervisor来使用。KVM需要处理器硬件本身支持虚拟化扩展,如intel VT 和AMD AMD-V技术。KVM自2.6.20版本后已合入主干并发行,除此之外,还以模块形式被移植到FreeBSD和illumos中。除了支持x86的处理器,同时也支持S/390,PowerPC,IA-61以及ARM等平台。
KVM包含一个内核模块kvm.ko用来实现核心虚拟化功能,以及一个和处理器强相关的模块如kvm-intel.ko或kvm-amd.ko。KVM本身不实现任何模拟,仅仅是暴露了一个/dev/kvm接口,这个接口可被宿主机用来主要负责vCPU的创建,虚拟内存的地址空间分配,vCPU寄存器的读写以及vCPU的运行。有了KVM以后,GuestOS的CPU指令不用再经过QEMU来转译便可直接运行,大大提高了运行速度。但KVM的kvm.ko本身只提供了CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完整的虚拟化技术,也就是下面要介绍的技术。
参考,ubuntu默认加载了KVM模块
Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做。kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备。qemu模拟IO设备(网卡,磁盘等),kvm加上qemu之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以称之为qemu-kvm。
Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能,关于半虚拟化,后文会介绍。
QEMU-KVM,是QEMU的一个特定于KVM加速模块的分支,里面包含了很多关于KVM的特定代码,与KVM模块一起配合使用。
目前QEMU-KVM已经与QEMU合二为一,所有特定于KVM的代码也都合入了QEMU,当需要与KVM模块配合使用的时候,只需要在QEMU命令行加上 --enable-kvm就可以。
qemu-kvm会创建Guest OS,当需要执行CPU指令的时候,通过/dev/kvm调用kvm内核模块,通过硬件辅助虚拟化方式加速。如果需要进行网络和存储访问,则通过类虚拟化或者直通Pass through的方式,通过加载特殊的驱动,加速访问网络和存储资源。
实际调用过程一般通过libvirt或者基于libvirt的管理工具,如virsh,virsh-manager等。
libvirt细节在其他文章介绍。
硬件虚拟化
硬件虚拟化技术就是指计算机硬件本身提供能力让客户机指令独立执行,而不需要(严格来说是不完全需要)VMM截获重定向。
以x86架构为例,它提供一个略微受限制的硬件运行环境供客户机运行(non-root mode),在绝大多数情况下,客户机在此受限环境中运行与原生系统在非虚拟化环境中运行没有什么两样,不需要像软件虚拟化那样每条指令都先翻译再执行,而VMM运行在root mode,拥有完整的硬件访问控制权限。仅仅在少数必要的时候,某些客户机指令的运行才需要被VMM截获并做相应处理,之后客户机返回并继续在non-root mode中运行。可以想见,硬件虚拟化技术的性能接近于原生系统,并且,极大地简化了VMM的软件设计架构。
02
从实现虚拟化的方式分为半虚拟化和全虚拟化
全虚拟化(Full Virtualization)
全虚拟化也成为原始虚拟化技术,该模型使用虚拟机协调GuestOS和原始硬件,VMM在GuestOS和裸硬件之间用于工作协调,一些受保护指令必须由Hypervisor(虚拟机管理程序)来捕获处理。
全虚拟化模型
全虚拟化的运行速度要快于硬件模拟,但是性能方面不如裸机,因为Hypervisor需要占用一些资源。
半虚拟化/准虚拟化(Para Virtualization)
半虚拟化是另一种类似于全虚拟化的技术,它使用Hypervisor分享存取底层的硬件,但是它的GuestOS集成了虚拟化方面的代码。它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervisor的工作负担变得非常的小,因此整体的性能也有很大的提高。
半虚拟化模型
需要GuestOS做一些修改,使GuestOS意识到自己是处于虚拟化环境的,但是半虚拟化提供了与原操作系统相近的性能。
03
Hypervisor的类型,Type1和Type2虚拟化
根据虚拟化层是位于硬件之上还是Host OS,将虚拟化分为Type1和Type2,如下图
Type-1:本地(native)、裸机(bare-metal) hypervisors
-
Hypervisor直接运行在物理机上,并直接控制硬件及管理GuestOS,此时host把GuestOS当成一个process;
-
如:Xen、VMware ESX、 XenServer 、 Hyper-V 、Xvisor。
Type-2:托管(hosted) hypervisors
-
Hypervisor运行在HostOS上,进而提供虚拟化服务;
-
如:VMware、VirtualBox、KVM。
参考
《KVM实战:原理、进阶与性能调优》
https://www.cnblogs.com/gzxbkk/p/10116000.html
https://www.cnblogs.com/qiaoyanlin/p/6888408.html
https://www.unixarena.com/2017/12/para-virtualization-full-virtualization-hardware-assisted-virtualization.html/
http://wiki.csie.ncku.edu.tw/embedded/xvisor
https://www.csie.ntu.edu.tw/~wcchen/asm98/asm/proj/b85506061/chap3/privilege.html
https://os.ecci.ucr.ac.cr/ci1310/Tematica/Harvard/os-structure.pdf
扩展阅读:
《不确定性与黑天鹅》
《费曼技巧》
《自尊与自我效能》
《什么是增长黑客》
《可证伪性》
《狭义相对论》
《学习的本质》
《测试敏捷化!-- 《双态IT联盟 - 测试敏捷化白皮书》》
THE END
- 晚安 -
图片长按2秒,识别图中二维码,关注订阅号
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:云计算 – 虚拟化技术Overview - Python技术站