KVM虚拟化介绍

常见虚拟化产品较多,例如KVM、Xen、Libvirt等等技术,今天重点分析KVM虚拟化技术
KVM

KVM (kernel-based Vietual Machine)虚拟化技术是基于虚拟化扩展(IntelVT 或AMD-V)的全虚拟化解决方案,自身内部包含可加载模块kvm.ko,提供核心的虚拟化架构,还有一个特定处理器模块kvm-.ko。

kvm 本来就是开源项目,包含再Linux更新主线中(Linux内核2.6.20开始),之后所有Linux版本,用户组件均包含QEMU主线中。而QEMU 1.3版本开始独立使用。

KVM 是需要CPU硬件支持虚拟化技术,这对硬件依赖是不可缺少的,否则不能运行。因此选型CPU,需要查看CPU是否支持虚拟化,例如Intel Xeon Gold 5218

目前KVM不支持混合虚拟化 kvm需要cpu支持虚拟化吗_内核


目前市场主流CPU,均提供Intel VT 系列虚拟化支持。

目前常用Linux均包含KVM模块,可用modprode 调用该模块,加载完该模块后,进一步通过其他工具实现虚拟机创建,仅凭KVM 内核模块不能完成虚拟机创建,用户是不能直接使用KVM 内核直接做事情,必须有个用户空间工具,因此有了开源虚拟化然间QEMU。那么这个QEMU是干嘛的呢?它可以实现虚拟不同的硬件,比如,X86架构,CPU上面虚拟化出安腾CPU。

而KVM就用了QEMU很小功能,就形成用户工具,利用QEMU调用KVM内核,实现虚拟化功能。所以官方就给了三个大包。1,KVM包
2.QEMU包,3二者组合包。这样系统升级可以在这三种情况下均能完成。

用户模式
本人操作linux 中,redhat、CenOS比较多,熟悉的都知道,LInux系统常见两种模式,用户模式和内核模式。但是KVM有三种模式。用户模式、内核模式、客户模式。在KVM中,每个虚拟主机由Linux调度程序管理的标准进程。该进程就是调用KVM用户模式执行程序。对于应用程序而言,默认模式就是用户模式。当需要来自于内核操作时,便进入内核模式,如磁盘读写数据。客户模式就就是进入虚拟机,虚拟机自己拥有内核和用户空间变量,可以使用kill 或ps 命令。

kvm 利用硬件虚拟化技术模拟处理器形态,虚拟机的内存管理,直接由操作系统内核直接管理。内核模式在需要的时候,直接向QEMU发送信号并开始处理大量硬件仿真。KVM管理CPU和内存的访问调用,QEMU直接提供硬件仿真资源。。另外,当QEMU独立运行时候,也可以模拟CPU和硬件。

实现方式
kvm的API,是通过/dev/kvm实现设备访问,/dev/kvm是标准字符设备,可以与常见的ioctl、open\close操作,但是kvm中,没有read和write接口,均通过ioctl实现。

kvm所有实现均通过/dev/kvm开始,打开后,会获得文件描述指符(fd),然后通过ioctl进行对(fd)进一步操作。

下面描述kvm 初始化过程:

1.加载模块

加载kvm、svm或vmx。成功加载后,/dev/kvm形成用户空间。如下图

目前KVM不支持混合虚拟化 kvm需要cpu支持虚拟化吗_内核_02


2.调用/dev/kvm

/dev/kvm不可读也不可写,但是/dev/kvm可以通过ioctl 接口,如下:

目前KVM不支持混合虚拟化 kvm需要cpu支持虚拟化吗_内核_03


3.调用kvm ioctl()

调用KVM_GET_API_VERSION指令 进行版本监查。

调用KVM_CREAT_VM指令 创建虚拟机,并返回kvm-vm文件描述符。

目前KVM不支持混合虚拟化 kvm需要cpu支持虚拟化吗_文件描述符_04


4.调用kvm、kvm-vm ioctl()

在kvm 文件描述符调用KVM_CHECK_EXTENSIONS(检查扩展支持)

在kvm 文件描述符调KVM_STE_TSS_ADDR(inter中初始化TSS区域)设置TSS地址

目前KVM不支持混合虚拟化 kvm需要cpu支持虚拟化吗_目前KVM不支持混合虚拟化_05


5.调用kvm、kvm-vm ioctl()

在kvm 文件描述符调用KVM_CHECK_EXTENSIONS(检查扩展支持)

在kvm 文件描述符调KVM_STE_MEMORY_REGION修改虚拟机内存区域。

目前KVM不支持混合虚拟化 kvm需要cpu支持虚拟化吗_文件描述符_06


6.调用kvm、kvm-vm ioctl()

在kvm 文件描述符调用KVM_CHECK_EXTENSIONS(检查扩展支持)

在kvm 文件描述符调KVM_STE_MEMORY_IRQCHIP(创建APIC,并将虚拟机关联APIC)设置irqchip

目前KVM不支持混合虚拟化 kvm需要cpu支持虚拟化吗_分页_07


7.创建虚拟机

在kvm 文件描述符调用KVM_CREAT_VCPU

目前KVM不支持混合虚拟化 kvm需要cpu支持虚拟化吗_内核_08

kvm/qemu 的内存管理
kvm/qemu, 底层主要还是Linux 进程方式,类似于系统操作进程,所以在调用上采用malloc()和mmpp方式调用,例如申请使用1个G内存使用,那么malloc 通过计算malloc (1<<30G )操作,从宿主机上分配1GB的内存。所以实际上,只是做了malloc()函数调用,对于物理硬件内存,并没有实质性操作。当虚拟机开始正常工作时候,通过melloc申请调用的分配,kernel去识别物理地址(0X00000001),这时候,才会虚拟出1GB内存,通过kvm/qemu 去识别,交付虚拟机使用。

内存访问技术

  1. 影子分页表技术:虚拟机的内存分页表和物理机内存分页表不是同一张表,可以简单理解为镜像技术。
  2. VMX/AMD-V 技术:宿主机时刻监控底层,以此获取虚拟机分页表有效信息,该机制十分有效,通过两次访问虚拟机的内存分页表和物理机内存分页表,此技术需要消耗大量资源。

AMD和INTER厂商为解决资源消耗问题,开发EPT和NPT,使硬件重新识别架构,能够将虚拟机内存变化,准确快速的传递给宿主机,而不用直接访问宿主机的分页列表,通过一次访问完成,提高效率。