平常工作中使用了虚机环境,所以要了解下qemu,kvm,libvirt相关概念及三者关系,技术方面的在后续学习后在输出。
QEMU
Qemu是一个模拟器,它向Guest OS模拟CPU和其他硬件,Guest OS认为自己和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。由于所有的指令都要从Qemu里面过一手,因而性能较差。
KVM
KVM是linux内核的模块,它需要CPU的支持,采用硬件辅助虚拟化技术Intel-VT,AMD-V,内存的相关如Intel的EPT和AMD的RVI技术,Guest OS的CPU指令不用再经过Qemu转译,直接运行,大大提高了速度,KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问这个接口。见如下伪代码:
open("/dev/kvm") ioctl(KVM_CREATE_VM) ioctl(KVM_CREATE_VCPU) for (;;) { ioctl(KVM_RUN) switch (exit_reason) { case KVM_EXIT_IO: case KVM_EXIT_HLT: } }
KVM内核模块本身只能提供CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完成的虚拟化技术,这就是下面要说的qemu-kvm。
qemu-kvm
Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做。kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备。qemu模拟IO设备(网卡,磁盘等),kvm加上qemu之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以称之为qemu-kvm。Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能。
qemu-kvm工作模式
在qemu全虚拟化的模式下,当客户机的设备驱动发起IO请求时,KVM会捕获这次IO请求,进行初步处理之后放入将IO请求放入KVM和qemu的共享内存页,然后通知用户空间的qemu进程;用户空间qemu进程会从内核中读取这个IO请求,由硬件模拟模块模拟这个IO操作;qemu的硬件模拟模块会根据IO请求的不同,跟不同的真实物理设备驱动进行交互,完成真正的IO操作(比如通过物理网卡访问外部网络),并将结果放回共享内存页,通知KVM的IO处理模块;KVMIO处理模块读取处理结果并返回给客户机设备驱动。
qemu全虚拟化方式处理IO,每次IO操作都要发送多次VMExit/VMEnrty、上下文切换、数据复制,性能较差。
libvirt
libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API。Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程的virsh调用,Libvirtd调用qemu-kvm操作虚拟机。
qemu,kvm,libvirt三者之间关系
kvm技术中,应用到2个东西:qemu + kvm
kvm:负责CPU虚拟化 + 内存虚拟化,实现了CPU和内存的虚拟化,但kvm不能模拟其他设备;kvm在linux内核态。
qemu:模拟IO设备(网卡,磁盘),kvm 加 qemu之后就能实现真正意义上的服务器虚拟化技术;qemu在用户态。
因为用到了上面两个,所以一般都称为qemu-kvm。
libvirt:调用虚拟化技术的接口用于管理。用libvirt管理方便,直接用qemu-kvm的接口太繁琐。
【说明:上述相关介绍来自网络搜索结果,非原创】
原文:https://www.cnblogs.com/tjb-home/p/12419818.html