深入浅出KVM虚拟化技术原理 ——《KVM基础》知识扩展包——Ansible安全基线配置(一)

举报
Prism 发表于 2025/11/13 11:44:41 2025/11/13
【摘要】 引言哈喽,大家!!!该文章为KVM基础知识的扩展包,用于深入解释我的《KVM基础》中涉及的相关知识点,并希望这篇文章有助于大家更加了解KVM注意:如大家有更好的建议,欢迎提出,如果喜欢煮波的内容,点点关注不迷路,谢谢大家!!!准备好了吗?发车咯!!! 一、宿主机操作内核是如何调度KVM块和QEMU(硬件模拟器)进程以及管理物理资源的内核是一个“总调度室”。它看待一个运行的虚拟机,其实只把它...

引言

哈喽,大家!!!该文章为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发出的网络包,内核就按路由表转发给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命令还是图形界面,操作都变得统一和标准化,大大降低里管理成本

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。