libvirt虚拟化技术介绍
一、libvirt簡介
libvirt 是一個管理 hypervisor 的上層軟件,它通過不同的驅動統一管理不同類型的 hypervisor ,并對外提供統一、穩定的應用程序接口。
在云場景中,業內廣泛使用 libvirt 管理大規模的虛擬機。為了方便地對大規模的 StratoVirt 虛擬機進行部署、編排和管理,StratoVirt 標準虛擬化支持對接 libvirt,打通了 libvirt 北向接口。用戶可以通過 libvirt 對應的 XML 文件描述一個虛擬機,包括虛擬機名稱、CPU、磁盤等。
libvirt是目前使用最為廣泛的對kvm虛擬機進行管理的工具和應用程序接口,而且一些常用的虛擬機管理工具(如virsh,virt-install,virt-manager等)和云計算框架平臺(QpenStack,OpenNebula,Eucalyptus等)都在底層使用libvirt的應用程序接口。
盡管libvirt項目最初是為Xen支持也是非常得好,libvirt支持多種虛擬化方案,即支持包括KVM,QEMU,Xen,VMware,VirtualBox等在內的平臺虛擬化方案,又支持QpenVZ,LXC等linux容器虛擬化系統,還支持用戶態linux(UML)的虛擬化。
libvirt提供的要素:
主要提供的功能:
- 虛擬機生命周期管理:包括不同的領域生命周期操作,比如:啟動、停止、暫停、保存、恢復和遷移。支持多種設備類型的熱插拔操作,包括:磁盤、網卡、內存和CPU。
- 本地&&遠程訪問:通過在本地運行libvirt daemon,本機和遠程機器,都可以訪問并使用libvirt的功能。遠程一般通過簡單配置SSH即可。
- 存儲管理:除了虛擬機管理,任何運行了libvirt daemon的主機都可以用來管理不同類型的存儲:創建不同格式的文件鏡像(qcow2、vmdk、raw等)、掛接NFS共享、列出現有的LVM卷組、創建新的LVM卷組和邏輯卷、對未處理過的磁盤設備分區、掛接iSCSI共享等。
- 虛擬網絡管理:可以用來管理和創建虛擬網絡,管理物理和邏輯的網絡接口。
二、libvirt簡單架構原理介紹
libvirt架構:
libvirt實施一種驅動程序的架構,該架構允許一種通用的API以通用的方式為大量潛在的虛擬機監控程序提供服務。
?libvirt運行原理:
在libvirt中涉及幾個重要的概念:
1、節點(Node)是一個物理機器,上面可能運行著多個虛擬客戶機,Hypervisor和Domain都運行在節點上。
2、Hypervisor也稱虛擬監視器(VMM),如KVM,Xen,VMware,Hyper-V等,是虛擬化中一個底層軟件層,它可以虛擬化一個節點讓其運行多個虛擬機客戶機(不同客戶及可能有不同的配置和操作系統)。
3、域(Domain)實在Hypervisor上運行的一個客戶機操作系統實例,域也被稱為實例(instance,如亞馬遜的aws云計算服務中的客戶機就被稱為實例),客戶機操作系統(guest os),虛擬化(virtual machine),它們都是指同一個概念。
節點,Hypervisor和域的關系:
?libvirt的管理功能主要包含的部分:
1、域的管理;
2、遠程節點的管理;
3、存儲的管理;
4、網絡的管理;
5、提供一個穩定、可靠、高效的應用程序接口(API)以便可以完成前四個管理功能。
三、libvirt API介紹
libvirt API簡介:
libvirt的核心價值和主要目標就是提供了一套管理虛擬機、穩定的、高效的應用程序接口(API)。
libvirti API所管理的主要對象:
對象的管理模型:?
Libvirt API大致可劃分為八個部分:
1、連接Hypervisor相關的API:以virCnnect開頭的一系列函數。
只有與 Hypervisor 建立了連接之后,才能進行虛擬機管理操作,所以連接 Hypervisor 的API是其他所有API使用的前提條件。與 Hypervisor 建立的連接是為其他API的執行提供了路徑,是其他虛擬化管理功能的基礎。通過調用 virConnectOpen 函數可以建立一個連接,其返回值是一個virConnectPtr 對象,該對象就代表到 Hypervisor 的一個連接;如果連接出錯,則返回空值(NULL)。而 virConnectOpenReadOnly 函數會建立一個只讀的連接,在該連接上可以使用一些查詢的功能,而不使用創建、修改等功能。 virConnectOpenAuth 函數提供了更具認證建立的連接。 virConnectGetCapabilities 函數是返回對 Hypervisor 和驅動的功能的描述的 XML 格式的字符串。virConnectListDomains函數返回一列域標識符,它們代表該 Hypervisor 上的活動域。
2、域管理的的API:以virDomain開頭的一系列函數。
虛擬機的管理,最基本的職能就是對各個節點上的域的管理,故 libvirt API 中實現了很多針對域管理的函數。要管理域,首先就要獲取virDomainPtr 這個域對象,然后才能對域進行操作。有很多種方式來獲取域對象,如 virDomainPtr virDomainLookupByID (virConnectPtr conn, int id) 函數是根據域的 id 值到 conn 這個連接上去查找相應的域。類似地,virDomainLookupByName、virDomainLookupByUUID 等函數分別是根據域的名稱和 UUID 去查找相應的域。在得到了某個域的對象后,就可以進行很多的操作,可以是查詢域的信息(如:virDomainGetHostname、virDomainGetInfo、virDomainGetVcpus、virDomainGetVcpusFlags、virDomainGetCPUStats,等等),也可以是控制域的生命周期(如:virDomainCreate 、virDomainSuspend 、virDomainResume 、virDomainDestroy 、virDomainMigrate,等等)。
3、節點管理的API:以virNetwork開頭的一系列函數。
域是運行在物理節點之上,libvirt也提供了對節點的信息查詢和控制的功能。節點管理的多數函數都需要使用一個連接 Hypervisor 的對象作為其中的一個傳入參數,以便可以查詢或修改到該連接上的節點的信息。virNodeGetInfo函數是獲取節點的物理硬件信息,virNodeGetCPUStats 函數可以獲取節點上各個 CPU 的使用統計信息,virNodeGetMemoryStats 函數可以獲取節點上的內存的使用統計信息,virNodeGetFreeMemory 函數可以獲取節點上可用的空閑內存大小。也有一些設置或者控制節點的函數,如virNodeSetMemoryParameters 函數可以設置節點上的內存調度的參數,virNodeSuspendForDuration 函數可以讓節點(宿主機)暫停運行一段時間。
4、網絡管理的API:以virNetwork開頭的一系列函數和部分以virlnterface開頭的函數。
libvirt 對虛擬化環境中的網絡管理也提供了豐富的API。libvirt 首先需要創建virNetworkPtr 對象,然后才能查詢或控制虛擬網絡。一些查詢網絡相關信息的函數,如:virNetworkGetName 函數可以獲取網絡的名稱,virNetworkGetBridgeName 函數可以獲取該網絡中網橋的名稱,virNetworkGetUUID 函數可以獲取網絡的 UUID 標識,virNetworkGetXMLDesc 函數可以獲取網絡的以 XML 格式的描述信息,virNetworkIsActive 函數可以查詢網絡是否正在使用中。一些控制或更改網絡設置的函數,有:virNetworkCreateXML 函數可以根據提供的 XML 格式的字符串創建一個網絡(返回 virNetworkPtr 對象),virNetworkDestroy 函數可以銷毀一個網絡(同時也會關閉使用該網絡的域),virNetworkFree 函數可以回收一個網絡(但不會關閉正在運行的域),virNetworkUpdate 函數可根據提供的 XML 格式的網絡配置來更新一個已存在的網絡。另外,virInterfaceCreate、virInterfaceFree、virInterfaceDestroy、virInterfaceGetName、virInterfaceIsActive 等函數可以用于創建、釋放和銷毀網絡接口,以及查詢網絡接口的名稱和激活狀態。
5、存儲卷管理的API:以virStouageVol開頭的一系列函數。
libvirt 對存儲卷(volume)的管理,主要是對域的鏡像文件的管理,這些鏡像文件可能是 raw、qcow2、vmdk、qed等各種格式。libvirt 對存儲卷的管理,首先需要創建virStorageVolPtr 這個存儲卷的對象,然后才能對其進行查詢或控制操作。libvirt 提供了3個函數來分別通過不同的方式來獲取存儲卷對象,如:virStorageVolLookupByKey 函數可以根據全局唯一的鍵值來獲得一個存儲卷對象,virStorageVolLookupByName 函數可以根據名稱在一個存儲資源池(storage pool)中獲取一個存儲卷對象,virStorageVolLookupByPath 函數可以根據它在節點上路徑來獲取一個存儲卷對象。有一些函數用于查詢存儲卷的信息,如:virStorageVolGetInfo 函數可以查詢某個存儲卷的使用情況,virStorageVolGetName 函數可以獲取存儲卷的名稱,virStorageVolGetPath 函數可以獲取存儲卷的路徑,virStorageVolGetConnect 函數可以查詢存儲卷的連接。一些函數用于創建和修改存儲卷,如:virStorageVolCreateXML 函數可以根據提供的 XML 描述來創建一個存儲卷,virStorageVolFree 函數可以釋放存儲卷的句柄(但是存儲卷依然存在),virStorageVolDelete 函數可以刪除一個存儲卷,virStorageVolResize 函數可以調整存儲卷的大小。
6、存儲池管理的API:以virStoragePool開頭的一系列函數。
libvirt 對存儲池(pool)的管理,包括對本地的基本文件系統、普通網絡共享文件系統、iSCSI共享文件系統、LVM分區等的管理。libvirt 需要基于 virStoragePoolPtr 這個存儲池對象才能進行查詢和控制操作。一些函數可以通過查詢獲取一個存儲池對象,如:virStoragePoolLookupByName 函數可以根據存儲池的名稱來獲取一個存儲池對象,virStoragePoolLookupByVolume 可以根據一個存儲卷返回其對應的存儲池對象。virStoragePoolCreateXML 函數可以根據 XML 描述來創建一個存儲池(默認已激活),virStoragePoolDefineXML 函數可以根據 XML 描述信息靜態地定義個存儲池(尚未激活),virStoragePoolCreate 函數可以激活一個存儲池。virStoragePoolGetInfo、virStoragePoolGetName、virStoragePoolGetUUID等函數可以分別獲取存儲池的信息、名稱和 UUID 標識。virStoragePoolIsActive函數可以查詢存儲池是否處于使用中狀態。virStoragePoolFree 函數可以釋放存儲池相關的內存(但是不改變其在宿主機中的狀態),virStoragePoolDestroy 函數可以用于銷毀一個存儲池(但并沒有釋放virStoragePoolPtr 對象,之后還可以用virStoragePoolCreate 函數重新激活它),virStoragePoolDelete 函數可以物理刪除一個存儲池資源(該操作不可恢復)。
7、事件管理的API:以virEvent開頭的一系列函數。
libvirt 支持事件機制,使用該機制注冊之后,可以在發生特定的事件(如:域的啟動、暫停、恢復、停止等)之時,得到自己定義的一些通知。
8、數據流管理的API:以virStream開頭的一系列函數。
libvirt 還提供了一系列函數用于數據流的傳輸。
與Hypervisor建立連接:
要使用Libvirt API進行虛擬化管理,就必須先建立到Hypervisor的連接,因為有了連接才能管理節點,Hypervisor,域,網絡等虛擬化中的要素。
libvirt中連接的標識符URI,其本地URI和遠程URI有一些區別。
使用方式:
1、本地URI
在libvirt的客戶端使用本地的URI用于連接本地系統范圍內的Hypervisor,本地URI的一般格式如下driver[+transport]:///[path][?extral-param]
2、遠程URI
除了本地管理,libvirt還提供了非常方便的遠程的虛擬化管理功能,libvirt可以使用遠程URI來建立到網絡上的Hypervisor的連接,遠程URI和本地URI也是類似的,只是會增加用戶名,主機名,(或IP地址)和連接端口來連接到遠程的節點,遠程的UPI的一般格式如下drive[+transport]://[user@][host][:port]/[path][?extral-pparam]
3、使用URI建立到Hypervisor的連接
在某個節點啟動libvirtd后,一般在客戶端都可以通過ssh方式連接到該節點,而TLS和TCP等連接方式卻不一定都處于開啟可用狀態,如RHEL 6.3系統中的libvirtd服務在啟動時就沒有默認打開TLS和TCP這兩種連接方式,而在服務器端的libvirtd打開了TLS和TCP連接方式,也需要一些認證方面的配置,當然也可直接關閉認證功能,可以參考libvirtd,comf配置文件。
四、libvirt工具集介紹
libvirt安裝于配置:
libvirt 工具采用 XML 格式的文件描述一個虛擬機特征,包括虛擬機名稱、CPU、內存、磁盤、網卡等信息。用戶可以通過修改配置文件,對虛擬機進行管理。
StratoVirt 對接 libvirt 之前,需要先配置 XML 文件。本小節介紹 StratoVirt 對接 libvirt 時支持的 XML 配置項以及配置方式。
在介紹libvirt工具集之前我們需要在操作系統中安裝libvirt,這樣才能使用libvirt相關工具,普通用戶使用libvirt只需要安裝對應的Linux系統上的libvirt軟件包即可,不需要從源碼編譯安裝libvirt,但是一些高級用戶或者開發者,可能希望對libvirt有個更多的了解,甚至通過修改libvirt的源代碼實現自己的功能。
libvirtd的使用:
libvirt是一個作為libvirt虛擬化管理系統中的服務器端的守護進程,要讓某個節點能夠利用libvirt進行管理(無論是本地還是遠程管理),都需要在這個節點上運行linbvirtd這個守護進程,以便讓其他上層管理工具可以連接到該節點,libvirtd負責執行其他管理工具發送給它的虛擬化管理操作指令。而libvirt的客戶端工具(包括virsh,virt-manager等)可以連接到本地或遠程的libvirtd進程,以便管理節點上的客戶機(啟動、關閉、重啟、遷移),收集節點上的宿主機和客戶機的配置和資源使用狀態。
libvirtd是一個可執行程序,不僅可以使用“systemctl”命令調用它作為服務來運行,而且可以單獨地運行libvirtd命令來使用它。
libvirtd命令行的參數:
1)、-d或--daemon? ?表示讓libvirtd作為守護進程(daemon)在后臺運行。
2)、-f或--config FILE? ?指定libvirtd的配置文件為FILE,而不是使用默認值(通常是/etc/libvirt/libvirtd.conf).
3)、-l或--listen? 開啟配置文件中配置的TCP/IP連接。
4)、-p或--pid-file FILE? 將libvirtd進程的PID寫入到FILE文件中,而不是使用默認值。
5)、-t或--timeout SECONEDS? 設置對libvirtd連接的超時時間為SECONDS秒。
6)、-v或--verbose? 執行命令輸出詳細的輸出信息,特別是在運行出錯時,詳細的輸出信息便于用戶查找原因。
virsh:
libvirt項目的源代碼中包含了virsh這個虛擬化管理工具的代碼,virsh是用于管理虛擬化環境中的客戶機和Hypervisor的命令行工具,與virt-manager等工具類似,它也是通過調用libvirt API來實現虛擬化的管理,virsh是完全在命令行文本模式下運行的用戶態工具,它是系統管理員通過腳本程序實現虛擬化自動部署和管理的理想工具之一。
在使用virsh命令進行虛擬化管理操作時,可以使用兩個工作模式時,可以使用兩個工作模式:交互模式和非交互模式,交互模式,是連接到相應的Hypervisor上,然后輸入一個命令得到一個返回結構,直到用戶使用“quit”命令退出連接,是直接在命令行中一個建立連接的URI之后添加需要執行的一個或多個命令,執行完成后將命令的輸出結果返回到當前終端上,然后自動斷開連接。
五、實驗四實驗步驟
1、直接安裝帶圖形化界面的CentOS 7系統,通過VMware創建一臺虛擬機,勾選Lntel VT-x或AND-v CPU虛擬化。
?
?
?
?2、編寫XML配置文件,本次實驗的虛擬機配件如下。
3、創建虛擬機硬盤,然后將CentOS 7的鏡像上傳至系統內,放在xml文件說明的路徑內,否則胡報錯。
?4、創建虛擬機。
?
?5、通過Windows的VNC Vewer客戶端連接虛擬機的安裝操作界面,這里需要注意的是,需要更改Windows端的VNC Ciewer的顏色配選項,如果不配置對導致連接至虛擬機是閃退。
a、在VNC Vewer客戶端窗口,選擇“optinos……”----“expert”選項卡。
b、在“expert”選項卡中將Colorl evel的值設置成fgb222。
完成后單機“Connect”按鈕進入虛擬機的安裝界面。
安裝完成后,需要重新配置虛擬機,將虛擬機的開機啟動方式改為從硬盤啟動,如果不更改,之前的虛擬機XML配置文件中編寫的是從cdrom啟動,那么在重啟之后還會進入安裝界面,在此先關閉虛擬機,再重新編寫虛擬機。
virsh list
virsh undefine centos 7-1
新的XML配置文件主要是將centos7.xml中的啟動盤由cdrom改為hd,否則啟動虛擬機后依然會再次執行安裝操作系統給的過程,其他沒有改變。
重新創建虛擬機并進入:
virshdefine centos 7.xml
virsh list --all
virsh start centos 7-1
通過VNC Viewer連接至虛擬機。
總結
以上是生活随笔為你收集整理的libvirt虚拟化技术介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1204big.th index.php
- 下一篇: 可爱又可恨的梅花雪