kvm 虚拟化的详细拆分理解,看完你还还对KVM不理解吗(Qemu,Qemu-KVM,kvm,Libvirt,半虚拟化)

时间:2024-04-10 18:04:02

虚拟化核心问题就是解决虚拟机的内核权限,内核就是计算机系统的管家,管理三个重要的资源:计算,网络,存储,任何程序想要用这三个资源必须经过内核的审核调度处理

参考:虚拟机内核

Qemu是什么?

Qemu官网:点击访问

Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,对于虚拟机内核而言面对的就是真实的硬件,实际是由Qemu模拟的环境,虚拟机就可以和主机上的硬盘,网卡,CPU,CD-ROM,音频设备和USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差
kvm 虚拟化的详细拆分理解,看完你还还对KVM不理解吗(Qemu,Qemu-KVM,kvm,Libvirt,半虚拟化)

KVM是什么?

基于寄居虚拟化架构来实现硬件辅助全虚拟化

KVM实际是linux内核提供的虚拟化架构,可将内核直接充当VMM(hypervisor)来使用。KVM需要处理器硬件本身支持虚拟化扩展,如intel VT 和AMD AMD-V技术。

VMM运行在特权模式,主要作用是隔离并且管理上层运行的多个虚拟机,仲裁它们对底层硬件的访问,并为每个客户操作系统虚拟一套独立于实际硬件的虚拟硬件环境(包括处理器,内存,I/O设备)

那么KVM就是弥补Qemu的性能不足之处,KVM本身不实现任何模拟,仅仅是暴露了一个/dev/kvm接口,这个接口可被宿主机用来主要负责vCPU的创建,虚拟内存的地址空间分配,vCPU寄存器的读写以及vCPU的运行。有了KVM以后,guest os的CPU指令不用再经过QEMU来转译便可直接运行,大大提高了运行速度。但KVM的kvm.ko本身只提供了CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完整的虚拟化技术

Qemu-KVM是什么?

KVM负责cpu虚拟化+内存虚拟化,但kvm并不能模拟其他设备,还必须有个运行在用户空间的工具才行。KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,QEMU模拟IO设备(网卡,磁盘等),对其进行了修改,最后形成了QEMU-KVM。
kvm 虚拟化的详细拆分理解,看完你还还对KVM不理解吗(Qemu,Qemu-KVM,kvm,Libvirt,半虚拟化)
KVM加上QEMU后就是完整意义上的服务器虚拟化**

提供对cpu,内存(KVM负责),IO设备(QEMU负责)的虚拟
对各种虚拟设备的创建,调用进行管理(QEMU负责)

Libvirt是什么?

Libvirt 是管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。它包括一个API 库,一个守护程序(libvirtd)和一个命令行工具(virsh),libvirt 的主要目标是为各种虚拟化工具提供一套方便、可靠的编程接口,用一种单一的方式管理多种不同的虚拟化提供方式

kvm 虚拟化的详细拆分理解,看完你还还对KVM不理解吗(Qemu,Qemu-KVM,kvm,Libvirt,半虚拟化)
virsh:libvirt对应的shell命令,理解成客户端
libvirtd:daemon进程,服务端
webvirtmgr:通过web界面管理虚拟机,需要调用Libvirt的API接口来管理

virtio半虚拟化是什么?

Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了半虚拟化

Virtio半虚拟化驱动的方式,可以获得很好的I/O性能,其性能几乎可以达到和native(即:非虚拟化环境中的原生系统)差不多的I/O性能。所以,在使用KVM之时,如果宿主机内核和客户机都支持virtio的情况下,一般推荐使用virtio达到更好的性能。当然,virtio的也是有缺点的,它必须要客户机安装特定的Virtio驱动使其知道是运行在虚拟化环境中,且按照Virtio的规定格式进行数据传输,不过客户机中可能有一些老的Linux系统不支持virtio和主流的Windows系统需要安装特定的驱动才支持Virtio。

VIRTIO_PCI (virtio设备的PCI驱动程序)
VIRTIO_BALLOON ( Virtio内存气球驱动程序)
VIRTIO_BLK ( Virtio块驱动程序)
VIRTIO_NET ( Virtio网络驱动程序)
kvm 虚拟化的详细拆分理解,看完你还还对KVM不理解吗(Qemu,Qemu-KVM,kvm,Libvirt,半虚拟化)
前端:是存在于客户机中的驱动模块。

后端:是存在于Qemu中的处理程序。

中间层:在前端和后端之间,还定义了一层来支持客户机与Qemu之间的通信。Virtio和virtio-ring可以看成是一层,Virtio是虚拟队列接口,就是将前端驱动程序附加到后端处理程序,算是前后端通信的桥梁,主要实现控制面,virtio-ring实现了两个环形缓冲,分别保存前后端的信息,实现具体的通讯机制和通讯流是偏向数据面,是桥梁的具体实现。

部分参考:https://www.cnblogs.com/echo1937/p/7138294.html
半虚拟化参考:https://my.oschina.net/davehe/blog/130124