「libvirt」- The virtualization API

认识

官网:https://libvirt.org/
文档:https://libvirt.org/docs.html
仓库:https://gitlab.com/libvirt/libvirt

其是一个管理虚拟化平台的工具包;
可以从 C,Python,Perl,Java 等访问;
支持 KVM,QEMU,Xen,Virtuozzo,VMWare ESX,LXC,BHyve 等;
针对 Linux,FreeBSD,Windows 和 OS-X;

Difference between KVM and QEMU

目前来说,QEMU 是一个独立的虚拟化解决方案,并不依赖 KVM(它本身自己可以做 CPU 和内存的模拟,只不过效率较低),而 KVM 是另一套虚拟化解决方案,对 CPU 进行虚拟效率较高(采用了硬件辅助虚拟化),但本身不提供其他设备的虚拟化,借用了 QEMU 的代码进行了定制,所以 KVM 方案一定要依赖 QEMU;

即使后来 RedHat 后来开发了 libvirt,也只能简单的认为 libvirt 是个虚拟机管理工具,仍然需要通过用户空间 QEMU 来与 KVM 进行交互;

组成

QEMU – Quick Emulator

QEMU 是一个管理程序(Virtual Machine Monitor),一个管理和分配硬件资源的程序。QEMU 通过动态二进制转换来模拟 CPU,并提供一系列的硬件模型,使客户操作系统认为自己和硬件直接打交道,其实是同 QEMU 模拟出来的硬件打交道,QEMU 再将这些指令翻译给真正硬件进行操作。通过这种模式,客户操作系统可以和主机上的硬盘、网卡、CPU、CD-ROM、音频设备、USB 设备进行交互。但由于所有指令都需要经过 QEMU 来翻译,因而性能会比较差;

所以说,QEMU 是一个模拟器;

http://wiki.qemu.org/Main_Page
http://wiki.qemu.org/Contribute
http://wiki.qemu.org/Documentation

KVM – Kernel-based Virtual Machine

KVM 实际是 Linux 内核提供的虚拟化架构,可将内核直接充当 Hypervisor 来使用。KVM 需要处理器硬件本身支持虚拟化扩展,如 intel VT 和 AMD AMD-V 技术。KVM 自 2.6.20 版本后已合入主干并发行,除此之外,还以模块形式被移植到 FreeBSD 和 illumos 中。除了支持 x86 的处理器,同时也支持 S/390、PowerPC、IA-61 以及 ARM 等平台;

KVM 包含一个内核模块 kvm.ko 用来实现核心虚拟化功能,以及一个和处理器强相关的模块(如 kvm-intel.ko 或 kvm-amd.ko)。KVM 本身不实现任何模拟,仅仅是暴露了一个 /dev/kvm 接口,这个接口可被宿主机用来主要负责 vCPU 的创建,虚拟内存的地址空间分配,vCPU 寄存器的读写以及 vCPU 的运行。有了 KVM 以后,guest os 的 CPU 指令不用再经过 QEMU 来转译便可直接运行,大大提高了运行速度。但 KVM 的 kvm.ko 本身只提供了 CPU 和内存的虚拟化,所以它必须结合 QEMU 才能构成一个完整的虚拟化技术;

QEMU-KVM

从前面的介绍可知,KVM 负责 CPU 虚拟化 + 内存虚拟化,实现了 CPU 和内存的虚拟化,但 kvm 并不能模拟其他设备,还必须有个运行在用户空间的工具才行。KVM 的开发者选择了比较成熟的开源虚拟化软件 QEMU 来作为这个工具,QEMU 模拟 IO 设备(网卡,磁盘等),对其进行了修改,最后形成了 QEMU-KVM;

从前面的介绍可知,KVM 负责 CPU 虚拟化 + 内存虚拟化,实现了 CPU 和内存的虚拟化,但 kvm 并不能模拟其他设备,还必须有个运行在用户空间的工具才行。KVM 的开发者选择了比较成熟的开源虚拟化软件 QEMU 来作为这个工具,QEMU 模拟 IO 设备(网卡,磁盘等),对其进行了修改,最后形成了 QEMU-KVM;

在 QEMU-KVM 中:KVM 运行在内核空间;QEMU 运行在用户空间,实际模拟创建、管理各种虚拟硬件。QEMU 将 KVM 整合了进来,通过 ioctl 调用 /dev/kvm,从而将 CPU 指令的部分交给内核模块来做,KVM 实现了 CPU 和内存的虚拟化,但 KVM 不能虚拟其他硬件设备,因此 qemu 还有模拟 IO 设备(磁盘,网卡,显卡等)的作用,KVM 加上 QEMU 后就是完整意义上的服务器虚拟化;

综上所述,QEMU-KVM 具有两大作用:

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

这个方案中,QEMU 模拟其他的硬件,如网络、硬盘,同样会影响这些设备的性能。于是又产生了半虚拟化设备 virtio_blk, virtio_net,提高设备性能;

命令程序 and 配置文件

# dpkg –get-selections | grep libvirt | awk ‘{print $1}’ | xargs dpkg -L | grep -E ‘(/(s)*)bin/’ | xargs dpkg -S

客户端

  • virsh | management user interface
  • virt-admin | daemon administration interface
  • virt-host-validate | validate host virtualization setup
  • virt-login-shell | tool to execute a shell within a container matching the users name
  • virt-pki-validate | validate libvirt PKI files are configured correctly
  • virt-xml-validate | validate libvirt XML files against a schema

服务端

  • libvirtd | libvirtd management daemon
  • virt-sanlock-cleanup | remove stale sanlock resource lease files
  • virtlockd | libvirt lock management daemon
  • virtlogd | libvirt log management daemon

构建

for Kylin v4

apt-get install qemu-* -y --allow-unauthenticated
apt-get install libvirt* -y --allow-unauthenticated
apt-get install virt-manager -y --allow-unauthenticated

应用

许多应用程序都是使用该库来管理虚拟机;使用 libvirt 的应用可以参考「Applications using libvirt」一文;

参考文献

KVM – Kernel Virtual Machine
homepage of the virt-manager
QEMU,KVM 及 QEMU-KVM 介绍
Hypervisor, KVM, QEMU 总结
Wikipedia/QEMU, Hypervisor
Qemu-KVM 基本工作原理分析