当前位置: 首页 > news >正文

【虚拟化】KVM概念和架构

目录

一、什么是KVM?

二、KVM的功能

2.1 主要的功能

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_脚本之家

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鸿蒙开发FA模型和Stage模型
  • 配置本地软件仓库
  • FPGA开发——按键控制数码管的设计
  • MybatisPlus(二)
  • 卢松松:分享6个短视频拍摄设备
  • Linux Vim教程(十四):使用Vim进行项目管理
  • 基因克隆技术在医学领域的应用有哪些局限性?
  • 异常 29
  • Win10安装node版本管理工具nvm
  • MySQL学习笔记第三天
  • Prompt提示工程上手指南:基础原理及实践-Prompt个性知识库引导
  • 【Golang】短链接系统
  • matlab中的双层数值积分
  • 这本vue3编译原理开源电子书,初中级前端竟然都能看懂
  • 3.插件化系列之动态加载class示例
  • Flannel解读
  • js如何打印object对象
  • laravel 用artisan创建自己的模板
  • MySQL数据库运维之数据恢复
  • PAT A1050
  • Vim Clutch | 面向脚踏板编程……
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 开源地图数据可视化库——mapnik
  • 判断客户端类型,Android,iOS,PC
  • 批量截取pdf文件
  • 算法---两个栈实现一个队列
  • 跳前端坑前,先看看这个!!
  • 网络应用优化——时延与带宽
  • 在Mac OS X上安装 Ruby运行环境
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​ssh免密码登录设置及问题总结
  • ​插件化DPI在商用WIFI中的价值
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $ git push -u origin master 推送到远程库出错
  • $L^p$ 调和函数恒为零
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (七)Activiti-modeler中文支持
  • (转)h264中avc和flv数据的解析
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .Net - 类的介绍
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET中统一的存储过程调用方法(收藏)
  • /boot 内存空间不够
  • @angular/cli项目构建--http(2)
  • [15] 使用Opencv_CUDA 模块实现基本计算机视觉程序
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...