IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> KVM底层工作原理 -> 正文阅读

[系统运维]KVM底层工作原理

以色列qumranet公司研发,后被RedHad公司收购
(1)kvm只支持x86平台
(2)依赖于 HVM,inter VT AMD-v

·? KVM是(Kernel-based Virtual Machine)的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。

·? KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。

其中,KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:

  • 它由?Quramnet 开发,该公司于 2008年被?Red Hat 收购。
  • 它支持?x86 (32 and 64 位), s390, Powerpc 等 CPU。
  • 它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
  • 它需要支持虚拟化扩展的 CPU。
  • 它是完全开源的。官网

本文介绍的是基于 X86 CPU 的 KVM。

KVM架构: kvm是基于虚拟化扩展(Intel VT 或者 AMD-V)的X86硬件的开源的Linux原生的全虚拟化解决方案,kvm中,虚拟机被实现为常规的一个linux进程,有标准的调度程序进行调度,虚拟机的每个虚拟cpu也被实现为一个linux进程,这使用kvm能够使用Linux内核已有的功能,但kvm本身不执行任何硬件的模拟,需要客户空间程序通过, /dev/kvm,接口设置一个客户机虚拟服务器的空间地址,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏,目前的这个程序是QEMU
Linux上的用户空间,内核空间和虚拟机:

  • Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
  • KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
  • QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。

kvm底层的虚拟化过程和原理:?

kvm是基于虚拟化扩展的行x86硬件的开源的linux原生的全虚拟化解决方案,在kvm中,虚拟化被实现为常规的Linux进程,有标准Linux调度程序进行调度, 虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。

KVM的核心组件:

1,kvm,ko内核模块:

(kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能;它的主要负责是虚拟机的创建,虚拟内存的分配,虚拟cpu寄存器,的读写和虚拟cpu的运行.

2.qemu-kvm:用户空间的工具程序

该组件是一个通用的开源机器模拟器和虚拟器,其主要的功能是用于模拟虚拟机的用户空间组件,提供io设备模型,访问外设的途径.

qemu是纯软件的虚拟化模拟器,几乎可以模拟任何硬件设备,,

最熟悉的是能够模拟一台独立的虚拟机,虚拟机认为自己和虚拟机打交道,但其实是和qemu虚拟出来的硬件交互,qemu将这些正真的指令转译给真正的硬件.

正因为Qemu是纯软件实现的,所有的指令都要经过qemu过一手,性能非常低,所以,在生产环境中,所以在生产环境中,Qemu配合KVM来完成虚拟化工作,因为kvm是硬件辅助的虚拟化技术,主要负责比较繁琐的cpu虚拟化和内存虚拟化,而QEMU则负责IO设备虚拟化,两者合作发挥自身的优势,相得益彰

?

?

从本质上看,虚拟出的每个虚拟机对应宿主机上的qemu进程,而虚拟机的执行线路(cpu线路,io线路)对用qemu进程中的一个线程,

下面通过启动一个虚拟机来讲解kvm 与QEmu是怎么交互工作的

第一步: 获取到kvm句柄

kvmfd = open("/dev/kvm", O_RDWR);

// 第二步,创建虚拟机,获取到虚拟机句柄。

vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);

第三步: 为虚拟机映射内存,还有其他的pci,信号处理的初始化

ioctl(kvmfd, KVM_SET_USER_MEMORY_REGION, &mem);

第四部: 将虚拟机镜像映射到内存中,想当于物理机的boot过程

第五步:创建vcpu(虚拟cpu),并为vcpu分配内存空间,

ioctl(kvmfd, KVM_CREATE_VCPU, vcpuid);

vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, KVM_GET_VCPU_MMAP_SIZE, 0); //

第六步: 创建vcpu个数的线程并运行虚拟机

ioctl(kvm->vcpus->vcpu_fd, KVM_RUN, 0);

第七步: 线程进入循环,并捕获虚拟机退出原因,作出处理

for (;;) { ioctl(KVM_RUN) switch (exit_reason) {

case KVM_EXIT_IO: /* ... */ case KVM_EXIT_HLT: /* ... */

} }

这里的退出并不一定是虚拟机关机,

// 虚拟机如果遇到 I/O 操作,访问硬件设备,缺页中断等都会退出执行,

// 退出执行可以理解为将 CPU 执行上下文返回到 Qemu。

??? qemu-kvm进程:工作用于用户空间,用于实现io设备模拟,用于实现虚拟机实例.

3libvirt:工具箱用于与主流os虚拟化进行交互工具

libvirt是cs架构应用:

客户端:libvirt-client

virt-manager

daemon:图像化工具

libvirt-deaemon

3,kvm中vcpu在运行模式下运行:

kvm模块load进内存之后,系统的运行模式:

内核模式: Kernel Mode)运行KVM内核,实现模式的切换(VM Exit/VM Entry),执行特权与敏感指令。GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式.

用户模式: User Mode)运行QEMU,实现IO模拟与管理。,用于代为Guest os发出io请求.

客户模式:(Guest Mode)运行GuestOS,执行GuestIO操作指令。

KSM机制

扫描物理内存,发现多个虚拟机实例有相同的内存空间,合并成为一个共享内存空间,节省内存。

? qemu工具

  • qemu-kvm:用户空间的工具程序,创建管理虚拟机
  • qemu-img:是 QEMU 的磁盘管理工具

·? libvirt工具

  • GUI:virt-manager, virt-viewer:图形化管理
  • CLI: virsh, virt-install:创建管理虚拟机

·? 集群工具:
libvirtd:管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。Libvirt是一个C工具包的虚拟化功能与最新版本的Linux(以及其他操作系统)。主包包含libvirtd服务器虚拟化支持出口。

Kvm 工作原理的基本阐释:
用户模式的qume利用libkvm通过ioctl进入内核模式,kvm模块
为虚拟机创建了虚拟内存,虚拟cpu后执行VMLUAC指令进入到客户模式,,加载guest os并执行,如果 guest os 发生外部中断,或者缺页等情况就会暂停执行guest os,退出客户模式,进行异常处理,内核模式处理这些异常时如果不需要I/O则处理完成后重新进入客户模式,如果需要I/O则进入到用户模式,由Qemu来处理I/O,处理完成后进入内核模式,再进入客户模式

?

?

?

?

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 18:01:17  更:2022-05-18 18:02:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:24:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码