Libvirt虛擬化庫如何分析

本篇文章為大家展示了Libvirt 虛擬化庫如何分析,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

在平桂等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都做網(wǎng)站、網(wǎng)站設計 網(wǎng)站設計制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,高端網(wǎng)站設計,成都全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設,平桂網(wǎng)站建設費用合理。

講到向外擴展計算(比如云計算),libvirt 可能是您從未聽說過的最重要的庫之一。libvirt 提供一種虛擬機監(jiān)控程序不可知的 API 來安全管理運行于主機上的來賓操作系統(tǒng)。libvirt 本身 不是一種工具, 它是一種可以建立工具來管理來賓操作系統(tǒng)的 API。libvirt 本身構建于一種抽象的概念之上。它為受支持的虛擬機監(jiān)控程序?qū)崿F(xiàn)的常用功能提供通用的 API。libvirt 起初是專門為 Xen 設計的一種管理 API,后來被擴展為可支持多個虛擬機監(jiān)控程序。

基本架構

加入 My developerWorks 上的綠色小組

在 My developerWorks 上的 GReen IT Report 空間 和 綠色計算小組 上討論關于能源、效率和環(huán)境的主題并共享資源。

首先讓我們從用例模型視角來展開對 libvirt 的討論,然后深入探究其架構和用途。libvirt 以一組 API 的形式存在,旨在供管理應用程序使用(見圖 1 )。libvirt 通過一種特定于虛擬機監(jiān)控程序的機制與每個有效虛擬機監(jiān)控程序進行通信,以完成 API 請求。文章后面我將探討如何通過 QEMU 來實現(xiàn)該功能。

圖 1. libvirt 比較和用例模型

Libvirt 虛擬化庫如何分析

圖中還顯示了 libvirt 所用術語對照。這些術語很重要,因為在對 API 命名時會用到它們。兩個根本區(qū)別在于,libvirt 將物理主機稱作節(jié)點,將來賓操作系統(tǒng)稱作。這里需要注意的是,libvirt(及其應用程序)在宿主 Linux 操作系統(tǒng)(域 0)中運行。

控制方式

使用 libvirt,我們有兩種不同的控制方式。第一種如 圖 1 所示,其中管理應用程序和域位于同一節(jié)點上。 在本例中,管理應用程序通過 libvirt 工作,以控制本地域。當管理應用程序和域位于不同節(jié)點上時,便產(chǎn)生了另一種控制方式。在本例中需要進行遠程通信(參見 圖 2)。該模式使用一種運行于遠程節(jié)點上、名為 libvirtd 的特殊守護進程。當在新節(jié)點上安裝 libvirt 時該程序會自動啟動,且可自動確定本地虛擬機監(jiān)控程序并為其安裝驅(qū)動程序(稍后討論)。該管理應用程序通過一種通用協(xié)議從本地 libvirt 連接到遠程 libvirtd。對于 QEMU,協(xié)議在 QEMU 監(jiān)視器處結束。QEMU 包含一個監(jiān)測控制臺,它允許檢查運行中的來賓操作系統(tǒng)并控制虛擬機(VM)各部分。

圖 2. 使用 libvirtd 控制遠程虛擬機監(jiān)控程序

Libvirt 虛擬化庫如何分析

虛擬機監(jiān)控程序支持

為支持各種虛擬機監(jiān)控程序的可擴展性,libvirt 實施一種基于驅(qū)動程序的架構,該架構允許一種通用的 API 以通用方式為大量潛在的虛擬機監(jiān)控程序提供服務。這意味著,一些虛擬機監(jiān)控程序的某些專業(yè)功能在 API 中不可見。另外,有些虛擬機監(jiān)控程序可能不能實施所有 API 功能,因而在特定驅(qū)動程序內(nèi)被定義為不受支持。圖 3 展示了 libvirt API 與相關驅(qū)動程序的層次結構。這里也需要注意,libvirtd 提供從遠程應用程序訪問本地域的方式。

圖 3. 基于驅(qū)動程序的 libvirt 架構

Libvirt 虛擬化庫如何分析

在撰寫此文時,libvirt 為表 1 所列的虛擬機監(jiān)控程序?qū)崿F(xiàn)了驅(qū)動程序。隨著新的虛擬機監(jiān)控程序在開源社區(qū)出現(xiàn),其他驅(qū)動程序無疑也將可用。

表 1. libvirt 支持的虛擬機監(jiān)控程序

虛擬機監(jiān)控程序描述
Xen面向 IA-32,IA-64 和 PowerPC 970 架構的虛擬機監(jiān)控程序
QEMU面向各種架構的平臺仿真器
Kernel-based Virtual Machine (KVM)Linux 平臺仿真器
Linux Containers(LXC)用于操作系統(tǒng)虛擬化的 Linux(輕量級)容器
OpenVZ基于 Linux 內(nèi)核的操作系統(tǒng)級虛擬化
VirtualBoxx86 虛擬化虛擬機監(jiān)控程序
User Mode Linux面向各種架構的 Linux 平臺仿真器
Test面向偽虛擬機監(jiān)控程序的測試驅(qū)動器
Storage存儲池驅(qū)動器(本地磁盤,網(wǎng)絡磁盤,iSCSI 卷)

libvirt 和虛擬 shell

上面已經(jīng)介紹了 libvirt 的一些架構,接下來看一下如何使用 libvirt 虛擬化 API 的一些示例。首先介紹一種名為 virsh(虛擬 shell)的應用程序,它構建于 libvirt 之上。該 shell 允許以交互(基于 shell)方式使用多個 libvirt 功能。在本節(jié)中,我使用 virsh 演示了一些 VM 操作。

第一步是要定義域配置文件(如下面的 清單 1 所示)。該代碼指定了定義域所需的所有選項 — 從虛擬機監(jiān)控程序(仿真器)到域使用的資源以及外圍配置(比如網(wǎng)絡)。注意,這只是個簡單的配置,libvirt 真正支持的屬性更加多樣化。例如,您可以指定 BIOS 和主機引導程序,域要使用的資源,以及要用到的設備 — 從軟盤和 CD-ROM 到 USB 和 PCI 設備。

域配置文件定義該 QEMU 域要使用的一些基本元數(shù)據(jù),包括域名、最大內(nèi)存、初始可用內(nèi)存(當前)以及該域可用的虛擬處理器數(shù)量。您不需要自己分配 Universally Unique Idenifier (UUID),而是讓 libvirt 分配。您需要為該平臺定義要仿真的機器類型 — 在本例中是被完全虛擬化(hvm)的 686 處理器。您需要為域定義仿真器的位置(以備需要支持多個同類型仿真器時使用)和虛擬磁盤。這里注意要指明 VM,它是以 Virtual Machine Disk(VMDK)格式存在的 ReactOS 操作系統(tǒng)。最后,要指定默認網(wǎng)絡設置,并使用面向圖形的 Virtual Network Computing (VNC)。

清單 1. 域配置文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<xml version="1.0"?>

<domain type='qemu'>

  <name>ReactOS-on-QEMU<name>

  <uuid<uuid>

  <memory>131072<memory>

  <currentMemory>131072<currentMemory>

  <vcpu>1<vcpu>

  <os>

    <type arch='i686' machine='pc'>hvm<type>

  <os>

  <devices>

    <emulator>usr/bin/qemu<emulator>

    <disk type='file' device='disk'>

      <source file='/home/mtj/libvtest/ReactOS.vmdk'/>

      <target dev='hda'/>

    <disk>

    <interface type='network'>

      <source network='default'/>

    <interface>

    <graphics type='vnc' port='-1'/>

  <devices>

<domain>

完成了域配置文件之后,現(xiàn)在開始使用 virsh 工具啟動域。virsh 工具為要執(zhí)行的特定動作采用命令參數(shù)。在啟動新域時,使用 create 命令和域配置文件:

清單 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 驅(qū)動程序的系統(tǒng)模式守護進程上。要通過主機 shinchan 上的 Secure Shell (SSH) 協(xié)議連接到遠程 QEMU 虛擬機監(jiān)控程序,可以使用 URL qemu+ssh://shinchan/。

下一步,您可以使用 virsh 內(nèi)的 list 命令列出給定主機上的活動域。這樣做可以列出活動域,域 ID,以及它們的狀態(tài),如下所示:

清單 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$

注意,這里定義的名稱是在域配置文件元數(shù)據(jù)中定義過的名稱??梢钥吹剑撚虻挠蛎?1 且正在運行中。

您也可以使用 suspend 命令中止域。該命令可停止處于調(diào)度中的域,不過該域仍存在于內(nèi)存中,可快速恢復運行。下面的例子展示了如何中止域,執(zhí)行列表查看狀態(tài),然后重新啟動域:

清單 4. 中止域,檢查狀態(tài),并重新啟動

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)創(chuàng)建域配置文件。

到目前為止,我們已經(jīng)啟動并操作了域,但是如何連接域來查看當前活動域呢?這可以通過 VNC 實現(xiàn)。要創(chuàng)建表示特定域圖形桌面的窗口,可以使用 VNC:

清單 5. 連接到域

1

mtj@mtj-desktop:~/libvtest$ xvnc4viewer 127.0.0.1 0

libvirt 和 Python

上一個例子說明了如何使用命令行工具 virsh 實現(xiàn)對域的控制?,F(xiàn)在我們看一個使用 Python 來控制域的例子。Python 是受 libvirt 支持的腳本語言,它向 libvirt API 提供完全面向?qū)ο蟮慕涌凇?/p>

在本例中,我研究了一些基本操作,與之前用 virsh 工具(list、suspend、resume 等)展示的操作類似。Python 示例腳本見 清單 6。在本例中,我們從導入 libvirt 模塊開始。然后連接到本地 QEMU 虛擬機監(jiān)控程序。從這里開始,重復可用的域 ID;對每個 ID 創(chuàng)建一個域?qū)ο?,然后中止,繼續(xù),最后刪除該域。

清單 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()

雖然這只是個簡單示例,我們?nèi)匀豢梢钥吹?libvirt 通過 Python 提供的強大功能。通過一個簡單的腳本就能夠重復所有本地 QEMU 域,發(fā)行有關域的信息,然后控制域。該腳本的結果如 清單 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 部分:虛擬機監(jiān)控程序連接 API、域 API、網(wǎng)絡 API、存儲卷 API 以及存儲池 API。

為給定虛擬機監(jiān)控程序創(chuàng)建連接后會產(chǎn)生所有 libvirt 通信(例如,清單 6 中所示的 open 調(diào)用)。該連接為所有其他要使用的 API 提供路徑。在 C API 中,該行為通過 virConnectOpen 調(diào)用(以及其他進行認證的調(diào)用)提供。這些函數(shù)的返回值是一個 virConnectPtr 對象,它代表到虛擬機監(jiān)控程序的一個連接。該對象作為所有其他管理功能的基礎,是對給定虛擬機監(jiān)控程序進行并發(fā) API 調(diào)用所必需的語句。重要的并發(fā)調(diào)用是 virConnectGetCapabilitiesvirNodeGetInfo,前者返回虛擬機監(jiān)控程序和驅(qū)動程序的功能,后者獲取有關節(jié)點的信息。該信息以 XML 文檔的形式返回,這樣通過解析便可了解可能發(fā)生的行為。

進入虛擬機監(jiān)控程序后,便可以使用一組 API 調(diào)用函數(shù)重復使用該虛擬機監(jiān)控程序上的各種資源。virConnectListDomains API 調(diào)用函數(shù)返回一列域標識符,它們代表該虛擬機監(jiān)控程序上的活動域。

API 實現(xiàn)大量針對域的函數(shù)。要探究或管理域,首先需要一個 virDomainPtr 對象。您可通過多種方式獲得該句柄(使用 ID、UUID 或域名)。繼續(xù)來看重復域的例子,您可以使用該函數(shù)返回的索引表并調(diào)用 virDomainLookupByID 來獲取域句柄。有了該域句柄,就可以執(zhí)行很多操作,從探究域(virDomainGetUUID、virDomainGetInfovirDomainGetXMLDesc、virDomainMemoryPeek)到控制域(virDomainCreate、virDomainSuspend、virDomainResume、virDomainDestroyvirDomainMigrate)。

您還可使用 API 管理并檢查虛擬網(wǎng)絡和存儲資源。建立了 API 模型之后,需要一個 virNetworkPtr 對象來管理并檢查虛擬網(wǎng)絡,且需要一個 virStoragePoolPtr(存儲池)或 virStorageVolPtr(卷)對象來管理這些資源。

API 還支持一種事件機制,您可使用該機制注冊為在特定事件(比如域的啟動、中止、恢復或停止)發(fā)生時獲得通知。

語言綁定

libvirt 庫用 C (支持 C++)實現(xiàn),且包含對 Python 的直接支持。不過它還支持大量語言綁定。目前已經(jīng)對 Ruby、Java? 語言,Perl 和 OCaml 實施了綁定。在從 C# 調(diào)用 libvirt 方面我們已做了大量工作。libvirt 支持最流行的系統(tǒng)編程語言(CC++)、多種腳本語言、甚至一種統(tǒng)一的函數(shù)型語言(Objective caml)。因此,不管您側重何種語言,libvirt 都會提供一種路徑來幫助您控制域。

使用 libvirt 的應用程序

僅從本文已經(jīng)展示的一小部分功能上便可看出 libvirt 提供的強大功能。且如您所愿,有大量應用程序正成功構建于 libvirt 之上。其中一個有趣的應用程序就是 virsh(這里所示),它是一種虛擬 shell。還有一種名為 virt-install 的應用程序,它可用于從多個操作系統(tǒng)發(fā)行版供應新域。virt-clone 可用于從另一個 VM 復制 VM(既包括操作系統(tǒng)復制也包括磁盤復制)。一些高級應用程序包括多用途桌面管理工具 virt-manager 和安全連接到 VM 圖形控制臺的輕量級工具 virt-viewer。

構建于 libvirt 之上的一種最重要的工具名為 oVirt。oVirt VM 管理應用程序旨在管理單個節(jié)點上的單個 VM 或多個主機上的大量 VM。除了可以簡化大量主機和 VM 的管理之外,它還可用于跨平臺和架構自動化集群,負載平衡和工作。

深入探究

libvirt 是一種用來構建應用程序的強大庫,能夠跨系統(tǒng)的大型網(wǎng)絡在不同的虛擬機監(jiān)控程序環(huán)境中管理域。鑒于云計算的日漸流行,libvirt 無疑也會隨之發(fā)展,不斷獲得新的應用程序和用戶。

上述內(nèi)容就是Libvirt 虛擬化庫如何分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文題目:Libvirt虛擬化庫如何分析
文章網(wǎng)址:http://muchs.cn/article14/ijccge.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、微信小程序動態(tài)網(wǎng)站、App開發(fā)、品牌網(wǎng)站制作、品牌網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)