KVM组件原理梳理
KVM
kvm(kernel-based virtual machine)
是Linux的一个内核驱动模块,它只模拟CPU和内存。KVM
模块的职责就是打开并初始化VMX
(Virtual Machine Extension
)功能,提供相应的接口以支持虚拟机的运行。对于KVM来说,其匹配的用户空间工具并不仅仅只有QEMU,还有其他的,比如libvirt、virsh、virt-manager
等,QEMU并不是KVM的唯一选择。
- 在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可以在用户空间启动客户机操作系统。一个普通的 Linux 进程有两种运行模式:内核和用户。 KVM 增加了第三种模式:客户模式(有自己的内核和用户模式)。
QEMU
- QEMU
(quick emulator)
本身并不包含或依赖KVM
模块,而是一套模拟计算机的自由软件。QEMU虚拟机是一个纯软件的实现,可以在没有KVM模块的情况下独立运行,但是性能比较低。QEMU有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化以及I/O设备的虚拟化。为了提升性能,Qemu将KVM整合进来,通过ioctl
调用/dev/kvm
接口,将有关CPU指令的部分交由内核模块来做。kvm
负责cpu
虚拟化+内存虚拟化,实现了cpu
和内存的虚拟化,但kvm不能模拟其他设备。qemu模拟IO设备(网卡,磁盘等),kvm
加上qemu
之后就能实现真正意义上服务器虚拟化。QEMU
使用了KVM
模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化加速以提高虚拟机的性能。
libvirt
libvirt
是目前使用最为广泛的对KVM
虚拟机进行管理的工具和API
。libvirt
的后台进程叫做Libvirtd
,可以被本地的virsh
调用,Libvirtd
调用qemu
操作虚拟机。
典型的KVM虚拟机组件
- 一个管理虚拟硬件的设备驱动,这个驱动通过一个字符设备 /dev/kvm 导出它的功能。
通过 /dev/kvm每一个客户机拥有其自身的地址空间,这个地址空间与内核的地址空间相分离或与任何一个正运行着的客户机相分离。
- 一个模拟硬件的用户空间部件,它是一个稍微改动过的 QEMU 进程。从客户机操作系
统执行 I/O 会拥有QEMU 。 QEMU 是一个平台虚拟化方案,它允许整个 PC 环境(包括磁盘、显示卡(图形卡)、网络设备)的虚拟化。任何客户机操作系统所发出的 I/O 请求都被拦截,并被路由到用户模式用以被 QEMU 过程模拟仿真。
安装kvm需要的包
qemu-kvm
:提供用户级kvm模拟器
qemu-img
:提供磁盘映像管理器
libvirt
:提供主机和服务,以便系统管理程序和主机系统交互
libvirt-python
:允许python应用使用libvirt API
模块
libvirt-client
:为访问libvirt
服务提供客户端API和库,以及管理工具virsh
virt-manager
:为管理VM提供虚拟机管理图像工具
python-virtinst
:提供virt-install命令,供创建虚拟机使用
virt-manager
:图形管理工具
virsh
:命令行管理工具