目前正在学习虚拟化软件KVM相关运行原理、过程,对源码的分析进行了总结,只是为了学习交流使用,若有不正确的地方,希望大家提出。
由于有一些代码结构图或者是架构图上传比较麻烦,所以博文都放在了自己的个人博客上,麻烦大家移步查看:
总入口:我的个人blog:http://www.royluo.org
文章列表(可直接点击进入)
根据这段时间对Linux KVM的研究,现将KVM的安装与Virtual OS的启动进行总结说明。【点击查看完整文章】
《kvm安装与启动过程说明》进行了通用桌面系统的虚拟机安装。在本文中将介绍自行编译linux Kernel内核源码,无桌面OS虚拟机安装和启动。为后续内核调试打下基础。【点击查看完整文章】
传统OS环境中,CPU对内存的访问都必须通过MMU将虚拟地址VA转换为物理地址PA从而得到真正的Physical Memory Access,即:VA->MMU->PA。虚拟运行环境中由于Guest OS所使用的物理地址空间并不是真正的物理内存,而是由VMM供其所使用一层虚拟的物理地址空间,为使MMU能够正确的转换虚实地址,Guest中的地址空间的转换和访问都必须借助VMM来实现,这就是内存虚拟化的主要任务,即:GVA->MMU Virtualation->HPA。【点击查看完整文章】
在嵌套虚拟环境(Nested Virtualization)下,运行在hypervisor上的Virtual Machine仍可以作为hypervisor去运行其它的Virutal Machine,而KVM也支持了这种强大的特性。而在《KVM硬件辅助虚拟化之 EPT》一文中,我们详细分析了单层虚拟机并引入硬件辅助虚拟化EPT功能的环境下,Guest OS中的虚拟地址到真实物理地址的访问方法,即在EPT页表的帮助下,通过二维的页表机制,最终实现GVA到HPA的转换。那么在多层嵌套虚拟机情况下,EPT又是如何发挥作用的呢?【点击查看完整文章】
本篇主要讲述“前端网络流的建立”。【点击查看完整文章】
上文针对Qemu在前端网络流路径的建立方面做了详细的描述,数据包从Host的物理网卡经过Host Linux内核中的Bridge, 经过Tap设备到达了Qemu的用户态空间。而Qemu是如何把数据包送进Guest中的呢,这里必然要说到到虚拟网卡的建立。
当命令行传入nic相关参数时,Qemu就会解析网络相关的参数后进入虚拟网卡的创建流程。而在上文中提到对于所有-net类型的设备,都视作一个net client来对待。而在net client的建立之前,需要先创建Qemu内部的hub和对应的port,来关联每一个net client,而对于每个创建的-net类型的设备都是可以可以配置其接口的vlan号,从而控制数据包在其中配置的vlan内部进行转发,从而做到多个虚拟设备之间的switch。【点击查看完整文章】
1. Xen
2. KVM
3. VMware's VMI
4. IBM's System p
5. IBM's System z
6. User Mode Linux
7. lguest
8. IBM's legacy iSeries
而新的系统也在不断的涌现,各个系统在网络设备、块设备、console及其它设备驱动在新特性支持和性能优化方面存在着瓶颈。
为解决这些问题,Rusty Russell开发了virtio机制,其是一个在hypervisor之上的抽象API接口,让客户机知道自己运行在虚拟化环境中,从而与hypervisor根据virtio标准协作,从而在Guest中达到更好的性能(特别是I/O性能),关于virtio在其论文中如此定义:【点击查看完整文章】
virtio设备对于Linux Kernel中的设备类型来说是作为pci设备被使用的,因此具有pci设备的所有属性,所以其也具备了PCI配置空间。【点击查看完整文章】
KVM上设备I/O虚拟化的性能问题长期存在,此时由Rusty Russell开发的virtio引起了开发者们的注意并逐渐被KVM等虚拟化平台接纳并作为了其I/O虚拟化最主要的一个通用框架。
Virtio使用virtqueue来实现其I/O机制,每个virtqueue就是一个承载大量数据的queue。vring是virtqueue的具体实现方式。【点击查看完整文章】