感謝朋友支持本博客。歡迎共同探討交流。因為能力和時間有限,錯誤之處在所難免,歡迎指正!
假設轉載,請保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
郵箱地址:dong.liu@siat.ac.cn
這是本人之前在實驗室做的一個LIBVIRT學習報告。
1.什么是libvirt
比方。啟動。停用,配置,連接控制台等。這樣在構建雲管理的時候就存在兩個問題:
libvirt就是扮演的這個角色。有了它,上面兩個問題就迎刃而解。
libvirt提供各種API,供上層來管理不同的虛擬機。
它為受支持的虛擬機監控程序實現的經常使用功能提供通用的API。
虛擬機管理:包含不同的領域生命周期操作。比方:啟動、停止、暫停、保存、恢復和遷移。
支持多種設備類型的熱插拔操作,包含:磁盤、網卡、內存和CPU。
遠程機器支持:僅僅要機器上執行了libvirt daemon,包含遠程機器,全部的libvirt功能就都能夠訪問和使用。
支持多種網絡遠程傳輸。使用最簡單的SSH,不須要額外配置工作。
存儲管理:不論什么執行了libvirt daemon的主機都能夠用來管理不同類型的存儲:創建不同格式的文件鏡像(qcow2、vmdk、raw等)、掛接NFS共享、列出現有的LVM卷組、創建新的LVM卷組和邏輯卷、對未處理過的磁盤設備分區、掛接iSCSI共享。等等等等。由於libvirt能夠遠程工作。全部這些都能夠通過遠程主機使用。
網絡接口管理:不論什么執行了libvirt daemon的主機都能夠用來管理物理和邏輯的網絡接口。
虛擬NAT和基於路由的網絡:不論什么執行了libvirt daemon的主機都能夠用來管理和創建虛擬網絡。
只是它還支持大量語言綁定。眼下已經對Ruby、Java語言,Perl和 OCaml實施了綁定。libvirt支持最流行的系統編程語言(C和C++)、多種腳本語言。因此。無論您側重何種語言。都能夠方便的應用Libvirt。
4.Libvirt支持的虛擬機
眼下支持的虛擬化技術包含:
能夠說是很豐富,主流的虛擬化技術都包括了。
5.Libvirt體系結構

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


該管理應用程序通過一種通用協議從本地libvirt連接到遠程libvirtd。

6.Libvirt相關工具介紹
它構建於libvirt之上,同意以交互方式使用多個libvirt功能。
這僅僅是個簡單的配置。libvirt真正支持的屬性更加多樣化。

啟動新域時,使用create命令和域配置文件:
3).使用virsh內的list命令列出給定主機上的活動域、域ID以及狀態:
4).也能夠使用suspend命令中止域。該命令可停止處於調度中的域,只是該域仍存在於內存中。可高速恢復執行。
如今我們看一個使用Python來控制域的樣例。
對每一個 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()# 刪除
高級libvirt API可划分為5個API部分:虛擬機監控程序連接API、域API、網絡API、存儲卷API、存儲池API。
每個實體,要與libvirt互相作用,應用virsh, virt-manager或者使用libvirt庫。都須要首先獲得一個到主機上libvirt守護進程的連接。
演示樣例:
virConnectPtr conn;
連接本地和遠程的hypervisor都是libvirt使用URI來進行處理。
如xen, qemu,lxc, openvz和test。
返回虛擬機監控程序和驅動程序的功能描寫敘述。它包括一個指針。假設調用成功,將返回一個字符串,當中包括了描寫敘述功能信息的XML文件。
它採用了一個連接指針和一個virNodeInfo指針(由調用者分配)作為輸入,假設成功。則會返回0。而且將獲取信息填寫在virNodeInfo結構體中。
提供關於引發錯誤的很具體的信息。假設多個發生錯誤在沒有錯誤監測機制的連接上的時候。錯誤信息有可能會丟失。由於這個原因。強烈建議常常對錯誤進行監測,並在libvirt API調用失敗以后,馬上進行錯誤收集。
一個暫時的域僅僅由當它在主機上執行的時候才干夠被管理,一旦關閉。全部執行的跡象都會消失。
當一個持續的域被關閉時,仍然可能會管理這個域的無效的配置。當執行定義好的配置文件時。一個暫時的域能夠轉變成一個持續的域。
演示樣例:
為了確定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);
打印無效的持久域的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);
不論什么未定義或者沒有建立的域的狀態。

當這個域系統關閉的時候。全部的執行痕跡將會消失。
- 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 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(管理存儲文件系統)這里先不做介紹了。假設有須要的話,能夠直接看官方文檔,介紹的非常具體,還有非常多簡單明了的演示樣例。