栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

KVM底层工作原理

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

KVM底层工作原理

以色列qumranet公司研发,后被RedHad公司收购
(1)kvm只支持x86平台
(2)依赖于 HVM,inter VT AMD-v

·  KVM是(Kernel-based Virtual Machine)的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。

·  KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。

其中,KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:

  • 它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。
  • 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
  • 它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
  • 它需要支持虚拟化扩展的 CPU。
  • 它是完全开源的。官网。

本文介绍的是基于 X86 CPU 的 KVM。

KVM架构: kvm是基于虚拟化扩展(Intel VT 或者 AMD-V)的X86硬件的开源的Linux原生的全虚拟化解决方案,kvm中,虚拟机被实现为常规的一个linux进程,有标准的调度程序进行调度,虚拟机的每个虚拟cpu也被实现为一个linux进程,这使用kvm能够使用Linux内核已有的功能,但kvm本身不执行任何硬件的模拟,需要客户空间程序通过, /dev/kvm,接口设置一个客户机虚拟服务器的空间地址,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏,目前的这个程序是QEMU
Linux上的用户空间,内核空间和虚拟机:

  • Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
  • KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
  • QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。

kvm底层的虚拟化过程和原理: 

kvm是基于虚拟化扩展的行x86硬件的开源的linux原生的全虚拟化解决方案,在kvm中,虚拟化被实现为常规的Linux进程,有标准Linux调度程序进行调度, 虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。

KVM的核心组件:

1,kvm,ko内核模块:

(kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能;它的主要负责是虚拟机的创建,虚拟内存的分配,虚拟cpu寄存器,的读写和虚拟cpu的运行.

2.qemu-kvm:用户空间的工具程序

该组件是一个通用的开源机器模拟器和虚拟器,其主要的功能是用于模拟虚拟机的用户空间组件,提供io设备模型,访问外设的途径.

qemu是纯软件的虚拟化模拟器,几乎可以模拟任何硬件设备,,

最熟悉的是能够模拟一台独立的虚拟机,虚拟机认为自己和虚拟机打交道,但其实是和qemu虚拟出来的硬件交互,qemu将这些正真的指令转译给真正的硬件.

正因为Qemu是纯软件实现的,所有的指令都要经过qemu过一手,性能非常低,所以,在生产环境中,所以在生产环境中,Qemu配合KVM来完成虚拟化工作,因为kvm是硬件辅助的虚拟化技术,主要负责比较繁琐的cpu虚拟化和内存虚拟化,而QEMU则负责IO设备虚拟化,两者合作发挥自身的优势,相得益彰

 

 

从本质上看,虚拟出的每个虚拟机对应宿主机上的qemu进程,而虚拟机的执行线路(cpu线路,io线路)对用qemu进程中的一个线程,

下面通过启动一个虚拟机来讲解kvm 与QEmu是怎么交互工作的

第一步: 获取到kvm句柄

kvmfd = open("/dev/kvm", O_RDWR);

// 第二步,创建虚拟机,获取到虚拟机句柄。

vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);

第三步: 为虚拟机映射内存,还有其他的pci,信号处理的初始化

ioctl(kvmfd, KVM_SET_USER_MEMORY_REGION, &mem);

第四部: 将虚拟机镜像映射到内存中,想当于物理机的boot过程

第五步:创建vcpu(虚拟cpu),并为vcpu分配内存空间,

ioctl(kvmfd, KVM_CREATE_VCPU, vcpuid);

vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, KVM_GET_VCPU_MMAP_SIZE, 0); //

第六步: 创建vcpu个数的线程并运行虚拟机

ioctl(kvm->vcpus->vcpu_fd, KVM_RUN, 0);

第七步: 线程进入循环,并捕获虚拟机退出原因,作出处理

for (;;) { ioctl(KVM_RUN) switch (exit_reason) {

case KVM_EXIT_IO: case KVM_EXIT_HLT:

} }

这里的退出并不一定是虚拟机关机,

// 虚拟机如果遇到 I/O 操作,访问硬件设备,缺页中断等都会退出执行,

// 退出执行可以理解为将 CPU 执行上下文返回到 Qemu。

    qemu-kvm进程:工作用于用户空间,用于实现io设备模拟,用于实现虚拟机实例.

3libvirt:工具箱用于与主流os虚拟化进行交互工具

libvirt是cs架构应用:

客户端:libvirt-client

virt-manager

daemon:图像化工具

libvirt-deaemon

3,kvm中vcpu在运行模式下运行:

kvm模块load进内存之后,系统的运行模式:

内核模式: Kernel Mode)运行KVM内核,实现模式的切换(VM Exit/VM Entry),执行特权与敏感指令。GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式.

用户模式: (User Mode)运行QEMU,实现IO模拟与管理。,用于代为Guest os发出io请求.

客户模式:(Guest Mode)运行GuestOS,执行Guest非IO操作指令。

KSM机制

扫描物理内存,发现多个虚拟机实例有相同的内存空间,合并成为一个共享内存空间,节省内存。

  qemu工具

  • qemu-kvm:用户空间的工具程序,创建管理虚拟机
  • qemu-img:是 QEMU 的磁盘管理工具

·  libvirt工具

  • GUI:virt-manager, virt-viewer:图形化管理
  • CLI: virsh, virt-install:创建管理虚拟机

·  集群工具:
libvirtd:管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。Libvirt是一个C工具包的虚拟化功能与最新版本的Linux(以及其他操作系统)。主包包含libvirtd服务器虚拟化支持出口。

Kvm 工作原理的基本阐释:
用户模式的qume利用libkvm通过ioctl进入内核模式,kvm模块
为虚拟机创建了虚拟内存,虚拟cpu后执行VMLUAC指令进入到客户模式,,加载guest os并执行,如果 guest os 发生外部中断,或者缺页等情况就会暂停执行guest os,退出客户模式,进行异常处理,内核模式处理这些异常时如果不需要I/O则处理完成后重新进入客户模式,如果需要I/O则进入到用户模式,由Qemu来处理I/O,处理完成后进入内核模式,再进入客户模式

 

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/887955.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号