Mastering KVM Virtualization

Mastering KVM Virtualization读书笔记第二章——KVM 内部构件

概述

第二章主要包含以下 4 个内容:

  • libvirt、QEMU 和 KVM 的内部实现;
  • 重要的数据结构和代码位置;
  • vCPUs 的运行流程;
  • 这些东西是怎么协作的;

    熟悉 libvirt 及其实现

libvirt 能够使用多种 hypervisor(如:KVM/QEMU, LXC, OpenVZ, UML 等)。libvirt 是一个开源的 API,同时也是一个守护进程,一个用于管理多种不同 hypervisor 的工具。libvirt 被多种虚拟化平台使用,例如带有图形化界面的 virt-manager。但是千万不要把它和第一章里所提到的 VMM/hypervisor 搞混了。

libvirt 实际上在 hypervisor 上一层,分析它的名字:lib-virt,就可以了解它想要实现的目标了。libvirt 更多时候是作为一个统一不同虚拟化技术的库来用的,因为现在虚拟化技术多,针对每种不同的技术做上层应用需要适配的工作量也大。libvirt 统一了这些不同的技术,为上层提供接口。

libvirt 同样还提供了一个 CLI(command line interface)叫做 virsh。libvirt 本身也被其他的高层的管理工具所使用,例如 oVirt:

许多人认为 libvirt 受限于单个物理节点,但实际上 libvirt 支持远程管理,libvirt 可以通过 libvirt-remote 连接到其他物理节点,并对其上的虚拟机进行管理。因此,任何使用 libvirt 的工具都可以通过网络连接到其他 libvirt 守护进程上,只需要使用额外的-connect 指令。

关于 libvirt 的连接和启动可以去看我以前的一篇博客

作为一个管理 hypervisor 的中间层软件,libvirt 需要负责供应虚拟机,创建、修改、管理、控制、迁移虚拟机等等。libvirt 有一个后台进程叫做 libvirtd,它是用于给 client 提供支持。根据 libvirt client 提供的 connection URI,libvirtd 开启一个到 hypervisor 的对应连接。在本书中我们用 QEMU/KVM 作为底层的 hypervisor。libvirtd 通过 URI 连接到 QEMU/KV。URI 格式如下:

  • qemu://xxx/system
  • qemu://xxx/session

前面的qemu://xxx/system意味着以 root 权限连接到 hypervisor,而qemu://xxx/session意味着以普通用户连接到 hypervisor。如果需要连接到远程的 hypervisor,只需要对该 URI 进行小小的改动:

  • driver[+transport]://[username@][hostname][:port]/[path][?extraparameters]

举一个简单的例子:

1
$ virsh --connect qemu+ssh://root@remoteserver.yourdomain.com/system list --all

如上图所示,就是 libvirt 调用 libvirtd 连接远程 hypervisor 的过程。当使用 remote Driver 的时候才能连接远程 hypervisort。

libvirt 的内部工作原理

libvirt 以 C 写成,使用 git 从官网把源码 down 下来。

1
$ git clone git://libvirt.org/libvirt.git

libvirt 虽然使用 C 语言写成,但是为了方便更上层应用的开发,它同样也为其他语言提供了接口,如 C#, Python, Java 等。