日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Libvirt学习总结

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Libvirt学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是本人之前在實驗室做的一個LIBVIRT學習報告。

1.什么是libvirt

??? 虛擬云實現的三部曲:虛擬化技術實現-->虛擬機管理-->集群資源管理(云管理)。各種不同的虛擬化技術都提供了基本的管理工具。比如,啟動,停用,配置,連接控制臺等。這樣在構建云管理的時候就存在兩個問題:

??? 1) 如果采用混合虛擬技術,上層就需要對不同的虛擬化技術調用不同管理工具,很是麻煩。

??? 2) 虛擬化技術發展很迅速,系統虛擬化和容器虛擬化均在發展和演化中。可能有新的虛擬化技術更加符合現在的應用場景,需要遷移過去。這樣管理平臺就需要大幅改動。

??? 為了適應變化,我們慣用的手段是分層,使之相互透明,在虛擬機和云管理中設置一個抽象管理層。libvirt就是扮演的這個角色。有了它,上面兩個問題就迎刃而解。libvirt提供各種API,供上層來管理不同的虛擬機。

??? Libvirt是管理虛擬機和其他虛擬化功能,比如存儲管理,網絡管理的軟件集合。它包括一個API庫,一個守護程序(libvirtd)和一個命令行工具(virsh);libvirt本身構建于一種抽象的概念之上。它為受支持的虛擬機監控程序實現的常用功能提供通用的API。

??? libvirt的主要目標是為各種虛擬化工具提供一套方便、可靠的編程接口,用一種單一的方式管理多種不同的虛擬化提供方式。
?

2.Libvirt主要支持的功能
??? 虛擬機管理:包括不同的領域生命周期操作,比如:啟動、停止、暫停、保存、恢復和遷移。支持多種設備類型的熱插拔操作,包括:磁盤、網卡、內存和CPU。
??? 遠程機器支持:只要機器上運行了libvirt daemon,包括遠程機器,所有的libvirt功能就都可以訪問和使用。支持多種網絡遠程傳輸,使用最簡單的SSH,不需要額外配置工作。
??? 存儲管理:任何運行了libvirt daemon的主機都可以用來管理不同類型的存儲:創建不同格式的文件鏡像(qcow2、vmdk、raw等)、掛接NFS共享、列出現有的LVM卷組、創建新的LVM卷組和邏輯卷、對未處理過的磁盤設備分區、掛接iSCSI共享,等等等等。因為libvirt可以遠程工作,所有這些都可以通過遠程主機使用。
??? 網絡接口管理:任何運行了libvirt daemon的主機都可以用來管理物理和邏輯的網絡接口。
??? 虛擬NAT和基于路由的網絡:任何運行了libvirt daemon的主機都可以用來管理和創建虛擬網絡。
?

3.Libvirt語言綁定

??? libvirt庫用C(支持 C++)實現,且包含對Python的直?接支持。不過它還支持大量語言綁定。目前已經對Ruby?、Java語言,Perl和 OCaml實施了綁定。libvirt支持最?流行的系統編程語言(C和C++)、多種腳本語言。因此?,不管您側重何種語言,都可以方便的應用Libvirt。

4.Libvirt支持的虛擬機
??? 目前支持的虛擬化技術包括:

??? 可以說是非常豐富,主流的虛擬化技術都包含了。

5.Libvirt?體系結構

??? 沒有使用libvirt的虛擬機管理方式如下圖所示:


??? 為支持各種虛擬機監控程序的可擴展性,libvirt實施一種基于驅動程序的架構,該架構允許一種通用的API以通用方式為大量潛在的虛擬機監控程序提供服務。下圖展示了libvirt API與相關驅動程序的層次結構。這里也需要注意,libvirtd提供從遠程應用程序訪問本地域的方式。

??? libvirt的控制方式有兩種:

??? 1)管理應用程序和域位于同一節點上。管理應用程序通過libvirt工作,以控制本地域。

??? 2)管理應用程序和域位于不同節點上。該模式使用一種運行于遠程節點上、名為libvirtd的特殊守護進程。當在新節點上安裝libvirt時該程序會自動啟動,且可自動確定本地虛擬機監控程序并為其安裝驅動程序。該管理應用程序通過一種通用協議從本地libvirt連接到遠程libvirtd。


6.Libvirt相關工具介紹

??? 接下來介紹一種名為virsh(虛擬 shell)的應用程序,基于命令行的管理工具,可以實現簡單的資源管理。它構建于libvirt之上,允許以交互方式使用多個libvirt功能。

??? 下面我們通過一個應用virsh來實現對域的管理的例子來了解virsh這個工具:

??? 1).定義域配置文件。該代碼指定了定義域所需的所有選項—從虛擬機監控程序(仿真器)到域使用的資源以及外圍配置。這只是個簡單的配置,libvirt真正支持的屬性更加多樣化。

??? 2).完成了域配置文件之后,使用virsh工具啟動域。啟動新域時,使用create命令和域配置文件:

??? ld@ld-Lenovo :~/libvtest$ virsh create react-qemu.xml

??? Connecting to uri: qemu:///system

??? Domain ReactOS-on-QEMU created from react-qemu.xml

??? ld@ld-Lenovo :~/libvtest$
??? 3).使用virsh內的list命令列出給定主機上的活動域、域ID以及狀態:

??? ld@ld-Lenovo :~/libvtest$ virsh list

??? Connecting to uri: qemu:///system

??? Id Name???????????????? State

??? ----------------------------------

??? 1 ReactOS-on-QEMU????? running

??? ld@ld-Lenovo :~/libvtest$
??? 4).也可以使用suspend命令中止域。該命令可停止處于調度中的域,不過該域仍存在于內存中,可快速恢復運行。

??? ld@ld-Lenovo :~/libvtest$ virsh suspend 1

??? Connecting to uri: qemu:///system

??? Domain 1 suspended

??? ld@ld-Lenovo :~/libvtest$ virsh list

??? Connecting to uri: qemu:///system

??? Id Name???????????????? State

??? ----------------------------------

??? 1 ReactOS-on-QEMU????? paused

??? ld@ld-Lenovo :~/libvtest$ virsh resume 1

??? Connecting to uri: qemu:///system

??? Domain 1 resumed

??? ld@ld-Lenovo :~/libvtest$
?

7.Libvirt和Pythonn

??? Python是受libvirt支持的腳本語言,它向libvirt API提供完全面向對象的接口。現在我們看一個使用Python來控制域的例子。

??? 在本例中,從導入libvirt模塊開始。然后連接到本地虛擬機監控程序。對每個 ID 創建一個域對象,然后中止,繼續,最后刪除該域。

?
  • 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()# 刪除

  • ??? 輸出結果:

    ??? ld@ld-Lenovo :~/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)

    ??? ld@ld-Lenovo :~/libvtest$

    ??? 雖然這只是個簡單示例,我們仍然可以看到 libvirt 通過 Python 提供的強大功能。通過一個簡單的腳本就能夠管理本地域,發行有關域的信息,然后控制域。
    ?

    8.Libvirt API介紹
    ??? 高級libvirt API可劃分為5個API部分:虛擬機監控程序連接API、域API、網絡API、存儲卷API、存儲池API。
    ?

    1).連接API

    ??? 在libvirt中,連接是系統中的每一個動作和對象的基礎。每一個實體,要與libvirt互相作用,應用virsh, virt-manager或者使用libvirt庫,都需要首先獲得一個到主機上libvirt守護進程的連接。

    ??? 鏈接是與特定的hypervisor相關聯的,它可能與libvirt客戶端程序同時運行在本地的一個節點上,也可能通過網絡連接到遠程的機器上。通常情況下,鏈接由virConnectPtr對象代表,并且由一個URI來定義。

    ??? 一個libvirt代理程序要做的第一件事就是調用libvirt連接函數獲得virConnectPtr句柄。在后續的操作中,該句柄作為所有其他管理功能的基礎。

    (1).連接函數

    ??? libvirt庫為連接到一個資源提供了三種不同的函數,三個函數之間的區別在于它們提供的驗證方式以及由此產生的授權的方法。

    ??? virConnectPtr virConnectOpen(const char *name)

    ??? 以實現完全的讀寫訪問,不包含任何認證機制,而僅僅提供一種連接。

    ??? 示例:conn = virConnectOpen("qemu:///system");

    ??? virConnectPtr virConnectOpenReadOnly(const char *name)

    ??? virConnectOpenReadOnly API會打開一個只讀訪問的連接。

    ??? 示例:conn = virConnectOpenReadOnly("qemu:///system");

    ??? virConnectPtr virConnectOpenAuth(const char *name, virConnectAuthPtr auth, int flags)

    ??? 提供了一種基于認證機制的連接;

    ??? 示例:conn = virConnectOpenAuth("qemu+tcp://localhost/system", virConnectAuthPtrDefault, 0);

    (2).關閉連接

    ??? virConnectClose

    ??? 當不再需要連接的時候,必須調用virConnectClose來斷開連接。
    ??? 示例:
    ??? virConnectPtr conn;

    ??? conn = virConnectOpen("qemu:///system");

    ??? virConnectClose(conn);

    (3).URI格式

    ??? Libvirt使用統一的資源標識符(URI)來識別管理連接。連接本地和遠程的hypervisor都是libvirt使用URI來進行處理。

    ??? 本地URI:

    ??? Libvirt的本地URI具備下述格式之一:

    ??? driver:///system

    ??? driver:///session

    ??? driver+unix:///system

    ??? driver+unix:///session

    ??? 遠程URI:

    ??? 遠程URI具有通用的格式("[...]"表示可選部分):

    ??? driver[+transport]://[username@][hostname][:port]/[path][?extraparameters]

    ??? 參數解釋:

    ??? driver:libvirt 所連接的driver的名字。如xen, qemu,lxc, openvz和test。

    ??? transport:數據傳輸方式,可用的方式包括tls, tcp, unix, ssh和ext。

    ??? hostname:遠程機器的主機名。

    ??? port:很少使用。

    ??? 遠程訪問URI的例子:

    ??? 應用SSH數據傳輸通道連接一個主機名為node.example.com上的遠程Xen hypervisor,SSH的用戶名根目錄為:xen+ssh://root@node.example.com/

    (4).獲取虛擬機功能信息的API

    ??? virConnectGetCapabilities的調用能夠用于獲取虛擬主機的功能信息。返回虛擬機監控程序和驅動程序的功能描述。它包含一個指針,如果調用成功,將返回一個字符串,其中包括了描述功能信息的XML文件。

    ??? capabilities XML格式提供了有關主機虛擬化技術的信息。特別的,他描述了虛擬主機的功能、虛擬化驅動程序以及所采用的虛擬技術所能夠啟動的客戶端的類型等等。

    ??? 具體例子不再描述。

    (5).獲取主機信息的API

    ??? 各種不同的API可以用來獲得虛擬主機的信息,包括主機名、最大支持的CPU個數等。

    ??? virConnectGetHostname的調用可以獲得虛擬主機的主機名。

    ??? virConnectGetMaxVcpus的調用可以獲得每個域的虛擬CPU最大個數。

    ??? virNodeGetFreeMemory調用能夠獲得虛擬主機中空閑內存的總量。

    ??? virNodeGetInfo的調用可以用來獲得虛擬主機的各種信息。它采用了一個連接指針和一個virNodeInfo指針(由調用者分配)作為輸入,如果成功,則會返回0,并且將獲取信息填寫在virNodeInfo結構體中。

    ??? virNodeInfo結構體包括以下成員:

    ??? char model[32]??????????????? 表示CPU型號的字符串

    ??? unsigned long memory????????? 以kb為單位的內存大小

    ??? unsigned int cpus????????????? 活躍的CPU數目

    ??? unsigned int mhz?????????????? 期望的CPU頻率

    ??? unsigned int nodes???????????? NUMA節點數目,1表示一致性內存訪問

    ??? unsigned int sockets?????????? 每一個節點的CPU socket的數目

    ??? unsigned int cores???????????? 每一個socket的核數

    ??? unsigned int threads?????????? 每一個核的線程數

    ??? virConnectGetType的調用能夠獲得處于連接使用中的虛擬機的類型。

    ??? virConnectGetVersion可以獲取使用中的主機上虛擬機軟件的版本。

    ??? virConnectGetLibVersion可以獲得正在使用中的主機上的libvirt軟件的版本。

    ??? virConnectGetURI能夠用來獲取當前連接中的URI。

    ??? virConnectIsEncrypted的調用能夠查詢一個給定的連接是否加密。

    ??? virConnectIsSecure的調用能夠查詢一個給定的連接是否安全。

    (6).錯誤處理API

    ??? libvirt error API將會在一個正常的libvirt API調用返回錯誤標志的時候。提供關于引發錯誤的非常詳細的信息。如果多個錯誤發生在沒有錯誤監測機制的連接上的時候,錯誤信息有可能會丟失。因為這個原因,強烈建議經常對錯誤進行監測,并在libvirt API調用失敗以后,立即進行錯誤收集。

    ?

    2).域API

    ??? 域API用于虛擬機管理,包括創建,啟動,停用,遷移,動態修改配置等。

    ??? 進入虛擬機監控程序后,便可以使用一組 API 調用函數重復使用該虛擬機監控程序上的各種資源。API實現大量針對域的函數。要探究或管理域,首先需要一個virDomainPtr對象。您可通過多種方式獲得該句柄(使用ID、UUID或域名)。有了該域句柄,就可以執行很多操作,從探究域(virDomainGetUUID、virDomainGetInfo、virDomainGetXMLDesc)到控制域(virDomainCreate 、virDomainSuspend 、virDomainResume 、virDomainDestroy)。

    ??? 域可以指任何正在運行的虛擬機或者是可以用來啟動虛擬機的配置。鏈接對象提供了API用來枚舉域、創建新域和管理現有域。域用virDomainPtr對象來表示,并有自己唯一的標示符。

    ??? 域可以是臨時的也可以是持久的。一個臨時的域只由當它在主機上運行的時候才能夠被管理,一旦關閉,所有運行的跡象都會消失。當一個持續的域被關閉時,仍然可能會管理這個域的無效的配置。當運行定義好的配置文件時,一個臨時的域可以轉變成一個持續的域。

    (1).域的標識符

    ??? 唯一標識符:

    ??? ID:正整數類型,一個單節點上的若干域中,每個域都有唯一的ID。無效的域沒有ID號。

    ??? name:字符串類型,在一個主機上的所有域中是唯一的,包括運行的域和無效的域。

    ??? UUID:16比特無符號類型,保證在任何主機上的所有域之間是唯一的。

    (2).域的獲取

    ??? 有三個獲取現有的域的API,即virDomainLookupByID, virDomainLookupByName 和virDomainLookupByUUID.這些對象中都用一個連接對象作為第一個輸入參數,以及域標示符作為其它的輸入參數。
    示例:

    ??? 從ID獲取一個域對象

    ??? int domainID = 6;

    ??? virDomainPtr dom;

    ??? dom = virDomainLookupByID(conn, domainID);

    ??? 從name獲取一個域對象

    ??? int domainName = "someguest";

    ??? virDomainPtr dom;

    ??? dom = virDomainLookupByName(conn, domainName);

    ??? 從UUID獲取一個域對象

    ??? char *domainUUID = "00311636-7767-71d2-e94a-26e7b8bad250";

    ??? virDomainPtr dom;

    ??? dom = virDomainLookupByUUIDString(conn, domainUUID);

    (3).域表單的獲取

    ??? Libvirt API公開了兩個域的列表,第一個包含運行域,第二個包含無效的持久的域。

    ??? 活躍的域列表的API--virConnectListDomains,返回域ID的列表。為了確定ID數組的大小,應用程序可以調用virConnectNumOfDomains API來解決。把這兩個API調用放在一起,打印運行域ID列表的代碼將會是如下所示:

    ?
  • int i;

  • int numDomains;

  • int *activeDomains;

  • numDomains = virConnectNumOfDomains(conn);

  • activeDomains = malloc(sizeof(int) * numDomains);

  • numDomains = virConnectListDomains(conn, activeDomains, numDomains);

  • printf("Active domain IDs:\n");

  • for (i = 0 ; i < numDomains ; i++) {

  • printf(" %d\n", activeDomains[i]);

  • }

  • free(activeDomains);

  • ??? 除了正在運行的域,可能還會有一些持久的無效域配置存儲在主機上。如果一個無效的域不具備任何的ID標志,這個不活躍域的列表將會以name字符串列表的形式輸出。??? virConnectListDefinedDomains將會返回所填充的name字符串到數組元素的總數量。也有一個virConnectNumOfDefinedDomains來確定name的數量。打印無效的持久域的name列表的代碼將會是如下所示:

    ?
  • int i;

  • int numDomains;

  • char **inactiveDomains;

  • numDomains = virConnectNumOfDefinedDomains(conn);

  • inactiveDomains = malloc(sizeof(char *) * numDomains);

  • numDomains = virConnectListDomains(conn, inactiveDomains, numDomains);

  • printf("Inactive domain names:\n");

  • for (i = 0 ; i < numDomains ; i++) {

  • printf(" %s\n", inactiveDomains[i]);

  • free(inactiveDomains[i]);

  • }

  • free(inactiveDomains);

  • (4).域生命周期的控制

    ??? Libvirt能夠控制域的整個生命周期。域可以在它的整個生命周期的幾個狀態之間進行轉換:

    ??? Undefined這是一個基本的狀態。任何沒有定義或者沒有建立的域的狀態。

    ??? Defined這是一個域已定義但是沒有運行的狀態。這種狀態也可以被描述為停止。

    ??? Running這是一個已經定義并運行在一個hypervisor上面的域的狀態。

    ??? Paused這個狀態是形容一個域系統從運行狀態轉換為暫停狀態。它的內存鏡像已經被暫時地存儲,它可以恢復到運行狀態。

    ??? 三個重要的API:

    ??? virDomainCreateXML將會建立并立即引導啟動一個新的臨時性的域。當這個域系統關閉的時候,所有的運行痕跡將會消失。

    ??? virDomainDefineXML將會為一個持久性的域建立并存儲配置文件。

    ??? virDomainCreate將會從持久性配置中引導啟動一個預先定義的域。

    ??? 引導一個臨時的域

    ??? 如果想引導一個臨時的域,只需要建立一個對libvirt的連接以及一個包含了描述了所需求的域的配置的XML文檔的字符串。

    ?
  • virDomainPtr dom;

  • const char *xmlconfig = "<domain>........</domain>";

  • dom = virConnectCreateXML(conn, xmlconfig, 0);

  • if (!dom)

  • {

  • fprintf(stderr, "Domain creation failed");

  • return;

  • }

  • fprintf(stderr, "Guest %s has booted",virDomainName(dom));

  • virDomainFree(dom);

  • ??? 如果創建域的嘗試成功,那么將會返回virDomainPtr作為這個域的句柄。盡管域引導啟動成功,但是這不能保證這個域的持續運行。

    ??? 定義并引導一個持久的域

    ??? 在一個持久域能夠被引導之前,必須使它的配置文件已經定義完成。這也要求建立一個對libvirt的連接以及一個包含了描述了所需求的來賓域的配置文件的XML文檔的字符串。下面的示例假定了conn是virConnectPtr對象的實例。

    ?
  • virDomainPtr dom;

  • const char *xmlconfig = "<domain>........</domain>";

  • dom = virConnectDefineXML(conn, xmlconfig, 0);

  • if(virDomainCreate(dom) < 0){

  • virDomainFree(dom);

  • fprintf(stderr, "Cannot boot guest");

  • return;

  • }

  • fprintf(stderr,"Guest %s has booted",virDomainName(dom));

  • virDomainFree(dom);


  • ??? 至于網絡 API(監控虛擬網絡)、存儲卷 API(管理存儲設備)和存儲池 API(管理存儲文件系統)這里先不做介紹了,如果有需要的話,可以直接看官方文檔,介紹的很詳細,還有很多簡單明了的示例。

    總結

    以上是生活随笔為你收集整理的Libvirt学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。