KVM
KVM(Kernel-based Virtual Machine)是一个Linux环境下的开源虚拟化技术,它允许在x86架构硬件上创建多个虚拟机,并且支持运行多种操作系统,包括Linux和Windows。
KVM作为一个内核模块存在于Linux中,自2.6.20版本起就集成于Linux内核里。它利用CPU的虚拟化扩展技术来提供高效、灵活的虚拟化解决方案。
特点[ ]
1、高效性能:KVM接近于裸机的性能,因为它是内核的一部分,可以直接运行在硬件上,不需要像传统的模拟器那样在软件层面模拟硬件。
2、平台支持:KVM支持多种平台,包括x86 (32位和64位)、s390和PowerPC等CPU架构。
3、开源免费:KVM是完全开源的,任何人都可以免费使用并修改源代码,这使得它能快速适应各种需求和快速发展的虚拟化技术趋势。
4、硬件要求:为了运行KVM,需要CPU支持虚拟化技术,如Intel VT或AMD-V。
5、管理便捷:KVM可以通过网络进行远程管理,支持标准如IPMI的新服务器管理界面,使得IT基础设施的管理更加方便和高效。
工作原理[ ]
- 内核模块:KVM作为一个可加载的内核模块(kvm.ko),存在于Linux内核中。它利用CPU的虚拟化扩展(Intel VT-x或AMD AMD-V)来创建和管理虚拟机。
- 硬件虚拟化支持:KVM使用硬件辅助虚拟化技术,允许每个虚拟机直接运行在硬件上,同时保持隔离性。这种硬件加速提高了虚拟化的效率和性能。
- QEMU的作用:虽然KVM本身负责处理CPU和内存的虚拟化,但IO(输入/输出)设备的虚拟化则由QEMU来提供。QEMU是一个独立的开源虚拟机软件,与KVM配合使用,模拟各种硬件设备提供给虚拟机使用。
- 虚拟机管理:在KVM架构中,一台虚拟机实际上是作为一个普通的Linux进程运行。通过对这些进程的管理,KVM能够实现对虚拟机的有效管理。这种方式使得KVM可以利用Linux内核本身的调度器进行资源分配和管理。
- Hypervisor的角色:当KVM模块被加载到Linux内核后,这个内核就起到了Hypervisor的作用。它不仅负责虚拟机的创建和监控,还负责硬件资源的管理和虚拟化环境的维护。
虚拟化模式[ ]
半虚拟化[ ]
- 需要修改操作系统:在半虚拟化模式下,运行在虚拟机上的客户操作系统需要进行修改,以便它知道自己是在虚拟环境中运行,并且能够通过特定的API与宿主机通信。
- 性能优势:由于客户操作系统知道它是在虚拟环境中运行,并且可以直接与宿主机通信,因此半虚拟化通常能提供更高的性能和更低的资源消耗。
- 兼容性限制:半虚拟化的一个缺点是它要求对客户操作系统进行修改,这可能不适用于那些无法修改的操作系统,如某些版本的Windows系统。
全虚拟化[ ]
- 无需修改操作系统:在全虚拟化模式下,客户操作系统不需要进行任何修改,它认为自己是直接运行在硬件上。这种模式通过使用虚拟设备驱动程序和硬件加速来实现对硬件环境的模拟。
- 资源消耗:全虚拟化的缺点是它可能会消耗更多的资源,因为它需要模拟硬件环境,这可能会导致一些性能损失。
- 更好的兼容性:全虚拟化适用于需要支持多种不同操作系统的场景,因为它不需要对客户操作系统进行任何修改。
KVM内存管理[ ]
KVM继承了Linux系统管理内存的诸多特性,比如,分配给虚拟使用的内存可以被交换至交换空间、能够使用大内存页以实现更好的性能,以及对NUMA的支持能够让虚拟机高效访问更大的内存空间等。KVM基于Intel的EPT(ExtendedPage Table)或AMD的RVI(Rapid Virtualization Indexing)技术可以支持更新的内存虚拟功能,这可以降低CPU的占用率,并提供较好的吞吐量。
KVM还借助于KSM(Kernel Same-pageMerging)这个内核特性实现了内存页面共享。KSM通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时,KSM会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同GuestOS的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此,KSM技术可以降低内存占用进而提高整体性能。