1. IaaS项目到openstack到libvirt到qemu-kvm
IaaS项目的丰富的表现层和复杂的逻辑的基础的实质就是虚拟化技术本身。
你会去购买一个具有完善策略管理功能但是创建虚拟机的过程中不稳定的IaaS平台吗?反过来到还可以考虑考虑。
就好比褪去了浮华的外表后,最核心和本质的东西才是最有价值的东西,所以我们必须要了解虚拟化。
从上层逐步追问到,谁是本质?
IaaS项目通常有独立的虚拟化管理软件抽象层,跟随当今的主流开源项目,会是openstack和cloudstack的api调用整合的代码。
那么再往下呢?
是kvm,qemu,vmware,xen,hyper-v,lxc这些具体的hypervisor吗?
还真不是。
kvm,xen和qemu的调用还是比较复杂的,并且功能类似。所以redhat就整体的有抽象了一层libvirt。
vmware这货呢?你需要调用它的api,两类:直接管理ESXi和通过vc管理一个集群。
hyper-v的微软的奇葩自然也有自己的独特的api楼。
所以一个简单的启动虚拟机动作,经过了
IaaS(web)-- [openstackAPI] -- openstack -- [libvirtAPI] -- libvirt -- [qemu-kvm的API]-- qemu-kvm
2. qemu和kvm到底是什么关系
qemu的诞生要早很多,qemu是个全能的模拟器,能够模拟出一个有完备功能的虚拟机来。问题是他是纯软件模拟。
软件模拟怎么了? 每条CPU指令都得翻译,内存页也是反复映射。
kvm是建立在硬件辅助虚拟化基础上的,kvm的作者很能偷懒,他没有像xen那样完全接管操作系统的功能,而是作为一个插件
并且他只负责虚拟化cpu和内存,其他的事情他不做,还管了中断和动态添加物理设备。
也就是说kvm是个瘸子,单独的他根本就模拟不出一个虚拟机来。
qemu一看kvm不错呀,性能能提升那么多。kvm一看qemu不错呀,其他的活都干了。
这就是一拍即合,qemu-kvm,就是qemu的改装版,把所有的cpu和内存虚拟化的内容全部替换成kvm的了。
3. kvm
https://www.kernel.org/doc/Documentation/virtual/kvm/api.txt api列表和原理
所有的kvm的api,均是对/dev/kvm进行ioctl操作。分为三类。
system_ioctls:KVM_CREATE_VM (内核空间定义了一个fd描述虚拟机,可以处理vm_ioctl)
vm_ioctls:KVM_CREATE_VCPU (对fd描述虚拟机,可以创建vcpu,并且在内核空间顶一个一个fd描述vcpu)
vcpu_ioctls:实际使用vcpu,通过对内核空间的描述vcpu的fd进行操作
4. kvm api的最简单的例子
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #include <linux/kvm.h> #define KVM_FILE "/dev/kvm" int main() { int dev; int ret; dev = open(KVM_FILE,O_RDWR|O_NDELAY); ret = ioctl(dev,KVM_GET_API_VERSION,0); printf("----KVM API version is--%d---\n",ret); ret = ioctl(dev,KVM_CHECK_EXTENSION,KVM_CAP_NR_VCPUS); printf("----KVM supports MAX_VCPUS per guest(VM) is %d---\n",ret); ret = ioctl(dev,KVM_CHECK_EXTENSION,KVM_CAP_IOMMU); if(ret != 0) printf("----KVM supports IOMMU (i.e. Intel VT-d or AMD IOMMU).----\n"); else printf("----KVM doesn't support IOMMU (i.e. Intel VT-d or AMD IOMMU).----\n"); return 0; }