java libvirt,libvirt介绍和使用
導讀:
why&&what
libvirt具體介紹
API 剖析
driver 剖析
如何使用libvirt?
why&&what
實現一朵可運行、可運維的云,需要完整的實現三層:VIM層、VNFM層、NFVO層,其中實現對VNF的生命周期管理是VNFM層要實現核心功能。但要做到對VNF的控制管理談何容易,VIM層中提供的hypervisor技術多種多樣,包括kvm,vmware,xen等等,每種技術提供的驅動和API又都不盡相同。即使能夠做到單種技術的控制管理,還要實現不同hypervisor下VNF的遷移,困難可想而知。
而Libvirt正是為解決上述問題而生,通過在VIM層和VNFM層提供一個虛擬抽象層,提供統一API供上層調用,下層統一封裝不同虛擬機,從而方便地實現對虛擬機的管理。
Libvirt是管理虛擬機、存儲、網絡的一系列軟件集合。它包括了一個API庫、一個daemon程序(libvirtd)和一個命令行工具(virsh).主要目標是為各種虛擬化工具提供一套統一可靠的API,讓上層可以用一種單一的方式來管理多種不同的虛擬化技術。
libvirt具體介紹
Libvirt目前已被業界廣泛應用,應用場景包括各種命令行工具、GUI工具、持續集成、IaaS服務(如openstack)、web應用程序等等。支持多種語言包括C、Python、Perl、Java、Go等,大大便利了開發集成。支持多種虛擬化技術,包括KVM、QEMU、Xen、Virtuozzo、Vmware ESX、LXC等等。
主要提供的功能包括:
虛擬機生命周期管理:包括不同的領域生命周期操作,比如:啟動、停止、暫停、保存、恢復和遷移。支持多種設備類型的熱插拔操作,包括:磁盤、網卡、內存和CPU。
本地&&遠程訪問:通過在本地運行libvirt daemon,本機和遠程機器,都可以訪問并使用libvirt的功能。遠程一般通過簡單配置SSH即可。
存儲管理:除了虛擬機管理,任何運行了libvirt daemon的主機都可以用來管理不同類型的存儲:創建不同格式的文件鏡像(qcow2、vmdk、raw等)、掛接NFS共享、列出現有的LVM卷組、創建新的LVM卷組和邏輯卷、對未處理過的磁盤設備分區、掛接iSCSI共享等。
虛擬網絡管理:可以用來管理和創建虛擬網絡,管理物理和邏輯的網絡接口。
API 剖析
Libvirt提供的核心功能就是一套統一的API,所以有必要研究下API的實現。
libvirt的一個節點內部劃分如下,包括hypervisor和多個domains,每個domains表示一個客戶機實例:
libvirt 的邏輯術語
API被設計用來管控虛擬機的所有資源,從設計類的角度來看可劃分為5個大類:
5 objects of libvirt
virConnectPtr
代表和hypervisor進行連接,通常使用virConnectOpen系列的函數來實現和hypervisor的相連,一旦連接建立后,就可以管理該hypervisor內的各種資源如domains等。
virDomainPtr
代表一個active或者提前defined的domain。函數virConnectListAllDomains可以羅列一個hypervisor內的所有domians。
virNetworkPtr
代表一個actvie或者defiend的network。函數virConnectListAllNetworks可羅列一個hypervisor內的所有虛擬網絡。
virStoragePoolPtr
代表一個存儲池,是一個邏輯區域用來分配和存儲storage volume。
virStorageVolPtr
代表一個storage volume,可被用作一個塊設備提供給domain來使用。
大多數的object可被以多種方式索引到:
name
ID
UUID
對以上五大類,都提供了支持下述動作的API:
Lookup[...LookupBy...]
可被用來檢索查找某個object:
virDomainLookupByID
virDomainLookupByName
virDomainLookupByUUID
virDomainLookupByUUIDString
Enumeration[virconnectList..., virconnectNumOf...]
被用來遍歷特定hypervisor可訪問的對象集合:
virConnectListDomains
virConnectNumOfDomains
virConnectListNetworks
virConnectListStoragePools
Description[...GetInfo]
提供一個object的通用信息:
virNodeGetInfo
virDomainGetInfo
virStoragePoolGetInfo
virStorageVolGetInfo
Accessors[..Get...,...Set...]
被用來獲取或者修改指定的object:
virConnectGetType
virDomainGetMaxMemory
virDomainSetMemory
virDomainGetVcpus
virStoragePoolSetAutostart
virNetworkGetBridgeName
Creation[...Create,...CreateXml]
用來創建和啟動object:
virDomainCreate
virDomainCreateXML
virNetworkCreate
virNetworkCreateXML
Destruction[...Destroy]
用來關閉、deactivate、銷毀一個對象:
virDomainDestroy
virNetworkDestroy
virStoragePoolDestroy
driver 剖析
為了支持各種虛擬機監控程序的可擴展性,libvirt實現了一種基于驅動程序的架構,該架構允許用一種通用的API來管理不同的guest OS。下圖展示了API和相關驅動程序的層次結構:
架構圖
libvirt提供兩種不同的控制方式:
本地控制:daemon和管理程序在同一節點上。
遠程控制:daemon和管理程序不在同一個節點上,兩個節點的通信需要借助于RPC來實現。
如何使用Libvirt?
本文的hypervisor以kvm-qemu為例,關于kvm的配置可以參考這里。
1 定義虛擬配置文件
本例只是舉個簡單例子,可以通過xml文件定義域名,guest os的內存大小,虛擬存儲器個數,啟動的鏡像OS,網絡接口配置等。實際上libvirt支持的屬性更加多樣豐富,想具體了解的可以參考官網詳細介紹。
1
2 alice //域名
3 f5b8c05b-9c7a-3211-49b9-2bd635f7e2aa
4 1048576 //內存大小
5 1048576
6 2 //虛擬CPU個數
7
8 hvm
9
10
11
12
13
14
15 destroy
16 restart
17 destroy //供virsh使用
18
19 /usr/bin/kvm
20 //鏡像OS磁盤路徑
21
22
23
24
25
26 //鏡像OS路徑
27
28
29
30
31
32
33 //網絡配置
34
35
36
37
38
39
40
41 //圖形界面參數
42 // 串口配置
43
44
45
46
2 連接hypervisor
libvirt提供了三種連接方式:
conn = libvirt. open(name)
conn = libvirt.openAuth(uri, auth, flags)
conn = libvirt.openReadOnly(name)
關于每種的使用場景及方法,參考官網介紹即可。
舉例如下:
In [2]: conn = libvirt.open("qemu:///system")
In [3]: print conn
3 guest domain的生命周期管理
可以使用libvirt來對domain進行整個生命周期的管理。domain在整個生命周期內有以下幾個狀態:
狀態遷移圖
Undefined這是一個基本的狀態。任何沒有定義或者沒有建立的域的狀態。
Defined這是一個域已定義但是沒有運行的狀態。這種狀態也可以被描述為停止。
Running這是一個已經定義并運行在一個hypervisor上面的域的狀態。
Paused這個狀態是形容一個域系統從運行狀態轉換為暫停狀態。它的內存鏡像已經被暫時地存儲,它可以恢復到運行狀態
saved可以將一個域持久化,并再次打開使用。
比較重要的API包括:
#創建域
virDomainPtr virDomainCreateXML (virConnectPtr conn,
const char * xmlDesc,
unsigned int flags)//建立并立即引導啟動一個新的臨時性的domain
virDomainPtr virDomainCreateXMLWithFiles (virConnectPtr conn,
const char * xmlDesc,
unsigned int nfiles,
int * files,
unsigned int flags)
virDomainPtr virDomainDefineXML (virConnectPtr conn,
const char * xml)//建立一個持久性的域并存儲配置文件
virDomainPtr virDomainDefineXMLFlags (virConnectPtr conn,
const char * xml,
unsigned int flags)
//開啟、關閉域
int virDomainCreate (virDomainPtr domain)//從持久性配置中引導并啟動一個預先定義好的域
virDomainPtr virDomainCreateLinux (virConnectPtr conn,
const char * xmlDesc,
unsigned int flags)
int virDomainCreateWithFiles (virDomainPtr domain,
unsigned int nfiles,
int * files,
unsigned int flags)
int virDomainCreateWithFlags (virDomainPtr domain,
unsigned int flags)
int virDomainShutdown (virDomainPtr domain)
int virDomainShutdownFlags (virDomainPtr domain,
unsigned int flags)
#暫停\恢復\保存
int virDomainSuspend (virDomainPtr domain)
int virDomainResume (virDomainPtr domain)
int virDomainSave (virDomainPtr domain,
const char * to)
int virDomainRestore (virConnectPtr conn,
const char * from)
#銷毀域
int virDomainDestroy (virDomainPtr domain)
int virDomainDestroyFlags (virDomainPtr domain,
unsigned int flags)
int virDomainUndefine (virDomainPtr domain) //關閉并刪除持久性配置
int virDomainUndefineFlags (virDomainPtr domain,
unsigned int flags)
host信息獲取
virConnection對象提供了多種方法用來獲取虛擬主機的信息,包括hostname,max vCPU等等。
舉例如下:
In [5]: print conn.getHostname()
ubuntu
In [8]: print conn.getMaxVcpus(None)
16
In [9]: print conn.getInfo()
['x86_64', 3934L, 8, 3591, 1, 2, 4, 1]
In [13]: print conn.getCellsFreeMemory(0,1)
[312676352L]
In [14]: print conn.getType()
QEMU
In [15]: print conn.getURI()
qemu:///system
In [16]: print conn.isEncrypted()
0
In [17]: print conn.isAlive()
1
In [18]: print conn.isSecure()
1
In [19]: print conn.getCPUMap()
(8, [True, True, True, True, True, True, True, True], 8
In [21]: print conn.getCPUStats(0)
{'kernel': 109650000000L, 'idle': 265725600000000L, 'user': 150740000000L, 'iowait': 26750000000L}
當然libvirt提供的API不止包括如上介紹,本文只是將比較重要的部分羅列出來,如果想深入研究,請移步官網。
[參考資料]
總結
以上是生活随笔為你收集整理的java libvirt,libvirt介绍和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 默认网关、DNS、DHCP
- 下一篇: 百鸡百钱问题-从枚举到数学