KVM

来自智得网
跳转至: 导航、​ 搜索

简介

Kvm的基础架构

KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。

KVM是Linux的一部分,Linux 2.6.20及以上版本都包含KVM,因此KVM可以使用Linux最新内核的功能。

原理

现代CPU在硬件层面提供对特殊指令的接获和重定向,通过这些指令集,VMM很容易将客户机置于受限模式运行,一旦宿主机访问物理资源,硬件会把控制权交还给VM处理,利用硬件的虚拟化技术,VM还可以重定向后的指令发给宿主机进行执行。

KVM将Linux转为虚拟机监控程序,由于KVM是Linux内核的一部分,所以作为虚拟机必须的组件,例如内存管理,进程调度,输入输出,网络堆栈都直接拥有。KVM虚拟机进程和普通的Linux进程一样,由标准的Linux进程调度程序进行调度,并且使用专门的虚拟硬件,例如网卡,CPU等。但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU

综上所述,KVM虚拟化有两个核心模块:

  • KVM内核模块:主要包括KVM虚拟化核心模块KVM.ko,以及硬件相关的KVM_intel或KVM_AMD模块;负责CPU与内存虚拟化,包括VM创建,内存分配与管理、vCPU执行模式切换等。
  • QEMU设备模拟:实现IO虚拟化与各设备模拟(磁盘、网卡、显卡、声卡等),通过IOCTL系统调用与KVM内核交互。KVM仅支持基于硬件辅助的虚拟化(如Intel-VT与AMD-V),在内核加载时,KVM先初始化内部数据结构,打开CPU控制寄存器CR4里面的虚拟化模式开关,执行VMXON指令将Host OS设置为root模式,并创建的特殊设备文件/dev/kvm等待来自用户空间的命令,然后由KVM内核与QEMU相互配合实现VM的管理。KVM会复用部分Linux内核的能力,如进程管理调度、设备驱动,内存管理等。

CPU虚拟化

Intel对x86 cpu指定了4种级别Ring0-Ring3,其中Ring 0是内核态,运行OS内核,可以执行所有敏感指令,进行内存分配。ring3权限最低,只能运行用户程序。

KVM依赖硬件辅助(Interl-VT/AMD-V)实现的虚拟化目前通过virtio驱动实现。Intel-VT引入了两种新的执行模式,VMM运行在VMX root模式,GuestOS运行在VMX的Non-root模式,执行特权指令时候两种模式可以进行切换。

内存虚拟化

KVM体系下内存虚拟化通过QEMU进行,KVM虚拟机本质上是运行在host上的QEMU进程,但是host并未提前给虚拟机分配内存,而是在虚拟机使用内存的时候按需分配。

传统的内存虚拟化通过影子页表实现,但是影子页表实现复杂,内存开销很大,每个 qemu 进程都需要维护自己的影子页表。

基于硬件支持的内存虚拟化技术能较好的解决影子页表带来的问题,Intel CPU 提供 EPT 技术支持内存虚拟化,AMD 提供 NPT 技术支持内存虚拟化。

IO虚拟化

I/O虚拟化包括管理虚拟设备和共享的物理硬件之间I/O请求的路由选择。目前,实现I/O虚拟化有三种方式:I/O全虚拟化、I/O半虚拟化和I/O透传。

  • 全虚拟化:宿主机截获客户机对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对客户机而言非常透明,无需考虑底层硬件的情况,不需要修改操作系统。
  • 半虚拟化:通过前端驱动/后端驱动模拟实现I/O虚拟化。客户机中的驱动程序为前端,宿主机提供的与客户机通信的驱动程序为后端。前端驱动将客户机的请求通过与宿主机间的特殊通信机制发送给后端驱动,后端驱动在处理完请求后再发送给物理驱动。
  • IO透传:直接把物理设备分配给虚拟机使用,这种方式需要硬件平台具备I/O透传技术,例如Intel VT-d技术。它能获得近乎本地的性能,并且CPU开销不高。

使用

KVM安装需要两个条件:

linux内核支持,所以KVM需要运行在2007年以后发布的Linix版本。

硬件支持,KVM需要支持虚拟化功能的x86硬件之上。