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

简介: 本文深入解析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命令还是图形界面,操作都变得统一和标准化,大大降低里管理成本

目录
相关文章
|
3月前
|
监控 安全 Linux
使用 Ansible 自动化部署 Snort3 入侵检测系统:从零到生产环境(RedHat)
本文介绍如何使用Ansible自动化部署Snort3入侵检测系统,涵盖从环境准备、分层架构设计到生产级配置的完整流程。通过基础设施即代码实现一键部署、配置验证与规则管理,提升部署效率与一致性,助力企业快速构建可靠的网络安全防线。(238字)
227 11
|
4月前
|
运维 监控 数据可视化
从巴比馒头的“洗菜流水线”,来看“telemetry pipeline”工具的火热兴起
以巴比馒头自动化洗菜为喻,探讨运维领域“数据清洗”难题。DataHub作为国产可视化遥测管道工具,支持多源数据接入与低代码编排,实现日志、指标、链路等数据的高效处理与统一管理,助力企业构建高质量可观测体系。(238字)
|
3月前
|
运维 监控 数据可视化
故障发现提速 80%,运维成本降 40%:魔方文娱的可观测升级之路
魔方文娱携手阿里云构建全栈可观测体系,实现故障发现效率提升 80%、运维成本下降 40%,并融合 AI 驱动异常检测,迈向智能运维新阶段。
397 53
|
3月前
|
缓存 Linux KVM
深入浅出KVM内存管理——Ansible安全基线配置(一)
本文介绍了KVM的内存管理机制设计,用于帮助大家更深入理解KVM的内存管理
301 4
|
4月前
|
机器学习/深度学习 开发框架 人工智能
81_Few-Shot提示:少样本学习的技巧
在大型语言模型(LLM)时代,提示工程(Prompt Engineering)已成为释放模型潜力的关键技能。其中,Few-Shot Prompting作为一种强大的技术,通过提供少量高质量的示例,显著提升模型在复杂任务上的性能。2025年,随着模型规模和能力的持续增长,Few-Shot Prompting技术也在不断演进,从简单的示例提供发展到更加精细化的优化策略。
|
3月前
|
JSON 网络安全 数据格式
深入浅出Ansible技术原理——Ansible安全基线配置(一)
本系列深入解析Ansible安全自动化,涵盖其无代理、幂等性、声明式三大设计哲学,剖析基于Python的内核原理与SSH通信机制,并详解Inventory、Roles、Handlers、Vault等核心组件与最佳实践,助你从入门到精通,构建高效、安全、可复用的自动化运维体系。
239 7
|
3月前
|
安全 Ubuntu 应用服务中间件
基于code-server的云端编程环境部署
本文档描述如何在 Ubuntu 主机上部署 code-server(即“网页版 VS Code”),并通过 autossh 将服务反向隧道到跳板机、使用 Nginx 反向代理域名访问、以及使用 certbot 配置 HTTPS。适合在多设备间共享同一开发环境、并解决个人主机动态公网 IP 的访问问题。
843 5
|
3月前
|
存储 Kubernetes 数据库
K3S ——轻量化K8S 入门指南
本文介绍轻量级Kubernetes发行版K3s,适用于边缘计算、IoT等场景。涵盖其架构、安装部署(单节点/高可用/离线)、核心组件、网络存储配置及生产建议,助力快速构建轻量化容器平台。
668 4
|
3月前
|
运维 监控 网络协议
云拨测:当“正常变更”摧毁全球网络时,谁来守护你的业务可用性?
一次权限变更,引发全球边缘网络瘫痪4小时,数百万网站返回 5XX,连状态页也宕机。故障源于“正常的变更”,暴露了企业对服务商的盲目信任。当内部监控失效,唯有云拨测能从真实用户视角,独立验证“服务是否可用”。
197 42
|
3月前
|
监控 安全 Linux
Linux如何部署服务并设置为开机自启
系统ctl命令用于管理Linux服务,包括启动、停止、重启和重载配置等操作。journalctl命令可查看特定服务日志。编写服务文件时需定义[Unit]、[Service]和[Install]部分,通过systemctl管理新服务并设置开机自启。
325 14