KVM 基础

KVM(Kernel-basedVirtual Machine 的缩写,即基于内核的虚拟机),可以将Linux内核转化为一个hypervisor。

KVM的最大的特点在于它是与Linux内核集成的, 是Linux 原生的全虚拟化解决方案。

运行环境

  • 宿主操作系统必须是Linux

  • 必须运行在支持虚拟化扩展的CPU之上

    现代 CPU 本身了提供了对特殊指令的截获和重定向的硬件支持,甚至新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化从而提高性能。 Interl的 VT-x 和 AMD-V 虚拟化技术,就从CPU层面提供了支持虚拟化的指令集:vmx(Hardware virtualization,Intel) svm(Secure virtual machine,AMD)。通过这些指令集,VMM (VM Manager,虚拟机管理器)很容易将客户机置于一种受限制的模式下运行,一旦客户机视图访问物理资源,硬件会暂停客户机的运行,将控制权交回给 VMM 处理。

    由于支持虚拟化扩展的CPU提供全新的架构,无需捕捉所有的CPU指令并进行二进制转换,减少了相关的性能开销,极大简化了VMM的设计,使得VMM性能更加强大。

  • Red Hat 企业版提供2种KVM虚拟化方案

    • Red Hat Enterprise Linux

    提供KVM功能,但是对虚拟机数量和类型有限制,适用于小型企业和开发人员

    • Red Hat Enterprise Virtualization

    提供KVM功能,无上述限制,且提供图形化的管理界面

KVM特性

  • 超载分配资源
  • 在线迁移 (Live Migration)
  • I/O设备半虚拟化
  • 通过安装virtio虚拟化驱动实现I/O设备的半虚拟化。
    virtio-blk, virtio-net, virtio-pci, virtio-console, virtio-ballon

KVM架构

KVM架构

  • KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。

  • KVM运行在内核空间,提供CPU和内存的虚拟化,以及客户机的 I/O 拦截(I/O 被 KVM 拦截后,交给 QEMU 处理)

  • KVM本身不具备任何硬件模拟功能(为VM提供不存在的硬件设备),硬件模拟通常由QEMU完成
  • 虚机的创建和运行是 QEMU 和 KVM 相互配合的过程

KVM

KVM的内核模块(kvm.ko,kvm-intel.ko ,kvm-amd.ko)实现以下功能:

  • 初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下

  • 将宿主操作系统置于虚拟化模式的根模式

  • 提供CPU的虚拟化,内存虚拟化(内存虚拟化往往是一个虚机实现中最复杂的部分)

  • 支持实时迁移(Live Migration)

QEMU

QEMU本身就是一个纯软件实现的带有设备模拟功能的虚拟机。QEMU代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及虚拟设备模拟(网卡、显卡、存储控制器和硬盘等)。但由于是纯软件实现,其性能非常低下

KVM本身不具备任何硬件模拟功能(为VM提供不存在的硬件设备),硬件模拟通常由QEMU完成。从QEMU的角度看,也可以说是QEMU使用了KVM模块提供的硬件虚拟化加速功能

除此以外,虚机的配置和创建、虚机运行所依赖的虚拟设备、虚机运行时的用户环境和交互,以及一些虚机的特定技术比如动态迁移,都是QEMU自己实现的。

安装

# 更新系统软件包
$ sudo yum update

# --- 安装桌面环境 ---
# 如果当前服务器是最小化安装的,需要安装桌面环境,启动virt-manager需要使用
# Step1: 安装并启用EPEL源
$ sudo yum install epel-release
# Step2: 安装Xfce桌面环境
$ sudo yum group install "X Window system"
$ sudo yum group install "Xfce"

# --- 安装条件检查 ---
# 安装之前先查询当前CPU是否支持vmx或者svm指令集(cpu的硬件虚拟化功能)
$ egrep "svm|vmx" /proc/cpuinfo
flags           : fpu vme ... vmx  
# 查看系统包含kvm模块
$ modinfo kvm

# --- 安装 KVM 软件包 ---
# 最小化安装
$ sudo yum install qemu-kvm qemu-img libvirt
# 推荐安装一下扩展功能包
$ sudo yum install virt-install virt-viewer libvirt-python virt-manager virt-install libvirt-client

# --- 验证 ---
# 查看有没有生成/dev/kvm设备文件
$ ls -l /dev/kvm
crw-rw-rw-. 1 root kvm 10, 232 Mar  7 18:03 /dev/kvm  
# 查看系统有没有加载KVM模块
$ lsmod |grep kvm
kvm_intel             170181  0  
kvm                   554609  1 kvm_intel  
irqbypass              13503  1 kvm  
# 如果没有加载,使用modprobe命令加载
$ sudo modprobe kvm

# --- 启动后台服务进程 ---
# 使用virt系类管理工具时需要启动libvirtd服务
$ sudo systemctl start libvirtd

安装包说明

Package说明
qemu-kvmKVM专用的QEMU组件,具备管理KVM的功能
qemu-img镜像文件管理器
libvirt操作和管理KVM虚机的库文件
virt-install创建KVM虚机的命令行工具
virt-manager基于Python的 GUI 管理工具
libvirt-client命令行管理工具
libvirt-pythonlibvirt提供的Python接口模块
virt-viewer连接到虚机屏幕的工具(安装虚机的时候,用于显示安装界面)

扩展阅读

KVM详细教程