Board logo

标题: Libvirt 虚拟化库剖析更新 [打印本页]

作者: look_w    时间: 2017-12-13 11:50     标题: Libvirt 虚拟化库剖析更新

清单 2. 启动新域
1
2
3
4
5
mtj@mtj-desktop:~/libvtest$ virsh create react-qemu.xml
Connecting to uri: qemu:///system
Domain ReactOS-on-QEMU created from react-qemu.xml

mtj@mtj-desktop:~/libvtest$




这里要注意用于连接到域(qemu:///system)的 Universal Resource Indicator (URI)。该本地 URI 连接到本地 QEMU 驱动程序的系统模式守护进程上。要通过主机 shinchan 上的 Secure Shell (SSH) 协议连接到远程 QEMU 虚拟机监控程序,可以使用 URL qemu+ssh://shinchan/。
下一步,您可以使用 virsh 内的 list 命令列出给定主机上的活动域。这样做可以列出活动域,域 ID,以及它们的状态,如下所示:
清单 3. 列出活动域
1
2
3
4
5
6
7
mtj@mtj-desktop:~/libvtest$ virsh list
Connecting to uri: qemu:///system
Id Name                 State
----------------------------------
  1 ReactOS-on-QEMU      running

mtj@mtj-desktop:~/libvtest$




注意,这里定义的名称是在域配置文件元数据中定义过的名称。可以看到,该域的域名是 1 且正在运行中。
您也可以使用 suspend 命令中止域。该命令可停止处于调度中的域,不过该域仍存在于内存中,可快速恢复运行。下面的例子展示了如何中止域,执行列表查看状态,然后重新启动域:
清单 4. 中止域,检查状态,并重新启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mtj@mtj-desktop:~/libvtest$ virsh suspend 1
Connecting to uri: qemu:///system
Domain 1 suspended

mtj@mtj-desktop:~/libvtest$ virsh list
Connecting to uri: qemu:///system
Id Name                 State
----------------------------------
  1 ReactOS-on-QEMU      paused

mtj@mtj-desktop:~/libvtest$ virsh resume 1
Connecting to uri: qemu:///system
Domain 1 resumed

mtj@mtj-desktop:~/libvtest$




virsh 工具也支持许多其他命令,比如保存域的命令(save),恢复已存域的命令(restore),重新启动域的命令(reboot),以及其他命令。您还可以从运行中的域(dumpxml)创建域配置文件。
到目前为止,我们已经启动并操作了域,但是如何连接域来查看当前活动域呢?这可以通过 VNC 实现。要创建表示特定域图形桌面的窗口,可以使用 VNC:
清单 5. 连接到域
1
mtj@mtj-desktop:~/libvtest$ xvnc4viewer 127.0.0.1 0




libvirt 和                Python上一个例子说明了如何使用命令行工具 virsh 实现对域的控制。现在我们看一个使用 Python 来控制域的例子。Python 是受 libvirt 支持的脚本语言,它向 libvirt API 提供完全面向对象的接口。
在本例中,我研究了一些基本操作,与之前用 virsh 工具(list、suspend、resume 等)展示的操作类似。Python 示例脚本见 。在本例中,我们从导入 libvirt 模块开始。然后连接到本地 QEMU 虚拟机监控程序。从这里开始,重复可用的域 ID;对每个 ID 创建一个域对象,然后中止,继续,最后删除该域。
清单 6. 用于控制域的示例 Python 脚本(libvtest.py)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import libvirt

conn = libvirt.open('qemu:///system')

for id in conn.listDomainsID():

    dom = conn.lookupByID(id)

    print "Dom %s  State %s" % ( dom.name(), dom.info()[0] )

    dom.suspend()
    print "Dom %s  State %s (after suspend)" % ( dom.name(), dom.info()[0] )

    dom.resume()
    print "Dom %s  State %s (after resume)" % ( dom.name(), dom.info()[0] )

    dom.destroy()




虽然这只是个简单示例,我们仍然可以看到 libvirt 通过 Python 提供的强大功能。通过一个简单的脚本就能够重复所有本地 QEMU 域,发行有关域的信息,然后控制域。该脚本的结果如 清单 7 所示。
清单 7. 清单 6 中的 Python 脚本输出的结果
1
2
3
4
5
mtj@mtj-desktop:~/libvtest$ python libvtest.py
Dom ReactOS-on-QEMU  State 1
Dom ReactOS-on-QEMU  State 3 (after suspend)
Dom ReactOS-on-QEMU  State 1 (after resume)
mtj@mtj-desktop:~/libvtest$




API                概述高级 libvirt API 可划分为 5 个 API 部分:虚拟机监控程序连接 API、域 API、网络 API、存储卷 API 以及存储池 API。
为给定虚拟机监控程序创建连接后会产生所有 libvirt 通信(例如, 中所示的 open 调用)。该连接为所有其他要使用的 API 提供路径。在 C API 中,该行为通过 virConnectOpen 调用(以及其他进行认证的调用)提供。这些函数的返回值是一个 virConnectPtr 对象,它代表到虚拟机监控程序的一个连接。该对象作为所有其他管理功能的基础,是对给定虚拟机监控程序进行并发 API 调用所必需的语句。重要的并发调用是 virConnectGetCapabilities 和 virNodeGetInfo,前者返回虚拟机监控程序和驱动程序的功能,后者获取有关节点的信息。该信息以 XML 文档的形式返回,这样通过解析便可了解可能发生的行为。
进入虚拟机监控程序后,便可以使用一组 API 调用函数重复使用该虚拟机监控程序上的各种资源。virConnectListDomains API 调用函数返回一列域标识符,它们代表该虚拟机监控程序上的活动域。
API 实现大量针对域的函数。要探究或管理域,首先需要一个 virDomainPtr 对象。您可通过多种方式获得该句柄(使用 ID、UUID 或域名)。继续来看重复域的例子,您可以使用该函数返回的索引表并调用 virDomainLookupByID 来获取域句柄。有了该域句柄,就可以执行很多操作,从探究域(virDomainGetUUID、virDomainGetInfo、virDomainGetXMLDesc、virDomainMemoryPeek)到控制域(virDomainCreate、virDomainSuspend、virDomainResume、virDomainDestroy 和 virDomainMigrate)。
您还可使用 API 管理并检查虚拟网络和存储资源。建立了 API 模型之后,需要一个 virNetworkPtr 对象来管理并检查虚拟网络,且需要一个 virStoragePoolPtr(存储池)或 virStorageVolPtr(卷)对象来管理这些资源。
API 还支持一种事件机制,您可使用该机制注册为在特定事件(比如域的启动、中止、恢复或停止)发生时获得通知。
语言绑定libvirt 库用 C               (支持 C++)实现,且包含对 Python 的直接支持。不过它还支持大量语言绑定。目前已经对 Ruby、Java™ 语言,Perl 和 OCaml 实施了绑定。在从 C# 调用 libvirt 方面我们已做了大量工作。libvirt 支持最流行的系统编程语言(C 和 C++)、多种脚本语言、甚至一种统一的函数型语言(Objective caml)。因此,不管您侧重何种语言,libvirt 都会提供一种路径来帮助您控制域。
使用 libvirt 的应用程序仅从本文已经展示的一小部分功能上便可看出 libvirt 提供的强大功能。且如您所愿,有大量应用程序正成功构建于 libvirt 之上。其中一个有趣的应用程序就是 virsh(这里所示),它是一种虚拟 shell。还有一种名为 virt-install 的应用程序,它可用于从多个操作系统发行版供应新域。virt-clone 可用于从另一个 VM 复制 VM(既包括操作系统复制也包括磁盘复制)。一些高级应用程序包括多用途桌面管理工具 virt-manager 和安全连接到 VM 图形控制台的轻量级工具 virt-viewer。
构建于 libvirt 之上的一种最重要的工具名为 oVirt。oVirt VM 管理应用程序旨在管理单个节点上的单个 VM 或多个主机上的大量 VM。除了可以简化大量主机和 VM 的管理之外,它还可用于跨平台和架构自动化集群,负载平衡和工作。
深入探究从这篇简短的文章可以看出,libvirt 是一种用来构建应用程序的强大库,能够跨系统的大型网络在不同的虚拟机监控程序环境中管理域。鉴于云计算的日渐流行,libvirt 无疑也会随之发展,不断获得新的应用程序和用户。撰写本文时,libvirt 也仅有四年的发展史,因此在大规模可伸缩计算领域中相对较新。libvirt 将来肯定会有很大发展。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0