KVM虚拟化基本原理

Posted EbowTang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVM虚拟化基本原理相关的知识,希望对你有一定的参考价值。

1.什么是虚拟化

在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件。

2.KVM整体架构

Kvm架构主要由两个模块来组成:kvm模块和QEMU-KVM

由下两图可以看到:kvm模块集成在了linux的内核里面,它为一个虚拟机提供的是cpu和mem,而QEMU-KVM在linux的用户空间层,它为一个虚拟机模拟各种io设备。 

3.QEMU-KVM与kvm的互动: 

KVM向外提供了一个虚拟设备/dev/kvm,通过ioctl(IO设备带外管理接口)来对KVM进行操作,包括虚拟机的初始化,分配内存,指令加载等等。

QEMU-KVM通过/dev/kvm接口来调用kvm创建虚拟机: 

4.KVM虚拟化全景图

在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvm

4.1 kvm

负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备;KVM是linux内核的模块,它需要CPU的支持,采用硬件辅助虚拟化技术Intel-VT,AMD-V,内存的相关如Intel的EPT和AMD的RVI技术,Guest OS的CPU指令不用再经过Qemu转译,直接运行,大大提高了速度,KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问这个接口。

4.2 qemu-kvm

是模拟IO设备(网卡,磁盘),Qemu是一个模拟器,它向Guest OS模拟CPU和其他硬件,Guest OS认为自己和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。kvm加上qemu之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以一般都称之为qemu-kvm。Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做。

kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备。

qemu模拟IO设备(网卡,磁盘等),kvm加上qemu之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以称之为qemu-kvm。

4.3 qemu-kvm模IO的缺点

从上图这个路径可以看出,每次IO操作的路径比较长,有很多VMEXIT,VMENTRY产生,需要多次上下文切换,以及多次数据复制,所以他的性能差,因此virtio应运而生。

在传统的设备模拟中,虚拟机内部设备驱动完全不知道⾃⼰处在虚拟化环境中,所以I/O操作会完整的⾛ 虚拟机内核栈->QEMU->宿主机 内核栈,产⽣很多VM Exit和VM Entry,导致性能很差。

Virtio⽅案旨在提⾼I/O性能。在改⽅案中虚拟机能够感知到⾃⼰处于虚拟化环境中, 并且会加载相应的virtio总线驱动和virtio设备驱动,执⾏⾃⼰定义的 协议进⾏数据传输,减少VM Exit和VM Entry操作。

4.4 virtio

VirtIO由 Rusty Russell 开发,对准虚拟化 hypervisor 中的⼀组通⽤模拟设备IO的抽象。Virtio是⼀种前后端架构,包括前端驱动(Guest内 部)、后端设备(QEMU设备)、传输协议(vring)。框架如下图所⽰:

前端驱动:

虚拟机内部的 virtio模拟设备对应的驱动。作⽤为 接收⽤户态的请求,然后按照传输协议对请求进⾏封装,再写I/O操作,发送通知到 QEMU后端设备。

后端设备:

在QEMU中创建,⽤来接收前端驱动发送的I/O请求,然后按照传输协议进⾏解析,在对物理设备进⾏操作,之后通过终端机制通知前端 设备。

传输协议:

使⽤virtio队列(virtio queue,virtqueue)完成。设备有若⼲个队列,每个队列处理不同的数据传输(如virtio-balloon包含ivq、dvq、svq 三个)。

virtqueue通过vring实现。Vring是虚拟机和QEMU之间共享的⼀段环形缓冲区,QEMU和前端设备都可以从vring中读取数据和放⼊数 据。

4.5 libvirt

libvirt则是调用kvm虚拟化技术的接口用于管理的虚拟机的生命周期。用libvirt管理方便,直接用qemu-kvm的接口太繁琐。基于libvirt的工具如virt-manager和virt-install提供了非常便捷的虚拟机管理接口,但它们事实上上经二次开发后又封装了qemu-kvm的工具。因此,直接使用qemu-kvm命令也能够完成此前的任务。

libvirt所处位置

如下是一些常见的virsh命令:

命令

解释

virsh list –all

查看虚拟机和状态

virsh start  test

 启动该虚拟机

 virsh reboot test       

 重启虚拟机

virsh  suspend test

 虚拟机处于paused暂停状态,一般情况下是被admin运行了virsh suspend才会处于这种状态,但是仍然消耗资源,只不过不被超级管理程序调度而已。

virsh resume test

把虚拟机唤醒,使其恢复到running状态

virsh shutdown test

 关闭指令,是虚拟机进入shutoff状态,系统提示虚拟机正在被关闭,却未必能成功

virsh destroy test

 强制关闭该虚拟机,但并非真的销毁该虚拟机,只是关闭而已。

virsh save test a

 将该虚拟机的运行状态存储到文件a中

virsh restore a

 根据文件a恢复被存储状态的虚拟机的状态,即便虚拟机被删除也可以恢复(如果虚拟机已经被undefine移除,那么恢复的虚拟机也只是一个临时的状态,关闭后自动消失)

virsh undefine test                                                  

移除虚拟机,虚拟机处于关闭状态后还可以启动,但是被该指令删除后不能启动。在虚拟机处于Running状态时,调用该指令,该指令暂时不生效,但是当虚拟机被关闭后,该指令生效移除该虚拟机,也可以在该指令生效之前调用define+TestKVM.xml取消该指令

virsh edit test 

修改TestKVM的配置文件,效果等于先dumpxml得到配置文件,然后vi xml,最后后define该xml文件(建议关机修改,修改完virsh define防止不生效)

virt-clone -o test -n test01 –file   /data/test01.img                                                                                                                                                 

在-o后面为被克隆虚拟机名称,-n后克隆所得虚拟机名称,file为克隆所得虚拟机镜像存放地址。

克隆的好处在于,假如一个虚拟机上安装了操作系统和一些软件,那么从他克隆所得的虚拟机也有一样的系统和软件,大大节约了时间。

参考:

【1】虚拟化技术之KVM,搭建KVM(详细)_CloudXli的博客-CSDN博客_kvm

【2】KVM 虚拟化原理探究--启动过程及各部分虚拟化原理_sdulibh的博客-CSDN博客_kvm虚拟化图片

【3】KVM详解,学习kvm系列文章_菲宇的博客-CSDN博客_kvm学习

以上是关于KVM虚拟化基本原理的主要内容,如果未能解决你的问题,请参考以下文章

[Mark] KVM 虚拟化基本原理

VIRTIO概述和基本原理

OpenStack 之 虚拟化原理

KVM构建及管理

Xen,VMware ESXi,Hyper-V和KVM等虚拟化技术的原理解析

2、kvm网络篇---网络配置Bridge方式、NAT方式