初探KVM虚拟化技术:新手指南

news2025/3/4 20:10:15

首先了解一下虚拟化的概念

虚拟化是指对资源的逻辑抽象、隔离、再分配、管理的一个过程,通常对虚拟化的理解有广义狭义之分。广义包括平台虚拟化、应用程序虚拟化、存储虚拟化、网络虚拟化、设备虚拟化等等。狭义的虚拟化专门指计算机上模拟运行多个操作系统平台。

虚拟化的目的是通过对硬件资源的抽象和管理,实现资源的高效利用、灵活性、隔离和安全性,从而提供更高效、可靠和可扩展的计算环境。

虚拟化技术和云计算的关系:

  • 维基百科云计算定义:云计算是一种通过因特网以服务的方式提供动态可伸缩的虚拟化的资源的计算模式。
  • 云计算是建立在虚拟化技术的基础上,通过互联网提供按需的计算资源和服务。云计算提供了虚拟化技术的更高层次的抽象和服务,如虚拟机实例、容器服务、函数计算等。它提供了多租户环境、自动化管理和弹性扩展等特性,使用户可以根据实际需求快速获取和释放计算资源。
  • 虚拟化技术为云计算提供了基础的资源池和资源管理能力,使云计算可以实现资源的共享和动态分配。而云计算为虚拟化技术提供了更广阔的应用场景和服务,使其得以更好地应用于实际业务和服务交付。

KVM虚拟化技术

KVM全称是Kernel-based Virtual Machine,即基于内核的虚拟机,是采用硬件辅助虚拟化技术的全虚拟化解决方案。对于I/O设备(如硬盘、网卡等),KVM即支持QEMU仿真的全虚,也支持virtio方式的半虚。KVM从诞生开始就定位于基于硬件虚拟化支持的全虚实现,由于其在Linux内核2.6版本后被集成,通过内核加载模式使得Linux内核变成一个事实上的Hypervisor(虚拟机管理器,也叫VMM(Virtual Machine Monitor)),但是硬件管理还是由Linux Kernel来完成。

Hypervisor和VMM:

可以把hypervisor和VMM(virtual machine monitor)理解为同一样东西,它们都是用于监控和控制虚拟机操作系统。在创建虚拟机的过程中,会虚拟出一整套的硬件资源,例如硬盘、内存、CPU、网络设备等,这些工作都是由hypervisor负责,除此之外,它还负责虚拟系统运行过程的资源分配和虚拟机的生命周期管理等。

一个KVM客户机就对应一个Linux进程,每个vCPU对应这个进程下的一个线程,还有单独处理I/O的线程,属于同一个进程组。所以,宿主机上Linux Kernel可以像调度普通Linux进程一样调度KVM虚拟机,这种机制使得Linux Kernel的进程优化和调度功能优化等策略,都能用于KVM虚拟机。比如:通过进程权限限定功能可以限制KVM客户机的权限和优先级等。

由于KVM嵌入Linux内核中,除了硬件辅助虚拟化(如VT-d)的硬件设备能被虚拟机看见外,其他的I/O设备都是QEMU模拟出来的,所以QEMU是KVM天生的好基友。

可以说KVM就是在硬件辅助虚拟化技术之上构建起来的VMM。但并非要求所有硬件虚拟化技术都支持才能运行KVM虚拟化,KVM对硬件最低的依赖是CPU的硬件虚拟化支持(比如:Intel的VT-x技术和AMD的AMD-V技术),而其他的内存和I/O的硬件虚拟化支持,会让整个KVM虚拟化下的性能得到更多的提升。所以在虚拟机部署KVM功能时,首先就是要查看宿主机Host(也就是主机上的虚拟机,这里是在VMware Workstations的虚拟机打开CPU虚拟化功能。

然后在Linux系统中可以通过如下命令确定支持VT-x功能:

如果什么输出都没有,那说明你的系统并没有支持虚拟化的处理 ,不能使用KVM。

"vmx" 是 Intel CPU 的虚拟化技术标识,"svm" 是 AMD CPU 的虚拟化技术标识。

安装KVM及相关的工具:

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

qemu-kvm:KVM虚拟化的基本包

libvirt-daemon-system:libvirt守护程序,提供API和管理虚拟化功能

libvirt-clients:包含用于与libvirt守护程序通信的客户端实用程序

bridge-utils:用于创建和管理网络桥接的工具集

virt-manager:用于管理虚拟机的图形化工具

确认libvirtd服务已启动并运行:

sudo systemctl start libvirtd
sudo systemctl status libvirtd
#确保在系统启动时自动启动
sudo systemctl enable libvirtd

通过virt-manger(图形化工具)来创建或者管理虚拟机

或者通过virsh(命令行工具)来创建或者管理虚拟机

下面是一些常用的virsh命令:

  • virsh list: 列出当前运行的虚拟机
  • virsh start <domain>: 启动指定名称的虚拟机
  • virsh shutdown <domain>: 关闭指定名称的虚拟机
  • virsh reboot <domain>: 重启指定名称的虚拟机
  • virsh create <xmlfile>: 根据指定的XML文件创建虚拟机
  • virsh destroy <domain>: 强制停止指定名称的虚拟机
  • virsh undefine <domain>: 删除指定名称的虚拟机配置
  • virsh console <domain>: 进入指定名称的虚拟机控制台
  • virsh dominfo <domain>: 显示指定名称的虚拟机信息
  • virsh domstate <domain>: 显示指定名称的虚拟机状态

接下来分析一下kvm的Makefile :

可以看出kvm的Makefile主要生成三个模块,kvm.o和kvm-intel.o、kvm-amd.o。

  • kvm.o是kvm的核心模块,kvm基本只实现硬件辅助虚拟化相关部分,而不支持的用Qemu来模拟实现。
  • kvm-intel.o是intel平台架构虚拟化模块,平台相关
  • kvm-amd.o是amd架构虚拟化模块,平台相关

  资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

KVM架构

KVM是在硬件虚拟化支持下的全虚拟化技术,所以它能在相应硬件上运行几乎所有的操作系统,KVM虚拟化的核心主要由以下两个模块组成:

1)KVM内核模块,它属于标准Linux内核的一部分,是一个专门提供虚拟化功能的模块,主要负责CPU和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU执行模式的切换、vCPU寄存器的访问、vCPU的执行。

2)QEMU用户态工具,它是一个普通的Linux进程,为客户机提供设备模拟的功能,包括模拟BIOS、PCI/PCIE总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。同时它通过ioctl系统调用与内核态的KVM模块进行交互。

如上图中,在KVM虚拟化架构下,每个客户机就是一个QEMU进程,在一个宿主机上有多少个虚拟机就会有多少个QEMU进程。客户机中的每一个虚拟CPU对应QEMU进程中的一个执行线程,一个宿主机Host中只有一个KVM内核模块,所有虚拟机都与这个内核模块进行交互。

KVM内核模块

VM内核模块是KVM虚拟化的核心模块,它在内核中由两部分组成:一个是处理器架构无关的部分,用lsmod命令中可以看到,叫作kvm模块另一个是处理器架构相关的部分,在Intel平台上就是kvm_intel这个内核模块。如下图所示,KVM的主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟机运行在虚拟环境下,并对虚拟机的运行提供一定的支持。

以Intel CPU架构服务器为例,KVM打开并初始化硬件以支持虚拟机运行的过程如下:

Step1:在被内核加载的时候,KVM模块会先初始化内部的数据结构。

Step2:做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统(包括KVM模块本身)置于CPU虚拟化模式中的根模式root operation

Step3:KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令。

Step4:后续虚拟机的创建和运行,其本质上就是是一个用户空间的QEMU和内核空间的KVM模块相互配合的过程。

这里面的/dev/kvm这个设备比较关键,它可以被当作一个标准的字符设备,用来缓存用户空间与内核空间切换的上下文,也就是ioctl调用上下文,是KVM模块与用户空间QEMU的通信接口。

QEMU用户态设备模拟

QEMU原本就是一个著名的开源虚拟机软件项目,既是一个功能完整的虚拟机监控器,也在QEMU-KVM的软件栈中承担设备模拟的工作。

QEMU最初实现的虚拟机是一个纯软件的实现,也就是我们常说的通过二进制翻译来实现虚拟机的CPU指令模拟,所以性能比较低。但是,其优点是跨平台,甚至可以支持客户机与宿主机并不是同一个架构,比如在x86平台上运行ARM客户机。同时,QEMU能与主流的Hypervisor完美契合,包括:Xen、KVM、Hyper-v,以及VMware各种Hypervisor等,为上述这些Hypervisor提供虚拟化I/O设备。

而QEMU与KVM密不可分的原因,就是我们常说的QEMU-KVM软件协议栈。虚拟机运行期间,QEMU会通过KVM内核模块提供的系统调用ioctl进入内核,由KVM内核模块负责将虚拟机置于处理器的特殊模式下运行。一旦遇到虚拟机进行I/O操作时,KVM内核模块会从上次的系统调用ioctl的出口处返回QEMU,由QEMU来负责解析和模拟这些设备。除此之外,虚拟机的配置和创建,虚拟机运行依赖的虚拟设备,虚拟机运行时的用户操作环境和交互,以及一些针对虚拟机的特殊技术,比如动态迁移,都是由QEMU自己实现的。

总之,KVM 本身不执行任何模拟,需要用户空间应用程序 QEMU 通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,KVM 模块实现处理器的虚拟化和内存虚拟化。在硬件虚拟化技术的支持下,内核的 KVM 模块与 QEMU 的设备模拟协同工作,构成一套和物理计算机系统完全一致的虚拟化计算机软硬件系统。

监控KVM事件

bcc程序中提供了一个例子用来监控kvm相关事件

源码:

kvm_hypercall.py https://github.com/iovisor/bcc/blob/master/examples/tracing/kvm_hypercall.py

运行结果如下:

这个程序使用了kvm相关的以下几个tracepoint静态跟踪点:

kvm_entry:当虚拟机的vCPU(虚拟中央处理单元)从主机CPU切换到虚拟机CPU并开始执行虚拟指令时,触发kvm_entry跟踪点,vcpu_id用于标识特定的虚拟CPU。

kvm_exit:当虚拟机的vCPU执行完一段虚拟指令并从虚拟机CPU切换回主机CPU时,触发kvm_exit跟踪点,exit_reason表示虚拟cpu推出到主机cpu的具体原因。

kvm_hypercall:用于跟踪虚拟机中的超级调用(hypercall)。当虚拟机的Guest OS需要执行一些更高权限的操作(如:页表的更新、对物理资源的访问等)时,由于自身在非特权域无法完成这些操作,于是便通过超级调用交给Hypervisor来完成这些操作,其中nr代表超级调用号。

kvm_exit中的exit_reason:

上图中的12,18,32分别代表访问任务优先级寄存器(TP),操作系统特定事件,处理器处于AP复位保持状态。

hypercall_nr(超级调用号):

5号超级调用表示请求Hypervisor程序将处于休眠状态的 vCPU 唤醒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓设备监听全部输入信号

前言&#xff1a; 最近团队收到一个产品需求&#xff0c;需要监听安卓设备上用户是否有输入行为&#xff0c;以免定制推荐的时候打搅到用户。这里指的是设备上所有应用的输入行为&#xff0c;而不是单指某一个应用。 这个需求还是蛮有挑战性的&#xff0c;需要涉及到很多FW层…

Java设计模式之模板模式

1. 模板模式介绍 1、模板模式即模板方法模式自定义了一个操作中的算法骨架&#xff0c;而将步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构&#xff0c;可以自定义该算法的某些特定步骤&#xff1b; 2、父类中提取了公共的部分代码&#xff0c;便于代码复用&am…

PyTorch深度学习实战(5)——计算机视觉基础

PyTorch深度学习实战&#xff08;5&#xff09;——计算机视觉基础 0. 前言1. 图像表示2. 将图像转换为结构化数组2.1 灰度图像表示2.2 彩色图像表示 3 利用神经网络进行图像分析的优势小结系列链接 0. 前言 计算机视觉是指通过计算机系统对图像和视频进行处理和分析&#xff…

Scala(二)

第2章 变量和数据类型 2.1 注释 Scala注释使用和Java完全一样。 注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来&#xff0c;再用代码去体现。 1&#xff09;基本语法 &#xff08;1&#xff09;单行注释&#xff1a;// &#xff08;2&#xff0…

高时空分辨率、高精度一体化预测技术的风、光、水自动化预测技术的应用

第一章 预测平台讲解及安装 一、高精度气象预测基础理论介绍 综合气象观测数值模拟模式&#xff1b; 全球预测模式、中尺度数值模式&#xff1b; 二、自动化预测平台介绍 Linux系统 Crontab定时任务执行机制 Bash脚本自动化编程 硬件需求简介 软件系统安装 …

独立站该怎么带来客户流量?来看看这五大方法吧!

建立独立站是为了让更多的人知道你的品牌和产品&#xff0c;从而吸引潜在客户并转化为销售机会。以下是一些可以帮助独立站带来客户流量的方法&#xff1a; 01.SEO&#xff08;搜索引擎优化&#xff09;&#xff1a; 优化网站的SEO&#xff0c;使得搜索引擎能够更好地找到你的…

MyBatis之慎用association

这里先总结一下 association 存在的问题。 一、内嵌查询时存在报错Id找不到及内存溢出隐患 二、一对多关系数据重复问题 三、多层嵌套内层 association 查询结果为null 或 非预期的值 一、内嵌查询时存在报错Id找不到及内存溢出隐患 参考&#xff1a; https://www.lmlphp.co…

DP358/321/323/324运算放大器芯片

DP358、DP321、DP323、DP324是一款低噪声、低压、低 功耗轨到轨输出运放大器&#xff0c;该系列放大器的增益带宽为 11MHz,压摆率为 8.5V/uS,其中DP323 在掉电工作模式下待机电流小于1uA。该系列放大器可以广泛应用于各种电子产品领域。 主要特性&#xff1a; 轨到轨最大输入…

电脑提示msvcr110.dll丢失怎样修复呢?推荐三个修复方法

Windows系统总是不可避免会出现系统报错&#xff0c;提示msvcr110.dll丢失&#xff0c;无法运行启动软件程序&#xff0c;主要就是由于系统的msvcr110.dll丢失或者损坏。msvcr110.dll是Microsoft Visual C Redistributable软件包中的一个文件&#xff0c;它是由Microsoft Visua…

【文生图系列】Stable Diffusion Webui安装部署过程中bug汇总(Linux系统)

文章目录 bugs虚拟环境pythongfpgan和cython bugs 看网上部署stable diffusion webui的教程&#xff0c;很简单。而且我也有部署stable diffusion v1/v2的经验&#xff0c;想着应该会很快部署完stable diffusion webui&#xff0c;但是没想到在部署过程中&#xff0c;遇到各种…

【数据分析 - 基础入门之pandas篇③】- pandas数据结构——DataFrame

文章目录 前言一、DataFrame创建1.1 字典创建1.2 NumPy二维数组创建 二、DataFrame切片2.1 行切片2.2 列切片2.3 行列切片 三、DataFrame运算3.1 DataFrame和标量的运算3.2 DataFrame之间的运算3.3 Series和DataFrame之间的运算 四、DataFrame多层次索引4.1 多层次索引构造1.隐…

AJAX异步请求JSON数据格式

目录 前言 1.AJAX的实现方式 1.1原生的js实现方式 1.2JQuery实现方式 2.1语法 3.JSON数据和Java对象的相互转换 3.1将JSON转换为Java对象 3.2将Java对象转换为JSON 前言 AJAX&#xff1a;ASynchronous JavaScript And XML 异步的JavaScript 和 XML。 Ajax 是一种在…

在安卓里用c++显示骨骼动画

1. 程序模块图 2. 编译第三方库Assimp 2.1 下载 官网下载5.0.0版本,https://codeload.github.com/assimp/assimp/zip/refs/tags/v5.0.0 2.2 生成安卓编译链 解压后在assimp-5.0.0下建文件夹BuildAssimp 放两个脚本make_standalone_toolchain.bat python D:/Android/Sdk/nd…

安达发|各部门实施APS系统前后有哪些变化?

众所周知&#xff0c;生产计划部门是制造企业的重要部门&#xff0c;承担销售、采购、仓储、质量检验和生产的各个部门的协调工作。APS 先进计划排程系统系统通过人工智能算法跟踪所有资源&#xff0c;包括材料、设备、人员、客户需求、订单变更等&#xff0c;自动快速计算出“…

odoo-031 odoo13和odoo16的网站上添加显示变体描述 Website Add Variant Description

文章目录 测试环境需求描述实现步骤实际效果思路说明 测试环境 Odoo 版本&#xff1a; odoo13 和 odoo16 Python 版本&#xff1a;3.6.9 操作系统&#xff1a;Ubuntu 18.04 需求描述 添加变体描述&#xff0c;显示在 form 视图&#xff1b;在网站上动态显示产品变体描述。 …

QT之智能指针

如果没有智能指针&#xff0c;程序员必须保证new对象能在正确的时机delete&#xff0c;四处编写异常捕获代码以释放资源&#xff0c;而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会…

在 3ds Max 中创建逼真的玻璃材质

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 尽管本教程基于 3ds Max&#xff0c;但相同的设置适用于许多其他 3D 产品。 注意&#xff1a;单击每个步骤中的缩略图可查看更大的屏幕截图&#xff0c;其中包括视口和用户界面的相关部分。 步骤 1由于本教…

Linux的权限管理精细总结

&#xff08;该图由AI绘制 关注我 学习AI画图&#xff09; 目录 一、权限概述 1、权限的基本概念 2、为什么要设置权限 3、Linux用户身份类别 4、user文件拥有者 5、group文件所属组内用户 6、other其他用户 7、特殊用户root 二、普通权限管理 1、ls -l命令查看文件…

LED显示屏的8个常见信号干扰因素及解决方法

LED显示屏在使用过程中可能会受到多种信号干扰因素的影响&#xff0c;导致显示效果不理想或出现问题。以下是LED显示屏常见的信号干扰因素以及对应的解决方法&#xff1a; 1&#xff0c;电源干扰&#xff1a; 干扰因素&#xff1a;电源波动、电源噪声等。 解决方法&#xff1a…

jenkins发布使用邮件添加审批

首先安装好Email Extension Plugin插件并在 system下配置好邮件 然后配置流水线需要的参数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/418fc89bfa89429783a1eb37d3e4ee26.png#pic_center pipeline如下&#xff1a; def skipRemainingStages false //是否跳过生…