深入浅出KVM虚拟化技术原理 ——《KVM基础》知识扩展包——Ansible安全基线配置(一)
引言
哈喽,大家!!!该文章为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命令还是图形界面,操作都变得统一和标准化,大大降低里管理成本
- 点赞
- 收藏
- 关注作者
评论(0)