| |
|
开发:
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公司收购 ·? 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:
本文介绍的是基于 X86 CPU 的 KVM。 KVM架构: kvm是基于虚拟化扩展(Intel VT 或者 AMD-V)的X86硬件的开源的Linux原生的全虚拟化解决方案,kvm中,虚拟机被实现为常规的一个linux进程,有标准的调度程序进行调度,虚拟机的每个虚拟cpu也被实现为一个linux进程,这使用kvm能够使用Linux内核已有的功能,但kvm本身不执行任何硬件的模拟,需要客户空间程序通过, /dev/kvm,接口设置一个客户机虚拟服务器的空间地址,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏,目前的这个程序是QEMU
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,执行Guest非IO操作指令。 KSM机制 扫描物理内存,发现多个虚拟机实例有相同的内存空间,合并成为一个共享内存空间,节省内存。 ? qemu工具
·? libvirt工具
·? 集群工具: Kvm 工作原理的基本阐释: ? ? ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |