KVM(五)libvirt 介紹
1. Libvirt 是什麼
為什麼需要Libvirt?
- Hypervisor 比如 qemu-kvm 的命令列虛擬機器管理工具引數眾多,難於使用。
- Hypervisor 種類眾多,沒有統一的程式設計介面來管理它們,這對雲環境來說非常重要。
- 沒有統一的方式來方便地定義虛擬機器相關的各種可管理物件。
Libvirt提供了什麼?
- 它提供統一、穩定、開放的原始碼的應用程式介面(API)、守護程序 (libvirtd)和和一個預設命令列管理工具(virsh)。
- 它提供了對虛擬化客戶機和它的虛擬化裝置、網路和儲存的管理。
- 它提供了一套較為穩定的C語言應用程式介面。目前,在其他一些流行的程式語言中也提供了對libvirt的繫結,在Python、Perl、Java、Ruby、PHP、OCaml等高階程式語言中已經有libvirt的程式庫可以直接使用。
- 它對多種不同的 Hypervisor 的支援是通過一種基於驅動程式的架構來實現的。libvirt 對不同的 Hypervisor 提供了不同的驅動,包括 Xen 的驅動,對QEMU/KVM 有 QEMU 驅動,VMware 驅動等。在 libvirt 原始碼中,可以很容易找到 qemu_driver.c、xen_driver.c、xenapi_driver.c、vmware_driver.c、vbox_driver.c 這樣的驅動程式原始碼檔案。
- 它作為中間適配層,讓底層 Hypervisor 對上層使用者空間的管理工具是可以做到完全透明的,因為 libvirt 遮蔽了底層各種 Hypervisor 的細節,為上層管理工具提供了一個統一的、較穩定的介面(API)。
- 它使用 XML 來定義各種虛擬機器相關的受管理物件。
目前,libvirt 已經成為使用最為廣泛的對各種虛擬機器進行管理的工具和應用程式介面(API),而且一些常用的虛擬機器管理工具(如virsh、virt-install、virt-manager等)和雲端計算框架平臺(如OpenStack、OpenNebula、Eucalyptus等)都在底層使用libvirt的應用程式介面。
1.1 Libvirt C API
1.1.1 Libvirti API 所管理的主要物件
物件 | 解釋 |
Domain (域) | 指執行在由Hypervisor提供的虛擬機器器上的一個作業系統例項(常常是指一個虛擬機器)或者用來啟動虛機的配置。 |
Hypervisor | 一個虛擬化主機的軟體層 |
Node (主機) | 一臺物理伺服器。 |
Storage pool (儲存池) | 一組儲存媒介的集合,比如物理硬碟驅動器。一個儲存池被劃分為小的容器稱作卷。卷會被分給一個或者多個虛機。 |
Volume (卷) | 一個從儲存池分配的儲存空間。一個卷會被分給一個或者多個域,常常成為域裡的虛擬硬碟。 |
1.1.2 物件的管理模型
物件名稱 | 物件 | Python 類 | 描述 |
Connect | 與 Hypervisor的連線 | virConnectPtr |
在呼叫任何 API 去管理一個本地或者遠端的Hypervisor前,必須建立和這個Hypervisor的連線。 |
Domain | Guest domain | virDomainPtr |
用於列舉和管理已有的虛機,或者建立新的虛機。唯一標識:ID,Name,UUID。一個域可能是暫時性的或者永續性的。暫時性的域只能在它執行期間被管理。永續性的域在主機上儲存了它的配置。 |
Virtual Network | 虛擬網路 | virNetworkPtr |
用於管理虛機的網路裝置。唯一標識:Name,UUID。一個虛擬網路可能是暫時性的或者永續性的。每個主機上安裝libvirt後,它都有一個預設的網路裝置“default”。它向該主機上執行的虛機提供DHCP服務,以及通過NAT連線到主機上。 |
Storage Pool | 儲存池 | virStoragePoolPtr |
用於管理虛擬機器內的所有儲存,包括 local disk, logical volume group, iSCSI target, FibreChannel HBA and local/network file system。唯一標識:Name,UUID。一個儲存池可能是暫時性的或者永續性的。Pool 的 type 可以是 dir, fs, netfs, disk, iscsi, logical, scsi,mpath, rbd, sheepdog, gluster 或者 zfs。 |
Storage Volume | 儲存卷 | virStorageVolPtr |
用於管理一個儲存池內的儲存塊,包括一個池內分配的塊、磁碟分割槽、邏輯卷、SCSI/iSCSI Lun,或者一個本地或者網路檔案系統內的檔案等。唯一標識:Name,Key,Path。 |
Host device | 主機裝置 | virNodeDevPtr |
用於管理主機上的物理硬體裝置,包括 the physical USB or PCI devices and logical devices these provide, such as a NIC, disk, disk controller, sound card, etc。唯一標識:Name。 |
1.1.3 API 的簡單分類
Libvirt API 就是對各種物件的各種操作,包括基本的增、刪、改、查操作和其它操作。
物件 | 增 | 刪 | 改 | 查 | 其它 |
Connect | virConnectOpen virConnectOpenAuth virConnectOpenReadOnly |
virConnectClose | virConnectSetKeepAlive | ||
Strorage pool | virStoragePoolBuild virStoragePoolCreate virStoragePoolCreateXML virStoragePoolDefineXML |
virStoragePoolDelete virStoragePoolDestroy virStoragePoolFree virStoragePoolUndefine |
virStoragePoolRefresh virStoragePoolSetAutostart |
virConnectFindStoragePoolSources virConnectListAllStoragePools virConnectListDefinedStoragePools virConnectListStoragePools virConnectNumOfDefinedStoragePools virConnectNumOfStoragePools virStoragePoolGetInfo/Name/UUID/UUIDString/XMLDesc virStoragePoolIsActive/Persistent virStoragePoolLookupByName/UUID/UUIDString/Volume virStoragePoolRef |
virStoragePoolGetAutostart virStoragePoolGetConnect virStoragePoolNumOfVolumes virStoragePoolListAllVolumes virStoragePoolListVolumes |
Storage volume | virStorageVolCreateXML virStorageVolCreateXMLFrom |
virStorageVolDelete virStorageVolFree |
virStorageVolResize virStorageVolUpload virStorageVolWipe virStorageVolWipePattern |
virStorageVolGetConnect/Info/Key/Name/Path/XMLDesc virStorageVolLookupByKey/Name/Path virStorageVolRef |
virStorageVolDownload |
Network | virNetworkCreate virNetworkCreateXML virNetworkDefineXML |
virNetworkDestroy virNetworkFree virNetworkUndefine |
virNetworkSetAutostart virNetworkUpdate |
virConnectListAllNetworks virConnectListDefinedNetworks virConnectListNetworks virConnectNumOfDefinedNetworks virConnectNumOfNetworks virNetworkGetBridgeName/DHCPLeases/Name/UUID/UUIDString/XMLDesc virNetworkIsActive/Persistent virNetworkLookupByName/UUID/UUIDString virNetworkGetAutostart virNetworkGetConnect |
virConnectNetworkEventDeregisterAny virConnectNetworkEventGenericCallback virNetworkDHCPLeaseFree |
Domain snapshot | virDomainSnapshotCreateXML | virDomainSnapshotDelete virDomainSnapshotFree |
virDomainRevertToSnapshot | virDomainHasCurrentSnapshot virDomainListAllSnapshots virDomainSnapshotCurrent virDomainSnapshotGetConnect/Domain/Name/Parent/XMLDesc virDomainSnapshotHasMetadata virDomainSnapshotIsCurrent virDomainSnapshotListAllChildren virDomainSnapshotListChildrenNames virDomainSnapshotListNames virDomainSnapshotLookupByName virDomainSnapshotNum virDomainSnapshotNumChildren virDomainSnapshotRef |
|
Host | virInitialize virNodeSetMemoryParameters virNodeSuspendForDuration |
virConnectBaselineCPU virConnectCompareCPU virConnectGetCPUModelNames/Capabilities/Hostname/LibVersion/MaxVcpus/Sysinfo/Type/URI/Version virConnectIsAlive virConnectIsEncrypted virConnectIsSecure virGetVersion virNodeGetCPUMap/CPUStats /CellsFreeMemory/FreeMemory/Info/MemoryParameters/MemoryStats / virNodeGetSecurityModel |
virTypedParamsAddBoolean virTypedParamsAddDouble virTypedParamsAddFromString virTypedParamsAddInt virTypedParamsAddLLong virTypedParamsAddString virTypedParamsAddUInt virTypedParamsAddULLong virTypedParamsClear virTypedParamsFree virTypedParamsGet |
||
Interface | virInterfaceCreate virInterfaceDefineXML |
virInterfaceDestroy virInterfaceFree virInterfaceUndefine |
virInterfaceChangeBegin virInterfaceChangeCommit virInterfaceChangeRollback |
virConnectListAllInterfaces virConnectListDefinedInterfaces virConnectListInterfaces virConnectNumOfDefinedInterfaces virConnectNumOfInterfaces virInterfaceGetConnect virInterfaceGetMACString virInterfaceGetName virInterfaceGetXMLDesc virInterfaceIsActive virInterfaceLookupByMACString virInterfaceLookupByName virInterfaceRef |
|
Net Filter | virNWFilterDefineXML | virNWFilterFree virNWFilterUndefine |
virConnectListAllNWFilters virConnectListNWFilters virConnectNumOfNWFilters virNWFilterGetName virNWFilterGetUUID virNWFilterGetUUIDString virNWFilterGetXMLDesc virNWFilterLookupByName virNWFilterLookupByUUID virNWFilterLookupByUUIDString virNWFilterRef |
||
Domain Event | virConnectDomainEventDeregister virConnectDomainEventDeregisterAny virConnectDomainEventDeviceAddedCallback virConnectDomainEventDeviceRemovedCallback |
virConnectDomainEventAgentLifecycleCallback virConnectDomainEventBalloonChangeCallback virConnectDomainEventBlockJobCallback virConnectDomainEventCallback virConnectDomainEventDiskChangeCallback virConnectDomainEventGenericCallback virConnectDomainEventGraphicsCallback virConnectDomainEventIOErrorCallback virConnectDomainEventIOErrorReasonCallback virConnectDomainEventPMSuspendCallback virConnectDomainEventPMSuspendDiskCallback |
|||
Domain | virDomainCreate virDomainCreateLinux virDomainCreateWithFiles virDomainCreateWithFlags virDomainCreateXML virDomainCreateXMLWithFiles virDomainDefineXML virDomainDefineXMLFlags |
virDomainDestroy virDomainDestroyFlags virDomainFree virDomainUndefine virDomainUndefineFlags virDomainUpdateDeviceFlags |
virDomainAbortJob virDomainAddIOThread virDomainDelIOThread virDomainAttachDevicevirDomainAttachDeviceFlags virDomainDetachDevice virDomainDetachDeviceFlags virDomainBlockCommit virDomainBlockCopy virDomainBlockJobAbort virDomainBlockJobSetSpeed virDomainBlockPeek virDomainBlockPull virDomainBlockRebase virDomainBlockResize virDomainCoreDump virDomainCoreDumpWithFormat virDomainFSFreeze virDomainFSInfoFree virDomainFSThaw virDomainFSTrim virDomainInjectNMI virDomainInterfaceFree virDomainManagedSave virDomainManagedSaveRemove virDomainMigrate virDomainMigrate2 virDomainMigrate3 virDomainMigrateSetCompressionCache virDomainMigrateSetMaxDowntime virDomainMigrateSetMaxSpeed virDomainMigrateToURI virDomainMigrateToURI2 virDomainMigrateToURI3 virDomainOpenChannel virDomainOpenConsole virDomainOpenGraphics virDomainOpenGraphicsFD virDomainPMSuspendForDuration virDomainPMWakeup virDomainReboot virDomainReset virDomainRestore virDomainRestoreFlags virDomainResume virDomainSave virDomainSaveFlags virDomainSaveImageDefineXML virDomainScreenshot virDomainSendKey virDomainSendProcessSignal virDomainShutdown virDomainSetBlkioParameters virDomainSetBlockIoTune virDomainSetInterfaceParameters virDomainSetMaxMemory virDomainSetMemory virDomainSetMemoryFlags virDomainSetMemoryParameters virDomainSetMemoryStatsPeriod virDomainSetMetadata virDomainSetNumaParameters virDomainSetSchedulerParameters virDomainSetSchedulerParametersFlags virDomainSetTime virDomainSetUserPassword virDomainSetVcpus virDomainSetVcpusFlags |
virConnectGetAllDomainStats virConnectGetDomainCapabilities virConnectListAllDomains virConnectListDefinedDomains virConnectListDomains virConnectNumOfDefinedDomains virConnectNumOfDomains virDomainBlockStats virDomainBlockStatsFlags virDomainGetAutostart virDomainGetBlkioParameters virDomainGetBlockInfo virDomainGetBlockIoTune virDomainGetBlockJobInfo virDomainGetCPUStats virDomainGetConnect virDomainGetControlInfo virDomainGetDiskErrors virDomainGetEmulatorPinInfo virDomainGetFSInfo virDomainGetHostname virDomainGetID virDomainGetIOThreadInfo virDomainGetInfo virDomainGetInterfaceParameters virDomainGetJobInfo virDomainGetJobStats virDomainGetMaxMemory virDomainGetMaxVcpus virDomainGetMemoryParameters virDomainGetMetadata virDomainGetName virDomainGetNumaParameters virDomainGetOSType virDomainGetSchedulerParameters virDomainGetSchedulerParametersFlags virDomainGetSchedulerType virDomainGetSecurityLabel virDomainGetSecurityLabelList virDomainGetState virDomainGetTime virDomainGetUUID virDomainGetUUIDString virDomainGetVcpuPinInfo virDomainGetVcpus virDomainGetVcpusFlags virDomainGetXMLDesc virDomainHasManagedSaveImage virDomainIOThreadInfoFree virDomainInterfaceAddresses virDomainInterfaceStats virDomainIsActive virDomainIsPersistent virDomainIsUpdated virDomainListGetStats virDomainLookupByID virDomainLookupByName virDomainLookupByUUID virDomainLookupByUUIDString virDomainMemoryPeek virDomainMemoryStats virDomainMigrateGetCompressionCache virDomainMigrateGetMaxSpeed virDomainPinEmulator ? virDomainPinIOThread virDomainPinVcpu virDomainPinVcpuFlags virDomainSaveImageGetXMLDesc virDomainStatsRecordListFree |
virConnectDomainXMLFromNative virConnectDomainXMLToNative |
Secret | virSecretDefineXML | virSecretFree virSecretUndefine |
virSecretSetValue | virConnectListAllSecrets virConnectListSecrets virConnectNumOfSecrets virSecretGetConnect/UUID/UUIDString/UsageID/UsageType/Value/XMLDesc virSecretLookupByUUID/UUIDString/Usage virSecretRef |
|
Stream | virStreamNew | virStreamFree | virStreamFinish virStreamAbort virStreamRecv virStreamRecvAll virStreamSend virStreamSendAll |
virStreamSinkFunc virStreamSourceFunc |
1.2 Libvirt XML 定義
Libvirt 使用 XML 來定義各種物件,其中,與 OpenStack Nova 關係比較密切的有:
disk (磁碟) | 任何磁碟裝置,包括軟盤(floppy)、硬碟(hard disk)、光碟機(cdrom)或者半虛擬化驅動都使用 元素來定義。 方式:
(1)”volume“ 型別的 disk
|
|
Host device assignment (主機裝置分配) |
|
|
Network interface (網絡卡) |
|
|
network (網路) | 1. bridge:定義一個用於構造該虛擬網路的網橋。 2. domain:定義 DHCP server 的 DNS domain。 3. forward: 定義虛擬網路直接連到物理 LAN 的方式. ”mode“指轉發模式。 (1) mode=‘nat’:所有連線到該虛擬網路的虛擬的網路都會經過物理機器的網絡卡,並轉換成物理網絡卡的地址。
也可以指定公共的IP地址和埠號。
(3) mode=‘bridge’:使用不受libvirt管理的bridge,比如主機上已有的bridge;open vswitch bridge;使用 macvtap's "bridge" 模式
(5) mode=‘hostdev’:直接分配主機上的網路裝置。
|
詳細的 XML 定義說明在 https://libvirt.org/format.html。
1.3 Libvirt API 的實現
libvirt API 的實現是在各個 Hypervisor driver 和 Storage dirver 內。Hypervisor 驅動包括:
- LXC - Linux Containers
- OpenVZ
- QEMU
- Test - Used for testing
- UML - User Mode Linux
- VirtualBox
- VMware ESX
- VMware Workstation/Player
- Xen
- Microsoft Hyper-V
- IBM PowerVM (phyp)
- Parallels
- Bhyve - The BSD Hypervisor
1.4 Libvirt 的 Python 繫結
python-libvirt 包含 Libvirt 的 Python 語言繫結。安裝 libvirt 時,預設會安裝 python-libvirt 。 來源: https://libvirt.org/python.html https://pypi.python.org/pypi/libvirt-python
Python API 和 C API 之間幾乎是一對一的對映關係,比如: