KVM虚拟化技术
KVM简介 KVM(Kernel-based Virtual Machine,基于内核的虚拟机)是一种内建于Linux中的开源虚拟机啊技术。具体而言,KVM可帮助用户将Linux转变成虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机(VM)。 KVM是Linux的一部分,Linux2.6.20或者更新版本包括KVM。KVM于2006年首次公布,并在一年后合并到主流Linux内核版本中。由于KVM属于现有的Linux代码,因此它能够立即享受每一项新的Linux功能、修复和发展,无需进行额外工程。
KVM功能特性 1、内存管理 KVM从Linux继承了强大的内存管理功能。一个虚拟机的内存与任何其他的linux进程的内存一样进行存储,可以以大页面的形式进行交换以实现更高的性能,也可以以磁盘文件的形式进行共享。NUMA(Non-Uniform Memory Access,非一致存储访问结构)很好地解决了CPU资源地扩展问题,它可以把几十个甚至上百个CPU组合在一个服务器内,支持非一致性内存访问,针对多处理器的内存设计,允许虚拟机有效地访问大量内存。 KVM支持最新地给予硬件地内存虚拟化功能,支持Intel地扩展页表(EPT)和AMD地嵌套页表(NPT,也叫“快速虚拟机啊索引-RVI”),以实现更低的CPU利用率和更高的吞吐量。内存页面共享通过一项名为内核同页合并(KernelSame-pageMerging,KSM)的内核功能来支持。KSM扫描每个虚拟机的内存,如果虚拟机拥相同的内存页面,KSM将这些页面合并到一个在虚拟机之间共享的页面,仅存储一个副本。如果一个客户机尝试更改这个共享页面,它将得到自己的专用副本。 2、存储 KVM能够使用Linux支持的任何存储来存储虚拟机镜像,包括IDE、SCSI和SATA的本地磁盘,网络附加存储NAS(包括NFS和SAMBA/CIFS)或者支持iSCSI和光纤通道的SAN。多路径I/O可用于改进存储吞吐量和提供冗余。由于KVM是Linux内核的一部分,它可以利用所有领先存储供应商都支持的一种成熟且可靠的存储基础架构,它的存储堆栈在生产部署方面具有良好的记录。 KVM还支持全局文件系统(GFS2)等共享文件系统上的虚拟机镜像,以允许虚拟机镜像在多个宿主之间共享或使用逻辑卷共享。磁盘镜像支持按需分配,仅在虚拟机需要时分配存储空间,而不是提前分配整个存储空间,提高存储利用率。LVM的原生磁盘格式为QCOW2,支持快照,允许多级快照、压缩和加密。 3、设备驱动程序 KVM支持混合虚拟化,其中准虚拟化的驱动程序安装在客户机操作系统中,允许虚拟机使用优化的I/O接口而不使用模拟的设备,从而为网络和块设备提供高性能的I/O。KVM准虚拟化的驱动程序使用IBM和Redhat(红帽)联合Linux社区开发的VirtIO标准,它是一个与虚拟机管理程序独立的、构建设备驱动程序的接口,允许为多个虚拟机管理程序使用一组相同的设备驱动程序,能够实现更出色的虚拟机交互性。 4、性能和可伸缩性 KVM也继承了Linux的性能和可伸缩性.。KVM虚拟化性能在很多方面(如计算能力、网络带宽等)已经可以达到非虚拟化原生环境的95%以上的性能。KVM的扩展性也非常良好,客户机和宿主机都可以支持非常多的CPU数量和大量的内存。
KVM架构及相关组件 KVM本身不执行任何设备模拟,需要用户空间程序QEMU通过/dev/kvm接口设置一个虚拟机客户机的地址空间,想它向它提供模拟的I/O设备。并将它的视频显示映射回宿主机的显示屏。 1、KVM模块 KVM模块是KVM 虚拟机的核心部分。KVM仅支持硬件虚拟化。其主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。 以KVM在Intel的CPU上运行为例,在被内核加载的时候,KVM模块会先初始化内部的数据结构;之后KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统至于虚拟化模式的根模式;最后KVM模块创建特殊设备文件/dev/kvm,并等待来自用户空间的命令。接下来虚拟机的创建和运行是一个用户空间程序(QEMU)和KVM模块互相配合的过程。 2、QEMU QEMU是一个开源的虚拟机纯软件的实现,性能低下。但是其优点是支持本身编译运行的平台上就可以实现虚拟机的功能,甚至虚拟机可以与宿主机不同架构。QEMU代码中有着整套虚拟机的实现,包括处理器、内存虚拟化以及虚拟设备模拟(比如网卡、显卡、存储控制器及硬盘等)。 3、Libvirt Libvirt是KVM的管理工具。Libvirt除了能管理KVM这种Hypervisor,还能管理Xen,Virtualbox等,OpenStack底层也使用Libvirt。 Libvirt包含:后台Daemon程序libvirted、API库和命令行工具virsh。 libvirted:服务程序,接收和处理API请求; API库:使得其他人可以开发给予Libvirt的高级工具,比如virt-manager,是图形化的KVM管理工具; virsh:是人们经常要用的KVM命令行工具。
KVM的网络模型概述 KVM虚拟化使用一种称之为虚拟交换的技术实现虚拟机的网络互联,虚拟交换是运行在宿主机的一个软件结构,虚拟主机通过这个虚拟交换进行直连,实现与外界通信。虚拟交换可以运行在NAT模式、路由模式等。 目前,常见的是桥接模式。在虚拟化环境中,目前见过最多的就是桥接模式。现在流行的Docker一般在基于NAT模式实现的。