资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,KVM系统架构和原理,虚拟化简史,虚拟化分类,基于二进制翻译的全虚拟化Full Virtualization with Binary Translation,软件辅助虚拟化或者半虚拟化/操作系统辅助虚拟化 Paravirtualization,硬件辅助的全虚拟化,1,、,基于二进制翻译的全虚拟化,VMM,通过模拟全部硬件平台,,BIOS,、,CPU,、内存、磁盘、网卡等。,WMM,将,GUEST,应用包括,OS,,通过二进制转译成宿主机指令执行,并且模拟硬件,IO,中断与宿主机交互。,Qemu是一个模拟器,它向Guest OS模拟CPU和其他硬件,Guest OS认为自己和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。由于所有的指令都要从Qemu里面过一手,因而性能较差。,2、软件辅助虚拟化半虚拟化,半虚拟化的思想就是,修改guest操作系统内核,替换掉不能虚拟化的指令,通过超级调用hypercall直接和底层的虚拟化层hypervisor来通讯,hypervisor 同时也提供了超级调用接口来满足其他关键内核操作,比方内存管理、中断和时间保持,Xen为代表。,3,、硬件辅助虚拟化,2005年后,CPU厂商Intel 和 AMD 开场支持虚拟化了。 Intel 引入了 Intel-VT Virtualization Technology技术。,Intel-VT CPU,有 VMX root operation 和 VMX non-root operation两种模式。这样,VMM 可以运行在 VMX root operation模式下,客户 OS 运行在VMX non-root operation模式下。,而且两种操作模式可以互相转换。运行在 VMX root operation 模式下的 VMM 通过显式调用 VMLAUNCH 或 VMRESUME 指令切换到 VMX non-root operation 模式,硬件自动加载 Guest OS 的上下文,于是 Guest OS 获得运行,这种转换称为 VM entry。,Guest OS 运行过程中遇到需要 VMM 处理的事件,例如外部中断或缺页异常,或者主动调用 VMCALL 指令调用 VMM 的效劳的时候与系统调用类似,硬件自动挂起 Guest OS,切换到 VMX root operation 模式,恢复 VMM 的运行,这种转换称为 VM exit。VMX root operation 模式下软件的行为与在没有 VT-x 技术的处理器上的行为根本一致;而VMX non-root operation 模式那么有很大不同,最主要的区别是此时运行某些指令或遇到某些事件时,发生 VM exit。,三种虚拟化技术的比照,利用二进制翻译的全虚拟化,操作系统协助/半虚拟化,硬件辅助虚拟化,实现技术,BT和直接执行,Hypercall,遇到特权指令转到root模式执行,客户操作系统修改/兼容性,无需修改客户操作系统,最佳兼容性,客户操作系统需要修改来支持hypercall,兼容性差,不支持Windows,无需修改客户操作系统,最佳兼容性,性能,差,好。半虚拟化下CPU性能开销几乎为0,虚机的性能接近于物理机。,CPU需要在两种模式之间切换,带来性能开销;但是,其性能在逐渐逼近半虚拟化。,应用厂商,VMware Workstation/QEMU/Virtual PC,Xen,VMware ESXi/Microsoft Hyper-V/Xen 3.0/KVM,什么是,KVM?,KVM是嵌入在Linux操作系统标准内核中的一个虚拟化模块,它能够将一个Linux标准内核转换成为一个VMM,嵌有KVM模块的Linux标准内核可以支持通过kvm tools来进展加载的GuestOS。所以在这样的操作系统平台下,计算机物理硬件层上直接就是VMM虚拟化层,而没有独立出来的HostOS操作系统层。在这样的环境中HostOS就是一个VMM。,每个由KVM创立的GuestOS都是HostOS(或VMM)上的一个单个进程。而在GuestOS上的User-space中运行的Applications可以理解为就是进程中的线程。,什么是,QEMU-KVM,首先,Qemu本身并不是KVM的一局部,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相比照较低。,而广义的KVM实际上包含两局部,一局部是基于Linux内核支持的KVM内核模块,另一局部就是经过简化和修改Qemu。,kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备。,qemu模拟IO设备网卡,磁盘等,kvm加上qemu之后就能实现真正意义上效劳器虚拟化。因为用到了上面两个东西,所以称之为qemu-kvm。,Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能。,QEMU-KVM,工作原理,QEMU-KVM 相比原生 QEMU 的改动:,原生的 QEMU 通过指令翻译实现 CPU 的完全虚拟化,但是修改后的 QEMU-KVM 会调用 ICOTL 命令来调用 KVM 模块。,原生的 QEMU 是单线程实现,QEMU-KVM 是多线程实现。,主机 Linux 将一个虚拟视作一个进程,该进程包括下面几种线程:,I/O 线程用于管理模拟设备,vCPU 线程用于运行 Guest 代码,其它线程,比方处理 event loop,offloaded tasks 等的线程,虚拟机的内存是由宿主机通过mmap调用映射给虚拟机的,而vCPU是宿主机的一个线程,这个线程通过设置相应的vCPU的存放器指定了虚拟机的程序加载地址后,开场运行虚拟机的指令,当虚拟机执行了IO操作后,CPU捕获到中断并把执行权又交回给宿主机.,网卡I/O虚拟化1,网卡I/O虚拟化virio2,网卡I/O虚拟化3,块设备I/O虚拟化virio,虚拟机启动过程,第一步,获取到kvm句柄:vmfd = open(/dev/kvm, O_RDWR);,第二步,创立虚拟机,获取到虚拟机句柄。,vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);,第三步,为虚拟机映射内存,还有其他的PCI,信号处理的初始化。,ioctl(kvmfd, KVM_SET_USER_MEMORY_REGION, ,第四步,将虚拟机镜像映射到内存,相当于物理机的boot过程,把镜像映射到内存。,第五步,创立vCPU,并为vCPU分配内存空间。,ioctl(kvmfd, KVM_CREATE_VCPU, vcpuid);,第五步,创立vCPU个数的线程并运行虚拟机。,ioctl(kvm-vcpus-vcpu_fd, KVM_RUN, 0);,第六步,线程进入循环,并捕获虚拟机退出原因,做相应的处理。,这里的退出并不一定是虚拟机关机,虚拟机如果遇到IO操作,访问硬件设备,缺页中断等都会退出执行,退出执行可以理解为将CPU执行上下文返回到QEMU。,THANK YOU!,谢谢大家!,
展开阅读全文