libvirt虚拟化开发简介

libvirt是一个虚拟化开发的工具库,提供了底层的kvm,xen,vmware esx等虚拟化的统一封装。可以通过libvirt提供的api对不同的底层实现进行同一的管理。除了原生的c api,还有c#, go, java, ocaml. perl, python, php, ruby的api,用户可自主选择自己熟悉的语言。

要使用libvirt首先要安装libvirtd,这是一个后台守护进程,负责管理虚拟机系统以及和客户端交互。libvirt还包含了virsh命令行工具,供用户通过shell手动管理。另外,还可以通过图形界面方式进行管理,该工具是virt-manager,如果您想要通过python的api进行开发,需要安装python3-libvirt或python-libvirt。在debian下,可通过下列指令安装这些包:

apt-get install libvirt-daemon libvirt-daemon-system libvirt-clients python3-libvirt virt-manager

启动libvirtd:

systemctl start libvirtd

接下来我们就可以通过virt-manager创建一个虚拟机。熟悉vmware或者virtualbox的同学,可以看到virt-manager和这些软件很类似,安装系统就不再介绍了。

系统安装完成之后,我们就可以通过virsh工具进行基本的操作了。运行virsh,回车,进入virsh的命令行,可通过help查看virsh支持的操作。

virsh # help
Grouped commands:

 Domain Management (help keyword 'domain'):
    attach-device                  attach device from an XML file
    attach-disk                    attach disk device
    attach-interface               attach network interface
    autostart                      autostart a domain
    blkdeviotune                   Set or query a block device I/O tuning parameters.
    blkiotune                      Get or set blkio parameters
    blockcommit                    Start a block commit operation.
    ......

通过查看这些命令,我们了解到libvirt提供了客户机的管理,客户机监控,主机监控,设备管理,网络管理,快照管理和存储管理等功能。由于有virt-manager工具,很多功能我们都可以通过图形化界面方式完成,但是我们可以通过virsh快速获取某个主机某项信息,方便开发时对比测试我们的代码是否正确。

libvirt中的一些基本概念:

  • 主机连接 主机连接是客户端和libvirtd之间的通道,该连接既可以访问运行在本地的libvirtd程序,也可以访问运行在网络上其他主机上的libvirtd。
  • 客户域 是一个运行着的虚拟机或者是可以生成一个虚拟机的配置文件。每个客户域都有一个唯一的ID,name和UUID
  • 虚拟网络 为客户机提供网络访问
  • 存储池 存储池用来组织和管理存储卷
  • 存储卷 用来为客户机提供存储设备(磁盘)
  • 主机设备 可以给虚拟机分配客户机上设备

libvirt api提供的api包括:

  • libvirt-common:通用的宏和枚举定义
  • libvirt-domain-snapshot:客户机快照管理
  • libvirt-domain:客户域管理
  • libvirt-event:事件管理
  • libvirt-host:宿主机信息查看
  • libvirt-interface:网络接口管理(网卡)
  • libvirt-network:网络管理
  • libvirt-nodedev:设备管理
  • libvirt-nwfilter:网络过滤
  • libvirt-secret:密钥管理
  • libvirt-storage:存储管理
  • libvirt-stream:数据流
  • virterror:错误处理

python api简要功能示例:

获取所有的客户机列表,详细参考

from __future__ import print_function
import sys
import libvirt

conn = libvirt.open('qemu:///system')
if conn == None:
    print('Failed to open connection to qemu:///system', file=sys.stderr)
    exit(1)

domainIDs = conn.listDomainsID()
if domainIDs == None:
    print('Failed to get a list of domain IDs', file=sys.stderr)

print("Active domain IDs:")
if len(domainIDs) == 0:
    print('  None')
else:
    for domainID in domainIDs:
        print('  '+str(domainID))

conn.close()
exit(0)

客户机内存信息统计,详细参考

from __future__ import print_function
import sys
import libvirt

domName = 'Fedora22-x86_64-1'

conn = libvirt.open('qemu:///system')
if conn == None:
    print('Failed to open connection to qemu:///system', file=sys.stderr)
    exit(1)

dom = conn.lookupByID(5)
if dom == None:
    print('Failed to find the domain '+domName, file=sys.stderr)
    exit(1)

stats  = dom.memoryStats()
print('memory used:')
for name in stats:
    print('  '+str(stats[name])+' ('+name+')')

conn.close()
exit(0)

官方有更多参考示例,这里不再过多介绍。我个人接触libvirt是因为要监控虚拟机的运行状态,性能统计,网络信息等的监控,所以对于快照,网络管理,存储管理等没有通过python接口进行过实践,对其了解的也不适特别多。下面是我认为一些有用的链接,可供参考:

  • virsh命令参考 详细讲解virsh的使用,如果对于xml的定义描述不确定时,可参考virsh的代码
  • XML格式 libvirt api使用的交互方式
  • API参考 libvirt提供的C接口,如果你需要的功能在这里找不到,那就是没有了

希望通过本片文章能让你对libvirt的开发有一个简单的认识。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注