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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java libvirt,libvirt介绍和使用

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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介绍和使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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