3.4 Libvirt

底层虚拟化的接口通常比较难用,并且各种虚拟化接口调用方式和参数也各不相同,那么有没有一种统一的适配层工具去解决这些底层复杂接口的调用,提供便于开发和集成的接口呢?Libvirt便应运而生了,Libvirt是一套用于管理硬件虚拟化的开源API、守护进程与管理工具。它可以用于管理KVM、Xen、VMware ESXi、QEMU等虚拟化,并对外暴露Libvirt API,Libvirt示意图如图3-12所示。

图3-12 Libvirt示意图

图3-12 单击创建按钮界面

Libvirt管理的核心是Libvirtd守护进程,Libvirtd主要包括虚拟机、存储、网络、监控等模块。其中,Domain负责虚拟机管理,Storage负责存储卷管理,Network是网络管理,Inferface是网络接口管理,Secret是秘钥管理,Snapshot是快照管理。

为了方便调用,Libvirt API通常被包装成多种编程语言的SDK,常用的包括Libvirt-python、Libvirt-go及Libvirt-Java等。其中,OpenStack就是使用了Libvirt-python库操作底层虚拟化。Libvirt不仅可以控制本地的虚拟化软件,还可以控制远程的虚拟化软件,从而可以达到通过一个Libvirt控制很多主机上面虚拟化软件的目的。下面展示了一个Python Libvirt SDK的样例,通过接口获取当前主机上面所有虚拟机的状态。

首先,通过open方法建立和QUME的连接;然后,通过listDomainsID接口获取所有虚拟机的ID列表。lookupByID负责查看通过ID查询虚拟机的详情。