hypervisor学习总结

什么是hypervisor

Hypervisor是一种将操作系统与硬件抽象分离的方法,以达到host machine的硬件能同时运行一个至多个虚拟机作为guest machine的目的 ,这样能够使得这些虚拟机 高 效地分享主机硬件资源。

hypervisor的优点

  1. 提高主机硬件的使用效率。因为一个主机可以运行多个虚拟机,这样主机的硬件资源能被高效充分的利用起来。
  2. 虚拟机移动性强。传统软件强烈捆绑在硬件上,转移一个软件至另一个服务器上耗时耗力(比如重新安装);然而,虚拟机与硬件是独立的,这样使得虚拟机可以在本地或远程虚拟服务器上低消耗转移。
  3. 虚拟机彼此独立。一个虚拟机的奔溃不会影响其他分享同一硬件资源的虚拟机,大大提升安全性。
  4. 易保护,易恢复。Snapshot技术可以记录下某一时间点下的虚拟机状态,这使得虚拟机在错误发生后能快速恢复。

hypervisor的分类

bare-metal hypervisors:直接部署在主机硬件上,以管理硬件和guest machine。
hosted hypervisors:作为软件层部署在主机操作系统上,现在常用的VMware Player和VirtualBox就是这种类型。
avatar

类型I:本地或裸机Hypervisor
这些虚拟机管理程序直接运行在主机的硬件来控制硬件和管理客体操作系统上。
特点
需要硬件支持
虚拟机监视器作为主操作系统
运行效率高
类型II:Hosted Hypervisor
这些虚拟机管理程序运行在传统的操作系统上,就像其他计算机程序那样运行。
特点
虚拟机监视器作为应用程序运行在主操作系统环境内
运行效率一般较类型I低

虚拟化技术的对比

类型 代表产品
硬件分区 IBM/HP等大型机硬件分区技术
虚拟机 (Virtual Machine Monitor) EMC VMware Mircosoft Virtual PC/Server Parallels
准虚拟机 (Para-Virtualization) Xen Project
虚拟操作系统 (OS Virtualization) SWsoft Virtuozzo/OpenVZ Project Sun Solaris Container HP vSE FreeBSD Jail Linux Vserver

QEMU和KVM

基本概念
在 x86 平台上最热门运用最广泛的虚拟化方案莫过于KVM了。KVM 全称是 Kernel-Based Virtual Machine 。也就是说KVM是基于Linux内核实现的。 KVM有一个内核模 块叫kvm.ko,只用于管理虚拟CPU和内存。那 IO 的虚拟化,比如存储和网络设备由谁实现呢?这个就交给 Linux 内核和Qemu来实现。说白了,作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。
Libvirt
简单说就是 KVM 的管理工具。其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。
Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh
libvirtd是服务程序,接收和处理 API 请求;
API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具,后面我们也会介绍;
virsh 是我们经常要用的 KVM 命令行工具,后面会有使用的示例。
KVM
Kernel-Based Virtual Machine 基于内核的虚拟机,是Linux内核的一个可加载模块,通过调用Linux本身内核功能,实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,需要x86架构的,支持虚拟化功能的硬件支持(比如Intel-VT,AMD-V),是一种全虚拟化架构。KVM在2007年2月被导入Linux 2.6.20内核中。从存在形式来看,它包括两个内核模块:kvm.ko 和 kvm_intel.ko(或kvm_amd.ko),本质上,KVM是管理虚拟硬件设备的驱动,该驱动使用字符设备/dev/kvm(由KVM本身创建)作为管理接口,主要负责vCPU的创建,虚拟内存的分配,vCPU寄存器的读写以及vCPU的运行。
QEMU
QEMU:是一套由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。QEMU有两种工作模式:系统模式,可以模拟出整个电脑系统,另一种是用户模式,可以运行不同与当前硬件平台的其他平台上的程序(比如在x86平台上运行跑在ARM平台上的程序);其代码地址 http://git.qemu.org/qemu.git ,有兴趣的同学可以自己去看看,目前最新的版本是2.7.0,在0.9.1及之前版本还可以使用kqemu加速器(可以理解为QEMU的一个插件,用来提高QEMU的翻译性能,支持Windows平台),但1.0以后版本就只能使用qemu-kvm(只支持Linux)进行加速了,1.3版本后QEMU和QEMU-KVM合二为一了。
QEMU-KVM
QEMU-KVM:从前面对KVM内核模块的介绍知道,它只负责CPU和内存的虚拟化,加载了它以后,用户就可以进一步通过工具创建虚拟机(KVM提供接口),但仅有KVM还是不够的,用户无法直接控制内核去做事情(KVM只提供接口,怎么创建虚拟机,分配vCPU等并不在它上面进行),还必须有个运行在用户空间的工具才行,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,并对其进行了修改,最后形成了QEMU-KVM。

在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件,QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。当然,由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备。

参考文章

https://blog.csdn.net/JackLiu16/article/details/79462698
https://blog.csdn.net/hdy007/article/details/1518425