【虚拟化】KVM概念和架构

目录

一、什么是KVM?

二、KVM的功能

[2.1 主要的功能](#2.1 主要的功能)

[2.2 其它功能](#2.2 其它功能)

三、KVM核心组件及作用

四、KVM与VMware的优势

五、KVM架构

六、qemu介绍

七、创建虚拟机流程


一、什么是KVM?


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

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


二、KVM的功能


2.1 主要的功能

基于kvm,可以执行热迁移,将一个运行的虚拟机从一个运行vm从一台物理机移动到另外一台物理主机,而vm里的运行不受影响(几台部署kvm虚拟化的物理机共享一个存储,存储内存放虚拟机的xml文件,这样在另外一台主机启一个虚拟机的进程是很快的,然后关联上待迁移主机的xml文件,就实现了热迁移);

可以保存当前虚拟机的运行状态到硬盘,然后可以重新启动虚拟机,这是虚拟机的运行状态和之前一样。

2.2 其它功能


  • 支持CPU 和 memory 超分(Overcommit)
  • 支持半虚拟化I/O (virtio)
  • 支持热插拔 (cpu,块设备、网络设备等)
  • 支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
  • 支持 PCI 设备直接分配和 单根I/O 虚拟化 (SR-IOV)
  • 支持 内核同页合并 (KSM )
  • 支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )

三、KVM核心组件及作用


  • **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与VMware的优势


ESXI的底层是VMkernel + linux,VMkernel启动后开始接管对硬件管理,然后启动第一个linux虚拟机,协助VMkernel一起来管理和调度硬件资源。

KVM是直接将linux kernel变成hypervisor,只需要从标准linux内核启动即可,linux kernel拥有的特性可以全部利用上。KVM架构上的优势使得它非常简洁,在开发出来仅三个多月就被合并到了标准内核。


五、KVM架构


虚拟化是云计算的基础。一种资源管理技术,是计算机将各种实体资源(CPU、内存、磁盘空间、网络适配器等)做虚拟化、将虚拟化后的整体做为一个可供分割且组合的操作系统。

② KVM全称是Kernel-Based Virtual Machine。 KVM基于Linux内核实现,属于半虚拟化的Hypervisor。KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存,而Qemu则协助提供IO设备半虚拟化,用于虚拟磁盘IO和网络IO等。不过IO设备的虚拟化方向都是往直接透传到宿主机的方向走,比如vhost-net,直接在硬件或内核级别支持。

一个 KVM虚机在宿主机中其实是一个qemu-kvm进程。而每个虚机中的vCPU则为宿主机中的一个线程。

OpenStack底层也使用Libvirt,Libvirt是KVM的管理工具,还可以管理Xen,VirtualBox等Hypervisor。Libvirt包含3个东西:后台daemon服务libvirtd、API 库和命令行工具 virsh。

虚机的vCPU总数可以超过物理CPU数量,这个叫CPU overcommit(超配)。

总结如下:

vm就是一个普通的linux进程,由linux内核调度程序进行调度,vm因此可以使用linux内核已有的功能。vm的执行本质就是vm中cpu的执行,因此vm的每个cpu就是普通的linux进程。

**KVM有一个内核模块叫 kvm.ko ,**kvm.ko只提供 CPU 和内存的虚拟化,而针对于IO及其他硬件设备(网络及存储等)的虚拟化,则是交给qemu实现,qemu运行在用户态通过/dev/kvm接口设置一个客户机虚拟机服务器的地址空间,向kvm提供模拟的I/O,并且将它的视频显示映射回宿主的显示屏。


六、qemu介绍


qemu本身就是一种虚拟化技术,它与kvm的区别如下:

**(1)上图的左侧:**完全基于Qemu纯软件(不包含操作系统内核)实现的虚拟化

kqemu是通过kqemu模块实现内核态的加速,在用户态的qemu通过访问/dev/kqemu设备文件接口调用改进加速。不过,此类模式主要针对Guest os与Host os属于统一cpu架构(比如都是x86的架构),一个明显的缺点是性能低下。

(2)上图的右侧:qemu+kvm实现的虚拟化(即qemu-kvm)

kvm只是Linux标准内核加载了一个 模块kvm.ko。也就是说KVM仅可以在 VT技术的基础上,提供虚拟的处理器和虚拟内存,至于IO硬件的模仿都交给qemu去做。

七、创建虚拟机流程


(1)标准的Linux内核中加入KVM的模块kvm.ko变身成为一个VMM(VMM Virtual-Machine-Monitor)

(2)在原有的用户模式(工作在cpu-ring3)和内核模式(工作在cpu-ring0)两种模式的基础上增加了新的客户模式。客户模式存在的特权级别与ring0-3正交。(也就是说客户模式也存在4个特权级别)

(3)用户创建虚拟机,通过调用用户模式的qemu程序,qemu与kvm提供的libkvm库为接口,传递创建指令。

(4)打开/dev/kvm文件并获得文件描述符fd后,通过ioctl指令写入KVM_CREATE_KVM,即可创建一个虚拟机,并返回一个fd_vm的虚拟机文件描述符。、

(5)获得fd_vm后,通过ioctl调用KVM_CREATE_VCPU指令,可以对fd_vm所对应的虚拟机创建vCPU,并对vCPU做初始化操作。

(6)然后通过KVM_RUN指令对fd_vcpus操作,启动运行虚拟机。


KVM 虚拟化技术:实战与原理解析 kvm虚拟化管理系统

https://blog.51cto.com/u_14402/6420529

https://zhuanlan.zhihu.com/p/702712061

KVM 介绍及作用详解_Kvm_脚本之家

相关推荐
志凌海纳SmartX3 天前
概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?
云原生·容器·kubernetes·虚拟化
爱写代码的小白.3 天前
解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“
运维·服务器·windows·vmware
奋斗的小青年I4 天前
VMware高危漏洞VMSA-2024-0019修复堆溢出和权限提升漏洞
esxi·vmware·vmsa-2024-0019
安全二次方security²5 天前
2024 RISC-V中国峰会 安全相关议题汇总
安全·虚拟化·risc-v·中国峰会·侧信道攻击·riscv optee·riscv hsm
奋斗的小青年I5 天前
从H3C和Dell官网下载OEM版VMware Esxi镜像攻略
云计算·esxi·vmware·h3c·云桌面
huoxingwen9 天前
vmware在全屏模式下快速切换回win桌面的方法
vmware·window多桌面
DreamLife☼12 天前
PVE纵览-从零开始:了解Proxmox Virtual Environment
开源·虚拟化·虚拟机·pve·all in one
DA022112 天前
VMWareTools安装及文件无法拖拽解决方案
运维·vmware
内核程序员kevin14 天前
Docker 容器网络模式详解
网络·docker·容器·vmware
Hcoco_me18 天前
宝藏虚拟化学习资料大全
学习·虚拟化