溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Libvirt 虛擬化庫如何分析

發(fā)布時(shí)間:2021-12-28 16:14:47 來源:億速云 閱讀:146 作者:柒染 欄目:云計(jì)算

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

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

基本架構(gòu)

加入 My developerWorks 上的綠色小組

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

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

圖 1. libvirt 比較和用例模型

Libvirt 虛擬化庫如何分析

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

控制方式

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

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

Libvirt 虛擬化庫如何分析

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

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

圖 3. 基于驅(qū)動(dòng)程序的 libvirt 架構(gòu)

Libvirt 虛擬化庫如何分析

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

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

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

libvirt 和虛擬 shell

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

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

域配置文件定義該 QEMU 域要使用的一些基本元數(shù)據(jù),包括域名、最大內(nèi)存、初始可用內(nèi)存(當(dāng)前)以及該域可用的虛擬處理器數(shù)量。您不需要自己分配 Universally Unique Idenifier (UUID),而是讓 libvirt 分配。您需要為該平臺(tái)定義要仿真的機(jī)器類型 — 在本例中是被完全虛擬化(hvm)的 686 處理器。您需要為域定義仿真器的位置(以備需要支持多個(gè)同類型仿真器時(shí)使用)和虛擬磁盤。這里注意要指明 VM,它是以 Virtual Machine Disk(VMDK)格式存在的 ReactOS 操作系統(tǒng)。最后,要指定默認(rèn)網(wǎng)絡(luò)設(shè)置,并使用面向圖形的 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 工具啟動(dòng)域。virsh 工具為要執(zhí)行的特定動(dòng)作采用命令參數(shù)。在啟動(dòng)新域時(shí),使用 create 命令和域配置文件:

清單 2. 啟動(dòng)新域

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

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

清單 3. 列出活動(dòng)域

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 且正在運(yùn)行中。

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

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

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),恢復(fù)已存域的命令(restore),重新啟動(dòng)域的命令(reboot),以及其他命令。您還可以從運(yùn)行中的域(dumpxml)創(chuàng)建域配置文件。

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

清單 5. 連接到域

1

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

libvirt 和 Python

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

在本例中,我研究了一些基本操作,與之前用 virsh 工具(list、suspend、resume 等)展示的操作類似。Python 示例腳本見 清單 6。在本例中,我們從導(dǎo)入 libvirt 模塊開始。然后連接到本地 QEMU 虛擬機(jī)監(jiān)控程序。從這里開始,重復(fù)可用的域 ID;對每個(gè) ID 創(chuàng)建一個(gè)域?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()

雖然這只是個(gè)簡單示例,我們?nèi)匀豢梢钥吹?libvirt 通過 Python 提供的強(qiáng)大功能。通過一個(gè)簡單的腳本就能夠重復(fù)所有本地 QEMU 域,發(fā)行有關(guān)域的信息,然后控制域。該腳本的結(jié)果如 清單 7 所示。

清單 7. 清單 6 中的 Python 腳本輸出的結(jié)果

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 個(gè) API 部分:虛擬機(jī)監(jiān)控程序連接 API、域 API、網(wǎng)絡(luò) API、存儲(chǔ)卷 API 以及存儲(chǔ)池 API。

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

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

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

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

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

語言綁定

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

使用 libvirt 的應(yīng)用程序

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

構(gòu)建于 libvirt 之上的一種最重要的工具名為 oVirt。oVirt VM 管理應(yīng)用程序旨在管理單個(gè)節(jié)點(diǎn)上的單個(gè) VM 或多個(gè)主機(jī)上的大量 VM。除了可以簡化大量主機(jī)和 VM 的管理之外,它還可用于跨平臺(tái)和架構(gòu)自動(dòng)化集群,負(fù)載平衡和工作。

深入探究

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

上述內(nèi)容就是Libvirt 虛擬化庫如何分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI