深入浅出KVM虚拟化技术原理——Ansible安全基线配置(一)

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
应用实时监控服务-应用监控,每月50GB免费额度
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 本文深入解析KVM虚拟化核心机制,涵盖内核如何调度QEMU进程与KVM模块协同工作、CPU虚拟化扩展(VT-x/AMD-V)的硬件加速原理,以及存储池的管理与优势,助你全面掌握KVM底层运行逻辑。

引言

哈喽,大家!!!该文章为KVM基础知识的扩展包,用于深入解释我的《KVM基础》中涉及的相关知识点,并有助于大家更加了解KVM

注意:如大家有更好的建议,欢迎提出,如果喜欢煮波的内容,点点关注不迷路,谢谢大家!!!

准备好了吗?发车咯!!!

一、宿主机操作内核是如何调度KVM块和QEMU(硬件模拟器)进程以及管理物理资源的

内核是一个“总调度室”。它看待一个运行的虚拟机,其实只把它当成一个普通的Linux进程,但这个进程有些特殊,因为它里面“套娃”了,具体如何呢?接下来由我为大家介绍详细步骤:

1、调度:把“虚拟机”当成“进程”来管

一句话:内核调度的是QEMU的“vCPU线程”,而不是KVM“模块

1、vCPU = 内核线程: 当QEMU启动一个有4核vCPU的虚拟机时,它实际上会在宿主机上创建4个普通的Linux线程(再加上一些辅助线程)

2、公平调度: 宿主机的Linux内核调度器(比如CFS)并不知道这是一个“vCPU”,它只把这4个线程当作系统里普普通通的线程,和你的浏览器线程、代码编辑器线程一起排队,等待分配物理CPU时间片

2、执行:KVM模块的“上岗”与“让位”

当内核调度器决定“临幸”某个vCPU线程(让它上物理CPU)时,这个线程就开始执行。这个线程会立即通过一个叫 ioctl 的系统调用,“钻”进内核态,去调用KVM模块

这时,KVM模块开始工作了:

1、VM-Entry (上岗): KVM模块启动CPU的虚拟化扩展(VT-x/AMD-V),把CPU切换到“Non-Root 模式”,然后把控制权交给Guest OS

2、Guest 运行: 此时,Guest OS直接在物理CPU上全速狂奔,宿主机内核完全不插手,效率极高

3、VM-Exit (暂停/让位): Guest OS总会遇到自己处理不了的事情,比如:
--它想访问一个模拟的硬件(比如QEMU模拟的网卡)
--它的时间片用完了(宿主机内核发出了时钟中断)
--...

4、CPU硬件自动触发 VM-Exit,暂停Guest OS,CPU切回“Root 模式”,控制权交还给KVM模块

3、I/O处理:KVM与QEMU的“踢皮球”

KVM模块拿到控制权后,会分析“VM-Exit”的原因:

情况A(KVM能处理)

比如是时钟中断。KVM自己处理一下,然后马上再次“VM-Entry”,让Guest OS继续跑

情况B(KVM处理不了)

比如Guest OS要从模拟的硬盘读数据。这是QEMU的工作

1、KVM模块会**唤醒**那个在用户态“沉睡”的**QEMU**进程

2、KVM把I/O请求(“我要读取硬盘第x块”)告诉QEMU

3、QEMU进程开始干活:它像一个普通程序一样,打开数据机上的那个.qcow2(镜像文件)虚拟磁盘文件,找到第x块数据,读出来

4、QEMU把数据准儿比好,再通过ioctl告诉KVM:“数据我放在内存里了,你让Guest OS来取吧”

5、KVM这才再次“VM-Entry”,唤醒Guest OS

4、物理资源管理:内核的“本职工作”

这反而是最简单的部分,因为虚拟机(QEMU进程)在内核眼里就是个普通进程:

内存(RAM)

1、QEMU进程启动时,会像一个普通程序一样,向宿主机内核申请一个大块内存(比如8GB)

2、宿主机内核就从物理RAM里划分给它8GB

3、KVM模块再通过CPU的内存虚拟化扩展(EPT/RVI)(本文后面有对CPU的虚拟化扩展的介绍),把这8GB内存“映射”给Guest OS,让Guest OS以为这是它独占的“物理内存”

磁盘(Disk)

1、QEMU进程打开一个.qcow2文件。在内核看来,这和Word打开一个.docx文件没区别。QEMU对这个文件的读写。都会被内核的文件系统(如ext4)正常处理

网络(NIC)

1、QEMU进程会在宿主机上创建一个tap虚拟网卡。在内核看来,这是一个普通的网络设备。QEMU发出的网络包,内核就按路由表转发waxman给tap设备的数据包,内核就交给QEMU进程

总结

内核调度QEMU线程,QEMU线程调用KVM,KVM启动Guest OS

二、CPU的虚拟化扩展

如果说KVM是“包工头”,QEMU是“全能工具箱”,那么CPU虚拟化扩展就是那个能让包工头“合法”开工的“建筑许可证”和“专用高速电梯”

简单来说,它就是CPU 硬件层面内置的、专门用来加速虚拟机运行的特殊功能(指令集)

为了让您彻底明白,我们来个“有扩展”和“没有扩展”的对比:

1、没有虚拟化扩展的时代(纯软件模拟)

在”远古时代“,CPU并不知道”虚拟机“是啥玩意

问题所在

操作系统(Guest OS)需要运行在最高权限(Ring 0)才能管理硬件。但虚拟管理器(Hypervisor)本身已经占来Ring 0

笨方法(Trap-and-Emulate 陷阱-模拟):

1、Hypervisor 只能“骗”Guest OS,让它以为自己跑在 Ring 0,其实是跑在一个较低的权限(比如 Ring 1)

2、当 Guest OS 尝试执行一个“特权指令”(比如访问硬件),CPU 会因为权限不够而“报错”(产生一个Trap,即陷阱)

3、Hypervisor 捕获这个“陷阱”

4、Hypervisor在软件层面慢吞吞地"模拟"这个指令的效果,然后在把结果返回给Guest OS

来一个生动的比喻:您(Guest OS)想开灯(特权指令),但您没有开关权限。您只能大喊一声:“我要开灯!”。 管家(Hypervisor)听到后,跑过来,用手摇发电机(软件模拟)把灯点亮,然后告诉您:“灯开好了。”

这样开销巨大,效率极低

2、拥有虚拟化扩展的时代(硬件辅助虚拟化)

CPU厂商看不下去之前使用的笨办法了,决定从硬件层面提供支持,于是就有了“CPU虚拟化扩展”
--Intel的技术:称为Intel VT-x(Virtualization Technology)
--AMD的技术:称为AMD-V(AMD Virtualization)

聪明的办法(硬件辅助虚拟化)

1、这些扩展技术在CPU层面创造来两种新模式:"Root模式"(给Hypervospr用)和”Non-Root“模式(给Guest OS用)

2、Gugest OS现在可以直接在”Non-Root模式“下运行。它在这个模式下就拥有Ring 0权限(一个 ”虚拟的Ring0“)

3、当Guest OS执行绝大多是指令时,它直接在物理CPU上全速运行,就像运行一个普通程序一样

4、只有当它执行极少数,必须由Hypervisor处理的敏感指令时(比如访问真实的物理设备I/O),CPU硬件才会自动“暂停”Guest OS(这个过程叫VM-Exit),切换到“Root模式“去通知Hypervisor

来一个生动的比喻:您(Guest OS)现在有了一个专用的房间(Non-Root 模式)。 房间里所有的电器(CPU指令)您都可以直接使用(硬件直通),只有当您需要叫“客房服务”(访问模拟的I/O设备)时,您按一下服务铃(VM-Exit),管家(Hypervisor,比如KVM0才会进来处理您的请求

三、存储池详解

一、存储池定义

存储池就是Libvirt提供的一种管理虚拟磁盘存放位置的机制。它就像专门为虚拟机硬盘建立的一个 “仓库”。您告诉Libvirt:“嘿,我把/data/kvm-storage这个目录划分出来当仓库了。Libvirt就会把这个目录管理起来,您以后创建虚拟机硬盘时,就可以直接从这个“仓库”里划分空间,非常规整

二、存储池分类

1、目录类型(dir)

这是最简单直接的一种(也是本系列教程中使用的一种)。直接使用宿主机上的一个目录作为存储池。对新手极其友好

2、LVM类型(logical)

使用LVM(逻辑卷管理器)的卷组作为存储池,性能和管理上更灵活,适合进阶用户

3、NFS/iSCSI类型

使用网络存储作为存储池

三、为什么要用存储池

1、集中管理,井井有条

所有的虚拟硬盘都存放在一个或几个预先定义的池中,查找、备份、迁移都非常方便,告别混乱

2、简化创建流程

创建虚拟机时,不再需要手动指定一个常常的硬盘文件路径,直接说在某某存储池里创建一个20G的盘就行了,Libvirt会帮您搞定剩下的事

3、资源监控

Libvirt可以轻松地告诉您每个存储池的总容量、已用空间和剩余空间,方便您进行容量规划

4、标准化操作

无论是使用virsh命令还是图形界面,操作都变得统一和标准化,大大降低里管理成本

目录
相关文章
|
10天前
|
并行计算 负载均衡 关系型数据库
超长序列并行之Ulysses + Ring-Attention技术原理与实现
本文介绍大模型长序列训练中的显存优化技术,重点解析Ulysses与Ring-Attention的融合方案。通过序列并行降低显存占用,结合zigzag切分与padding_free适配,实现高效多模态训练,在3B模型上显存从75GB降至18GB,显著提升长序列训练可行性。
311 27
|
14天前
|
人工智能 文字识别 并行计算
为什么别人用 DevPod 秒启 DeepSeek-OCR,你还在装环境?
DevPod 60秒极速启动,一键运行DeepSeek OCR大模型。告别环境配置难题,云端开箱即用,支持GPU加速、VSCode/Jupyter交互开发,重塑AI原生高效工作流。
512 35
|
18天前
|
人工智能 开发框架 安全
浅谈 Agent 开发工具链演进历程
模型带来了意识和自主性,但在输出结果的确定性和一致性上降低了。无论是基础大模型厂商,还是提供开发工具链和运行保障的厂家,本质都是希望提升输出的可靠性,只是不同的团队基因和行业判断,提供了不同的实现路径。本文按四个阶段,通过串联一些知名的开发工具,来回顾 Agent 开发工具链的演进历程。
267 40
|
22天前
|
人工智能 运维 Kubernetes
Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
在容器技术持续演进与 AI 全面爆发的当下,企业既要稳健托管传统业务,又要高效落地 AI 创新,如何在复杂的基础设施与频繁的版本变化中保持敏捷、稳定与低成本,成了所有技术团队的共同挑战。阿里云 Serverless 应用引擎(SAE)正是为应对这一时代挑战而生的破局者,SAE 以“免运维、强稳定、极致降本”为核心,通过一站式的应用级托管能力,同时支撑传统应用与 AI 应用,让企业把更多精力投入到业务创新。
332 29
|
10天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。
|
20天前
|
Kubernetes Java Go
Cloud Naive最佳开发实践
经过多年的工作,我们的精神导师John领悟了java那一套docker in docker的艺术并带到golang项目架构设计中。
373 49
|
1月前
|
人工智能 安全 Java
分布式 Multi Agent 安全高可用探索与实践
在人工智能加速发展的今天,AI Agent 正在成为推动“人工智能+”战略落地的核心引擎。无论是技术趋势还是政策导向,都预示着一场深刻的变革正在发生。如果你也在探索 Agent 的应用场景,欢迎关注 AgentScope 项目,或尝试使用阿里云 MSE + Higress + Nacos 构建属于你的 AI 原生应用。一起,走进智能体的新世界。
389 37
|
3天前
|
搜索推荐 算法 小程序
基于微信小程序的个性化漫画阅读推荐系统
本研究设计并实现基于微信小程序的个性化漫画推荐系统,结合用户行为数据与先进算法,提升阅读体验与平台黏性,推动漫画产业数字化发展。
|
21天前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
368 31